@chaos-overlords/storage 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +674 -0
  2. package/NOTICE +21 -0
  3. package/README.md +35 -0
  4. package/dist/node/index.d.ts +29 -0
  5. package/dist/node/index.d.ts.map +1 -0
  6. package/dist/node/index.js +60 -0
  7. package/dist/node/index.js.map +1 -0
  8. package/dist/postgres/index.d.ts +3 -0
  9. package/dist/postgres/index.d.ts.map +1 -0
  10. package/dist/postgres/index.js +3 -0
  11. package/dist/postgres/index.js.map +1 -0
  12. package/dist/postgres/repositories.d.ts +11 -0
  13. package/dist/postgres/repositories.d.ts.map +1 -0
  14. package/dist/postgres/repositories.js +396 -0
  15. package/dist/postgres/repositories.js.map +1 -0
  16. package/dist/postgres/schema.d.ts +1002 -0
  17. package/dist/postgres/schema.d.ts.map +1 -0
  18. package/dist/postgres/schema.js +103 -0
  19. package/dist/postgres/schema.js.map +1 -0
  20. package/dist/shared/constraints.d.ts +6 -0
  21. package/dist/shared/constraints.d.ts.map +1 -0
  22. package/dist/shared/constraints.js +49 -0
  23. package/dist/shared/constraints.js.map +1 -0
  24. package/dist/shared/mappers.d.ts +105 -0
  25. package/dist/shared/mappers.d.ts.map +1 -0
  26. package/dist/shared/mappers.js +55 -0
  27. package/dist/shared/mappers.js.map +1 -0
  28. package/dist/sqlite/index.d.ts +3 -0
  29. package/dist/sqlite/index.d.ts.map +1 -0
  30. package/dist/sqlite/index.js +3 -0
  31. package/dist/sqlite/index.js.map +1 -0
  32. package/dist/sqlite/repositories.d.ts +11 -0
  33. package/dist/sqlite/repositories.d.ts.map +1 -0
  34. package/dist/sqlite/repositories.js +392 -0
  35. package/dist/sqlite/repositories.js.map +1 -0
  36. package/dist/sqlite/schema.d.ts +1063 -0
  37. package/dist/sqlite/schema.d.ts.map +1 -0
  38. package/dist/sqlite/schema.js +103 -0
  39. package/dist/sqlite/schema.js.map +1 -0
  40. package/migrations/postgres/0000_glorious_zaladane.sql +94 -0
  41. package/migrations/postgres/meta/0000_snapshot.json +637 -0
  42. package/migrations/postgres/meta/_journal.json +13 -0
  43. package/migrations/sqlite/0000_exotic_warbird.sql +94 -0
  44. package/migrations/sqlite/meta/0000_snapshot.json +605 -0
  45. package/migrations/sqlite/meta/_journal.json +13 -0
  46. package/package.json +94 -0
@@ -0,0 +1,392 @@
1
+ import { and, asc, desc, eq, exists, inArray, isNotNull, isNull, lt, lte, ne, or, sql, } from 'drizzle-orm';
2
+ import { APPEND_ATTEMPTS, insertUnlessTaken, isUniqueViolation } from '../shared/constraints';
3
+ import { firstOrNull, toEvent, toMatch, toMatchInsert, toPlayer, toSnapshot, toTurn, toTurnOrders, toTurnReport, } from '../shared/mappers';
4
+ import * as schema from './schema';
5
+ export function createSqliteStorage(db) {
6
+ return {
7
+ matches: sqliteMatchRepository(db),
8
+ players: sqlitePlayerRepository(db),
9
+ turns: sqliteTurnRepository(db),
10
+ snapshots: sqliteSnapshotRepository(db),
11
+ events: sqliteEventRepository(db),
12
+ };
13
+ }
14
+ function sqliteMatchRepository(db) {
15
+ const { matches, players } = schema;
16
+ return {
17
+ async create(match) {
18
+ return insertUnlessTaken(() => db.insert(matches).values(toMatchInsert(match)));
19
+ },
20
+ async get(id) {
21
+ return firstOrNull((await db.select().from(matches).where(eq(matches.id, id))).map(toMatch));
22
+ },
23
+ async getByJoinCode(joinCode) {
24
+ return firstOrNull((await db.select().from(matches).where(eq(matches.joinCode, joinCode))).map(toMatch));
25
+ },
26
+ async listPublicLobbies(limit) {
27
+ const rows = await db
28
+ .select({
29
+ id: matches.id,
30
+ name: matches.name,
31
+ hostDisplayName: players.displayName,
32
+ playerCount: matches.seatCount,
33
+ maxPlayers: matches.maxPlayers,
34
+ passwordHash: matches.passwordHash,
35
+ createdAt: matches.createdAt,
36
+ })
37
+ .from(matches)
38
+ .innerJoin(players, eq(players.id, matches.hostPlayerId))
39
+ .where(and(eq(matches.status, 'lobby'), eq(matches.visibility, 'public')))
40
+ .orderBy(desc(matches.createdAt), asc(matches.id))
41
+ .limit(limit);
42
+ return rows.map(({ passwordHash, createdAt, ...rest }) => ({
43
+ ...rest,
44
+ passwordProtected: passwordHash !== null,
45
+ createdAt: createdAt.toISOString(),
46
+ }));
47
+ },
48
+ async claimSeat(matchId) {
49
+ const rows = await db
50
+ .update(matches)
51
+ .set({
52
+ seatCount: sql `${matches.seatCount} + 1`,
53
+ joinCounter: sql `${matches.joinCounter} + 1`,
54
+ })
55
+ .where(and(eq(matches.id, matchId), eq(matches.status, 'lobby'), sql `${matches.seatCount} < ${matches.maxPlayers}`))
56
+ .returning({ joinCounter: matches.joinCounter });
57
+ const row = rows[0];
58
+ return row ? row.joinCounter - 1 : null;
59
+ },
60
+ async releaseSeat(matchId) {
61
+ await db
62
+ .update(matches)
63
+ .set({ seatCount: sql `${matches.seatCount} - 1` })
64
+ .where(and(eq(matches.id, matchId), sql `${matches.seatCount} > 0`));
65
+ },
66
+ async deleteInactive(statuses, before, limit) {
67
+ const collectable = db
68
+ .select({ id: matches.id })
69
+ .from(matches)
70
+ .where(and(inArray(matches.status, [...statuses]), lt(matches.updatedAt, before)))
71
+ .limit(limit);
72
+ // Children cascade from the match row, so one delete takes the whole match with it.
73
+ const rows = await db
74
+ .delete(matches)
75
+ .where(inArray(matches.id, collectable))
76
+ .returning({ id: matches.id });
77
+ return rows.length;
78
+ },
79
+ async transition(matchId, from, patch) {
80
+ const rows = await db
81
+ .update(matches)
82
+ .set(patch)
83
+ .where(and(eq(matches.id, matchId), inArray(matches.status, [...from])))
84
+ .returning({ id: matches.id });
85
+ return rows.length === 1;
86
+ },
87
+ };
88
+ }
89
+ function sqlitePlayerRepository(db) {
90
+ const { matches, players } = schema;
91
+ return {
92
+ /**
93
+ * An insert fed by a select over the match row, so "the match is still in the lobby" is tested
94
+ * by the same statement that writes the player. The seat counter was claimed a moment earlier
95
+ * and the match may have started since; without this the player would land in a running match
96
+ * that had already seated its roster, holding a seat nobody can play.
97
+ *
98
+ * The select list is written out, which means it does NOT get Drizzle's column mapping: a
99
+ * column added to `players` later has to be added here too, in the storage form the column
100
+ * expects. The conformance suite compares a created player against its fixture field by field,
101
+ * so a dropped column fails there rather than going unnoticed.
102
+ */
103
+ async create(player) {
104
+ const rows = await db
105
+ .insert(players)
106
+ .select(db
107
+ .select({
108
+ id: sql `${player.id}`.as('id'),
109
+ matchId: sql `${player.matchId}`.as('match_id'),
110
+ slot: sql `${player.slot}`.as('slot'),
111
+ joinOrder: sql `${player.joinOrder}`.as('join_order'),
112
+ displayName: sql `${player.displayName}`.as('display_name'),
113
+ tokenHash: sql `${player.tokenHash}`.as('token_hash'),
114
+ status: sql `${player.status}`.as('status'),
115
+ joinedAt: sql `${player.joinedAt.getTime()}`.as('joined_at'),
116
+ })
117
+ .from(matches)
118
+ .where(and(eq(matches.id, player.matchId), eq(matches.status, 'lobby'))))
119
+ .returning({ id: players.id });
120
+ return rows.length === 1;
121
+ },
122
+ async get(id) {
123
+ return firstOrNull((await db.select().from(players).where(eq(players.id, id))).map(toPlayer));
124
+ },
125
+ async getByTokenHash(tokenHash) {
126
+ return firstOrNull((await db.select().from(players).where(eq(players.tokenHash, tokenHash))).map(toPlayer));
127
+ },
128
+ async listByMatch(matchId) {
129
+ const rows = await db
130
+ .select()
131
+ .from(players)
132
+ .where(eq(players.matchId, matchId))
133
+ .orderBy(asc(players.slot), asc(players.joinOrder), asc(players.id));
134
+ return rows.map(toPlayer);
135
+ },
136
+ async setStatus(playerId, status) {
137
+ await db.update(players).set({ status }).where(eq(players.id, playerId));
138
+ },
139
+ async transitionStatus(playerId, from, status) {
140
+ const rows = await db
141
+ .update(players)
142
+ .set({ status })
143
+ .where(and(eq(players.id, playerId), inArray(players.status, from)))
144
+ .returning({ id: players.id });
145
+ return rows.length === 1;
146
+ },
147
+ async revokeToken(playerId) {
148
+ await db.update(players).set({ tokenHash: null }).where(eq(players.id, playerId));
149
+ },
150
+ async assignSlots(assignments) {
151
+ if (assignments.length === 0)
152
+ return;
153
+ // One statement: a CASE that maps each id to its slot. A loop of updates could commit some
154
+ // seats and not others, and the transition that made the roster final has already landed.
155
+ const cases = assignments.map(({ playerId, slot }) => sql `when ${players.id} = ${playerId} then ${slot}`);
156
+ await db
157
+ .update(players)
158
+ .set({ slot: sql `case ${sql.join(cases, sql ` `)} else ${players.slot} end` })
159
+ .where(inArray(players.id, assignments.map(({ playerId }) => playerId)));
160
+ },
161
+ async delete(playerId) {
162
+ await db.delete(players).where(eq(players.id, playerId));
163
+ },
164
+ };
165
+ }
166
+ function sqliteTurnRepository(db) {
167
+ const { matches, turns, turnOrders, turnReports } = schema;
168
+ return {
169
+ async open(turn, playerIds) {
170
+ const created = await insertUnlessTaken(() => db.insert(turns).values(turn));
171
+ if (playerIds.length > 0) {
172
+ // Topped up rather than assumed: a re-run of the open step (a repaired seal) fills any row
173
+ // an interrupted one never wrote, and a player who already has a row keeps it untouched.
174
+ await db
175
+ .insert(turnOrders)
176
+ .values(playerIds.map((playerId) => ({ matchId: turn.matchId, turn: turn.number, playerId })))
177
+ .onConflictDoNothing();
178
+ }
179
+ return created;
180
+ },
181
+ async get(matchId, number) {
182
+ const rows = await db
183
+ .select()
184
+ .from(turns)
185
+ .where(and(eq(turns.matchId, matchId), eq(turns.number, number)));
186
+ return firstOrNull(rows.map(toTurn));
187
+ },
188
+ async submitOrders(matchId, number, playerId, submission) {
189
+ const turnIsOpen = exists(db
190
+ .select({ one: sql `1` })
191
+ .from(turns)
192
+ .where(and(eq(turns.matchId, matchId), eq(turns.number, number), eq(turns.status, 'open'))));
193
+ const rows = await db
194
+ .update(turnOrders)
195
+ .set(submission)
196
+ .where(and(eq(turnOrders.matchId, matchId), eq(turnOrders.turn, number), eq(turnOrders.playerId, playerId), turnIsOpen))
197
+ .returning({ playerId: turnOrders.playerId });
198
+ return rows.length === 1;
199
+ },
200
+ async getOrders(matchId, number, playerId) {
201
+ const rows = await db
202
+ .select()
203
+ .from(turnOrders)
204
+ .where(and(eq(turnOrders.matchId, matchId), eq(turnOrders.turn, number), eq(turnOrders.playerId, playerId)));
205
+ return firstOrNull(rows.map(toTurnOrders));
206
+ },
207
+ async listOrders(matchId, number) {
208
+ const rows = await db
209
+ .select()
210
+ .from(turnOrders)
211
+ .where(and(eq(turnOrders.matchId, matchId), eq(turnOrders.turn, number)))
212
+ .orderBy(asc(turnOrders.playerId));
213
+ return rows.map(toTurnOrders);
214
+ },
215
+ async transition(matchId, number, from, patch) {
216
+ const rows = await db
217
+ .update(turns)
218
+ .set(patch)
219
+ .where(and(eq(turns.matchId, matchId), eq(turns.number, number), inArray(turns.status, [...from])))
220
+ .returning({ number: turns.number });
221
+ return rows.length === 1;
222
+ },
223
+ async rescheduleDeadline(matchId, number, deadlineAt) {
224
+ const rows = await db
225
+ .update(turns)
226
+ .set({ deadlineAt })
227
+ .where(and(eq(turns.matchId, matchId), eq(turns.number, number), eq(turns.status, 'open')))
228
+ .returning({ number: turns.number });
229
+ return rows.length === 1;
230
+ },
231
+ async upsertReport(report) {
232
+ await db
233
+ .insert(turnReports)
234
+ .values(report)
235
+ .onConflictDoUpdate({
236
+ target: [turnReports.matchId, turnReports.turn, turnReports.playerId],
237
+ set: {
238
+ stateHash: report.stateHash,
239
+ finished: report.finished,
240
+ reportedAt: report.reportedAt,
241
+ },
242
+ });
243
+ },
244
+ async listReports(matchId, number) {
245
+ const rows = await db
246
+ .select()
247
+ .from(turnReports)
248
+ .where(and(eq(turnReports.matchId, matchId), eq(turnReports.turn, number)))
249
+ .orderBy(asc(turnReports.playerId));
250
+ return rows.map(toTurnReport);
251
+ },
252
+ async listUnsettled(matchId) {
253
+ const rows = await db
254
+ .select()
255
+ .from(turns)
256
+ .where(and(eq(turns.matchId, matchId), inArray(turns.status, ['sealed', 'desynced'])))
257
+ .orderBy(asc(turns.number));
258
+ return rows.map(toTurn);
259
+ },
260
+ async listExpiredOpen(now, limit) {
261
+ return db
262
+ .select({ matchId: turns.matchId, number: turns.number })
263
+ .from(turns)
264
+ .where(and(eq(turns.status, 'open'), isNotNull(turns.deadlineAt), lte(turns.deadlineAt, now)))
265
+ .orderBy(asc(turns.deadlineAt))
266
+ .limit(limit);
267
+ },
268
+ /**
269
+ * Driven from `matches`, not from `turns`: a match whose current turn has no row at all (a
270
+ * `start` that died before opening turn 1) is as stalled as one whose seal stopped halfway,
271
+ * and an inner join would never see it. The repair opens the successor in both cases.
272
+ */
273
+ async listStalledSeals(limit) {
274
+ return db
275
+ .select({ matchId: matches.id, number: matches.currentTurn })
276
+ .from(matches)
277
+ .leftJoin(turns, and(eq(turns.matchId, matches.id), eq(turns.number, matches.currentTurn)))
278
+ .where(and(inArray(matches.status, ['running', 'desynced']), or(isNull(turns.status), ne(turns.status, 'open'))))
279
+ .orderBy(asc(matches.id))
280
+ .limit(limit);
281
+ },
282
+ };
283
+ }
284
+ function sqliteSnapshotRepository(db) {
285
+ const { snapshots } = schema;
286
+ return {
287
+ async put(snapshot) {
288
+ await db
289
+ .insert(snapshots)
290
+ .values(snapshot)
291
+ .onConflictDoUpdate({
292
+ target: [snapshots.matchId, snapshots.turn],
293
+ set: {
294
+ formatVersion: snapshot.formatVersion,
295
+ stateHash: snapshot.stateHash,
296
+ uploadedByPlayerId: snapshot.uploadedByPlayerId,
297
+ uploadedAt: snapshot.uploadedAt,
298
+ body: snapshot.body,
299
+ },
300
+ });
301
+ },
302
+ async get(matchId, turn) {
303
+ const rows = await db
304
+ .select()
305
+ .from(snapshots)
306
+ .where(and(eq(snapshots.matchId, matchId), eq(snapshots.turn, turn)));
307
+ return firstOrNull(rows.map(toSnapshot));
308
+ },
309
+ async getLatest(matchId) {
310
+ const rows = await db
311
+ .select()
312
+ .from(snapshots)
313
+ .where(eq(snapshots.matchId, matchId))
314
+ .orderBy(desc(snapshots.turn))
315
+ .limit(1);
316
+ return firstOrNull(rows.map(toSnapshot));
317
+ },
318
+ async prune(matchId, keep) {
319
+ // The turns to keep are the newest `keep`; everything strictly below the oldest of them goes.
320
+ const kept = await db
321
+ .select({ turn: snapshots.turn })
322
+ .from(snapshots)
323
+ .where(eq(snapshots.matchId, matchId))
324
+ .orderBy(desc(snapshots.turn))
325
+ .limit(keep);
326
+ const oldestKept = kept.at(-1)?.turn;
327
+ if (oldestKept === undefined || kept.length < keep)
328
+ return 0;
329
+ const rows = await db
330
+ .delete(snapshots)
331
+ .where(and(eq(snapshots.matchId, matchId), lt(snapshots.turn, oldestKept)))
332
+ .returning({ turn: snapshots.turn });
333
+ return rows.length;
334
+ },
335
+ };
336
+ }
337
+ function sqliteEventRepository(db) {
338
+ const { matchEvents } = schema;
339
+ return {
340
+ /**
341
+ * The sequence number comes from the log itself inside the insert, so the allocation cannot be
342
+ * separated from the write: a committed `seq` therefore implies every lower one is committed,
343
+ * which is the invariant a stream cursor relies on. Concurrent appends collide on the primary
344
+ * key and the loser simply re-reads the maximum.
345
+ */
346
+ async append(event) {
347
+ const nextSeq = sql `(select coalesce(max(${matchEvents.seq}), 0) + 1 from ${matchEvents} where ${eq(matchEvents.matchId, event.matchId)})`;
348
+ for (let attempt = 1; attempt <= APPEND_ATTEMPTS; attempt += 1) {
349
+ try {
350
+ const rows = await db
351
+ .insert(matchEvents)
352
+ .values({
353
+ matchId: event.matchId,
354
+ seq: nextSeq,
355
+ type: event.type,
356
+ payload: event.payload,
357
+ createdAt: new Date(event.createdAt),
358
+ })
359
+ .returning({ seq: matchEvents.seq });
360
+ const row = rows[0];
361
+ if (!row)
362
+ throw new Error(`append to ${event.matchId} reported no row`);
363
+ return { ...event, seq: row.seq };
364
+ }
365
+ catch (error) {
366
+ if (!isUniqueViolation(error) || attempt === APPEND_ATTEMPTS)
367
+ throw error;
368
+ }
369
+ }
370
+ throw new Error(`could not append an event for ${event.matchId}`);
371
+ },
372
+ async listAfter(matchId, afterSeq, limit) {
373
+ const rows = await db
374
+ .select()
375
+ .from(matchEvents)
376
+ .where(and(eq(matchEvents.matchId, matchId), sql `${matchEvents.seq} > ${afterSeq}`))
377
+ .orderBy(asc(matchEvents.seq))
378
+ .limit(limit);
379
+ return rows.map(toEvent);
380
+ },
381
+ async lastSeq(matchId) {
382
+ const rows = await db
383
+ .select({ seq: matchEvents.seq })
384
+ .from(matchEvents)
385
+ .where(eq(matchEvents.matchId, matchId))
386
+ .orderBy(desc(matchEvents.seq))
387
+ .limit(1);
388
+ return rows[0]?.seq ?? 0;
389
+ },
390
+ };
391
+ }
392
+ //# sourceMappingURL=repositories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositories.js","sourceRoot":"","sources":["../../src/sqlite/repositories.ts"],"names":[],"mappings":"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"}