@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.
- package/LICENSE +674 -0
- package/NOTICE +21 -0
- package/README.md +35 -0
- package/dist/node/index.d.ts +29 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +60 -0
- package/dist/node/index.js.map +1 -0
- package/dist/postgres/index.d.ts +3 -0
- package/dist/postgres/index.d.ts.map +1 -0
- package/dist/postgres/index.js +3 -0
- package/dist/postgres/index.js.map +1 -0
- package/dist/postgres/repositories.d.ts +11 -0
- package/dist/postgres/repositories.d.ts.map +1 -0
- package/dist/postgres/repositories.js +396 -0
- package/dist/postgres/repositories.js.map +1 -0
- package/dist/postgres/schema.d.ts +1002 -0
- package/dist/postgres/schema.d.ts.map +1 -0
- package/dist/postgres/schema.js +103 -0
- package/dist/postgres/schema.js.map +1 -0
- package/dist/shared/constraints.d.ts +6 -0
- package/dist/shared/constraints.d.ts.map +1 -0
- package/dist/shared/constraints.js +49 -0
- package/dist/shared/constraints.js.map +1 -0
- package/dist/shared/mappers.d.ts +105 -0
- package/dist/shared/mappers.d.ts.map +1 -0
- package/dist/shared/mappers.js +55 -0
- package/dist/shared/mappers.js.map +1 -0
- package/dist/sqlite/index.d.ts +3 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +3 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/repositories.d.ts +11 -0
- package/dist/sqlite/repositories.d.ts.map +1 -0
- package/dist/sqlite/repositories.js +392 -0
- package/dist/sqlite/repositories.js.map +1 -0
- package/dist/sqlite/schema.d.ts +1063 -0
- package/dist/sqlite/schema.d.ts.map +1 -0
- package/dist/sqlite/schema.js +103 -0
- package/dist/sqlite/schema.js.map +1 -0
- package/migrations/postgres/0000_glorious_zaladane.sql +94 -0
- package/migrations/postgres/meta/0000_snapshot.json +637 -0
- package/migrations/postgres/meta/_journal.json +13 -0
- package/migrations/sqlite/0000_exotic_warbird.sql +94 -0
- package/migrations/sqlite/meta/0000_snapshot.json +605 -0
- package/migrations/sqlite/meta/_journal.json +13 -0
- 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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"}
|