| 16 | const rooms = new Map<string, TLSocketRoom<any, void>>() |
| 17 | |
| 18 | export function makeOrLoadRoom(roomId: string): TLSocketRoom<any, void> { |
| 19 | roomId = sanitizeRoomId(roomId) |
| 20 | |
| 21 | const existing = rooms.get(roomId) |
| 22 | if (existing && !existing.isClosed()) { |
| 23 | return existing |
| 24 | } |
| 25 | |
| 26 | console.log('loading room', roomId) |
| 27 | |
| 28 | // Open the database - file is created if it doesn't exist |
| 29 | const db = new Database(join(DIR, `${roomId}.db`)) |
| 30 | const sql = new NodeSqliteWrapper(db) |
| 31 | const storage = new SQLiteSyncStorage({ sql }) |
| 32 | |
| 33 | const room = new TLSocketRoom({ |
| 34 | storage, |
| 35 | onSessionRemoved(room, args) { |
| 36 | console.log('client disconnected', args.sessionId, roomId) |
| 37 | if (args.numSessionsRemaining === 0) { |
| 38 | console.log('closing room', roomId) |
| 39 | room.close() |
| 40 | db.close() |
| 41 | rooms.delete(roomId) |
| 42 | } |
| 43 | }, |
| 44 | }) |
| 45 | |
| 46 | rooms.set(roomId, room) |
| 47 | return room |
| 48 | } |