@chaos-overlords/storage 0.8.1 → 0.8.2
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/dist/node/index.d.ts +11 -3
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +26 -7
- package/dist/node/index.js.map +1 -1
- package/dist/postgres/database.d.ts +10 -0
- package/dist/postgres/database.d.ts.map +1 -0
- package/dist/postgres/database.js +2 -0
- package/dist/postgres/database.js.map +1 -0
- package/dist/postgres/events.d.ts +9 -0
- package/dist/postgres/events.d.ts.map +1 -0
- package/dist/postgres/events.js +66 -0
- package/dist/postgres/events.js.map +1 -0
- package/dist/postgres/repositories.d.ts +2 -3
- package/dist/postgres/repositories.d.ts.map +1 -1
- package/dist/postgres/repositories.js +151 -183
- package/dist/postgres/repositories.js.map +1 -1
- package/dist/postgres/schema.d.ts +26 -9
- package/dist/postgres/schema.d.ts.map +1 -1
- package/dist/postgres/schema.js +6 -0
- package/dist/postgres/schema.js.map +1 -1
- package/dist/postgres/takeovers.d.ts +12 -0
- package/dist/postgres/takeovers.d.ts.map +1 -0
- package/dist/postgres/takeovers.js +88 -0
- package/dist/postgres/takeovers.js.map +1 -0
- package/dist/shared/constraints.d.ts +10 -0
- package/dist/shared/constraints.d.ts.map +1 -1
- package/dist/shared/constraints.js +13 -0
- package/dist/shared/constraints.js.map +1 -1
- package/dist/shared/mappers.d.ts +28 -5
- package/dist/shared/mappers.d.ts.map +1 -1
- package/dist/shared/mappers.js +31 -0
- package/dist/shared/mappers.js.map +1 -1
- package/dist/sqlite/database.d.ts +12 -0
- package/dist/sqlite/database.d.ts.map +1 -0
- package/dist/sqlite/database.js +2 -0
- package/dist/sqlite/database.js.map +1 -0
- package/dist/sqlite/events.d.ts +9 -0
- package/dist/sqlite/events.d.ts.map +1 -0
- package/dist/sqlite/events.js +66 -0
- package/dist/sqlite/events.js.map +1 -0
- package/dist/sqlite/repositories.d.ts +2 -8
- package/dist/sqlite/repositories.d.ts.map +1 -1
- package/dist/sqlite/repositories.js +177 -183
- package/dist/sqlite/repositories.js.map +1 -1
- package/dist/sqlite/schema.d.ts +26 -9
- package/dist/sqlite/schema.d.ts.map +1 -1
- package/dist/sqlite/schema.js +6 -0
- package/dist/sqlite/schema.js.map +1 -1
- package/dist/sqlite/takeovers.d.ts +12 -0
- package/dist/sqlite/takeovers.d.ts.map +1 -0
- package/dist/sqlite/takeovers.js +88 -0
- package/dist/sqlite/takeovers.js.map +1 -0
- package/migrations/postgres/0005_old_husk.sql +6 -0
- package/migrations/postgres/meta/0005_snapshot.json +854 -0
- package/migrations/postgres/meta/_journal.json +8 -1
- package/migrations/sqlite/0005_lumpy_stingray.sql +6 -0
- package/migrations/sqlite/meta/0005_snapshot.json +844 -0
- package/migrations/sqlite/meta/_journal.json +8 -1
- package/package.json +7 -7
|
@@ -292,7 +292,7 @@ export declare const matches: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
|
292
292
|
generated: undefined;
|
|
293
293
|
}, {}, {}>;
|
|
294
294
|
};
|
|
295
|
-
dialect:
|
|
295
|
+
dialect: 'pg';
|
|
296
296
|
}>;
|
|
297
297
|
export declare const players: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
298
298
|
name: "players";
|
|
@@ -452,7 +452,7 @@ export declare const players: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
|
452
452
|
generated: undefined;
|
|
453
453
|
}, {}, {}>;
|
|
454
454
|
};
|
|
455
|
-
dialect:
|
|
455
|
+
dialect: 'pg';
|
|
456
456
|
}>;
|
|
457
457
|
export declare const turns: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
458
458
|
name: "turns";
|
|
@@ -611,8 +611,25 @@ export declare const turns: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
|
611
611
|
identity: undefined;
|
|
612
612
|
generated: undefined;
|
|
613
613
|
}, {}, {}>;
|
|
614
|
+
desyncedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
615
|
+
name: string;
|
|
616
|
+
tableName: "turns";
|
|
617
|
+
dataType: "date";
|
|
618
|
+
columnType: "PgTimestamp";
|
|
619
|
+
data: Date;
|
|
620
|
+
driverParam: string;
|
|
621
|
+
notNull: false;
|
|
622
|
+
hasDefault: false;
|
|
623
|
+
isPrimaryKey: false;
|
|
624
|
+
isAutoincrement: false;
|
|
625
|
+
hasRuntimeDefault: false;
|
|
626
|
+
enumValues: undefined;
|
|
627
|
+
baseColumn: never;
|
|
628
|
+
identity: undefined;
|
|
629
|
+
generated: undefined;
|
|
630
|
+
}, {}, {}>;
|
|
614
631
|
};
|
|
615
|
-
dialect:
|
|
632
|
+
dialect: 'pg';
|
|
616
633
|
}>;
|
|
617
634
|
export declare const turnOrders: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
618
635
|
name: "turn_orders";
|
|
@@ -738,7 +755,7 @@ export declare const turnOrders: import("drizzle-orm/pg-core").PgTableWithColumn
|
|
|
738
755
|
generated: undefined;
|
|
739
756
|
}, {}, {}>;
|
|
740
757
|
};
|
|
741
|
-
dialect:
|
|
758
|
+
dialect: 'pg';
|
|
742
759
|
}>;
|
|
743
760
|
export declare const turnReports: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
744
761
|
name: "turn_reports";
|
|
@@ -847,7 +864,7 @@ export declare const turnReports: import("drizzle-orm/pg-core").PgTableWithColum
|
|
|
847
864
|
generated: undefined;
|
|
848
865
|
}, {}, {}>;
|
|
849
866
|
};
|
|
850
|
-
dialect:
|
|
867
|
+
dialect: 'pg';
|
|
851
868
|
}>;
|
|
852
869
|
export declare const snapshots: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
853
870
|
name: "snapshots";
|
|
@@ -1007,7 +1024,7 @@ export declare const snapshots: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
1007
1024
|
generated: undefined;
|
|
1008
1025
|
}, {}, {}>;
|
|
1009
1026
|
};
|
|
1010
|
-
dialect:
|
|
1027
|
+
dialect: 'pg';
|
|
1011
1028
|
}>;
|
|
1012
1029
|
export declare const matchEvents: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
1013
1030
|
name: "match_events";
|
|
@@ -1099,7 +1116,7 @@ export declare const matchEvents: import("drizzle-orm/pg-core").PgTableWithColum
|
|
|
1099
1116
|
generated: undefined;
|
|
1100
1117
|
}, {}, {}>;
|
|
1101
1118
|
};
|
|
1102
|
-
dialect:
|
|
1119
|
+
dialect: 'pg';
|
|
1103
1120
|
}>;
|
|
1104
1121
|
/** See the SQLite schema: one row per open absence prompt of a match. */
|
|
1105
1122
|
export declare const takeoverPrompts: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
@@ -1175,7 +1192,7 @@ export declare const takeoverPrompts: import("drizzle-orm/pg-core").PgTableWithC
|
|
|
1175
1192
|
generated: undefined;
|
|
1176
1193
|
}, {}, {}>;
|
|
1177
1194
|
};
|
|
1178
|
-
dialect:
|
|
1195
|
+
dialect: 'pg';
|
|
1179
1196
|
}>;
|
|
1180
1197
|
/** The latest choice of each voter on an open prompt; discarded with the prompt. */
|
|
1181
1198
|
export declare const takeoverVotes: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
@@ -1268,6 +1285,6 @@ export declare const takeoverVotes: import("drizzle-orm/pg-core").PgTableWithCol
|
|
|
1268
1285
|
generated: undefined;
|
|
1269
1286
|
}, {}, {}>;
|
|
1270
1287
|
};
|
|
1271
|
-
dialect:
|
|
1288
|
+
dialect: 'pg';
|
|
1272
1289
|
}>;
|
|
1273
1290
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/postgres/schema.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCnB,CAAA;AAED,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBnB,CAAA;AAED,eAAO,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/postgres/schema.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCnB,CAAA;AAED,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBnB,CAAA;AAED,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BjB,CAAA;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EActB,CAAA;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAavB,CAAA;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBrB,CAAA;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYvB,CAAA;AAED,yEAAyE;AACzE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW3B,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYzB,CAAA"}
|
package/dist/postgres/schema.js
CHANGED
|
@@ -61,6 +61,12 @@ export const turns = pgTable('turns', {
|
|
|
61
61
|
sealedSlots: jsonb('sealed_slots'),
|
|
62
62
|
/** The state hash the verdict confirmed the turn on; null until a verdict does. */
|
|
63
63
|
stateHash: text('state_hash'),
|
|
64
|
+
/**
|
|
65
|
+
* When the verdict announced this turn's divergence, stamped by the compare-and-swap that
|
|
66
|
+
* claims the announcement. It is what makes `turn.desynced` a publish-once event without
|
|
67
|
+
* scanning the log for one, the same way `order_set_hash` does for `turn.sealed`.
|
|
68
|
+
*/
|
|
69
|
+
desyncedAt: stamp('desynced_at'),
|
|
64
70
|
}, (table) => [
|
|
65
71
|
primaryKey({ columns: [table.matchId, table.number] }),
|
|
66
72
|
index('turns_deadline_idx').on(table.status, table.deadlineAt),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/postgres/schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/postgres/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TakeoverRepository } from '@chaos-overlords/kernel';
|
|
2
|
+
import type { PostgresDatabase } from './database';
|
|
3
|
+
/**
|
|
4
|
+
* Absence prompts and their votes in the Postgres dialect.
|
|
5
|
+
*
|
|
6
|
+
* Its own module because it is a self-contained pair of tables with no overlap with the turn
|
|
7
|
+
* barrier: the kernel asks it two questions (is any prompt open, what has each voter chosen) and
|
|
8
|
+
* both are one indexed read, which is the whole point of keeping prompts as durable state instead
|
|
9
|
+
* of replaying them out of the event log.
|
|
10
|
+
*/
|
|
11
|
+
export declare function postgresTakeoverRepository(db: PostgresDatabase): TakeoverRepository;
|
|
12
|
+
//# sourceMappingURL=takeovers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"takeovers.d.ts","sourceRoot":"","sources":["../../src/postgres/takeovers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAGjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGlD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,gBAAgB,GAAG,kBAAkB,CAoFnF"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { and, asc, eq, sql } from 'drizzle-orm';
|
|
2
|
+
import { toTakeoverVote } from '../shared/mappers';
|
|
3
|
+
import * as schema from './schema';
|
|
4
|
+
/**
|
|
5
|
+
* Absence prompts and their votes in the Postgres dialect.
|
|
6
|
+
*
|
|
7
|
+
* Its own module because it is a self-contained pair of tables with no overlap with the turn
|
|
8
|
+
* barrier: the kernel asks it two questions (is any prompt open, what has each voter chosen) and
|
|
9
|
+
* both are one indexed read, which is the whole point of keeping prompts as durable state instead
|
|
10
|
+
* of replaying them out of the event log.
|
|
11
|
+
*/
|
|
12
|
+
export function postgresTakeoverRepository(db) {
|
|
13
|
+
const { takeoverPrompts, takeoverVotes } = schema;
|
|
14
|
+
return {
|
|
15
|
+
async openPrompt(matchId, playerId, turn, openedAt) {
|
|
16
|
+
const rows = await db
|
|
17
|
+
.insert(takeoverPrompts)
|
|
18
|
+
.values({ matchId, playerId, turn, openedAt })
|
|
19
|
+
.onConflictDoNothing()
|
|
20
|
+
.returning({ playerId: takeoverPrompts.playerId });
|
|
21
|
+
return rows.length === 1;
|
|
22
|
+
},
|
|
23
|
+
async closePrompt(matchId, playerId) {
|
|
24
|
+
// Votes first: a death between the two leaves an open prompt with no votes, which is the
|
|
25
|
+
// safe state, rather than votes that a later prompt for the same seat would inherit.
|
|
26
|
+
await db
|
|
27
|
+
.delete(takeoverVotes)
|
|
28
|
+
.where(and(eq(takeoverVotes.matchId, matchId), eq(takeoverVotes.targetPlayerId, playerId)));
|
|
29
|
+
await db
|
|
30
|
+
.delete(takeoverPrompts)
|
|
31
|
+
.where(and(eq(takeoverPrompts.matchId, matchId), eq(takeoverPrompts.playerId, playerId)));
|
|
32
|
+
},
|
|
33
|
+
async hasOpenPrompts(matchId) {
|
|
34
|
+
const rows = await db
|
|
35
|
+
.select({ playerId: takeoverPrompts.playerId })
|
|
36
|
+
.from(takeoverPrompts)
|
|
37
|
+
.where(eq(takeoverPrompts.matchId, matchId))
|
|
38
|
+
.limit(1);
|
|
39
|
+
return rows.length > 0;
|
|
40
|
+
},
|
|
41
|
+
async listOpenPrompts(matchId) {
|
|
42
|
+
const rows = await db
|
|
43
|
+
.select({ playerId: takeoverPrompts.playerId })
|
|
44
|
+
.from(takeoverPrompts)
|
|
45
|
+
.where(eq(takeoverPrompts.matchId, matchId))
|
|
46
|
+
.orderBy(asc(takeoverPrompts.playerId));
|
|
47
|
+
return rows.map((row) => row.playerId);
|
|
48
|
+
},
|
|
49
|
+
/**
|
|
50
|
+
* An insert fed by a select over the prompt row, so "the prompt is open" is tested by the same
|
|
51
|
+
* statement that writes the vote; the conflict clause makes it a replacement of the voter's
|
|
52
|
+
* earlier choice.
|
|
53
|
+
*/
|
|
54
|
+
async castVote({ matchId, targetPlayerId, voterPlayerId, decision, castAt }) {
|
|
55
|
+
const rows = await db
|
|
56
|
+
.insert(takeoverVotes)
|
|
57
|
+
.select(db
|
|
58
|
+
.select({
|
|
59
|
+
matchId: sql `${matchId}`.as('match_id'),
|
|
60
|
+
targetPlayerId: sql `${targetPlayerId}`.as('target_player_id'),
|
|
61
|
+
voterPlayerId: sql `${voterPlayerId}`.as('voter_player_id'),
|
|
62
|
+
decision: sql `${decision}`.as('decision'),
|
|
63
|
+
castAt: sql `${castAt}`.as('cast_at'),
|
|
64
|
+
})
|
|
65
|
+
.from(takeoverPrompts)
|
|
66
|
+
.where(and(eq(takeoverPrompts.matchId, matchId), eq(takeoverPrompts.playerId, targetPlayerId))))
|
|
67
|
+
.onConflictDoUpdate({
|
|
68
|
+
target: [
|
|
69
|
+
takeoverVotes.matchId,
|
|
70
|
+
takeoverVotes.targetPlayerId,
|
|
71
|
+
takeoverVotes.voterPlayerId,
|
|
72
|
+
],
|
|
73
|
+
set: { decision, castAt },
|
|
74
|
+
})
|
|
75
|
+
.returning({ voterPlayerId: takeoverVotes.voterPlayerId });
|
|
76
|
+
return rows.length === 1;
|
|
77
|
+
},
|
|
78
|
+
async listVotes(matchId, targetPlayerId) {
|
|
79
|
+
const rows = await db
|
|
80
|
+
.select()
|
|
81
|
+
.from(takeoverVotes)
|
|
82
|
+
.where(and(eq(takeoverVotes.matchId, matchId), eq(takeoverVotes.targetPlayerId, targetPlayerId)))
|
|
83
|
+
.orderBy(asc(takeoverVotes.voterPlayerId));
|
|
84
|
+
return rows.map(toTakeoverVote);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=takeovers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"takeovers.js","sourceRoot":"","sources":["../../src/postgres/takeovers.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,4 +3,14 @@ export declare const APPEND_ATTEMPTS = 8;
|
|
|
3
3
|
export declare function isUniqueViolation(error: unknown): boolean;
|
|
4
4
|
/** Runs `write`, translating a unique-constraint refusal into `false`. */
|
|
5
5
|
export declare function insertUnlessTaken(write: () => Promise<unknown>): Promise<boolean>;
|
|
6
|
+
/**
|
|
7
|
+
* Jittered pause between two attempts at claiming the next event sequence number.
|
|
8
|
+
*
|
|
9
|
+
* `append` allocates its own sequence inside the insert, so concurrent appenders collide on the
|
|
10
|
+
* primary key and the losers retry. Retrying immediately means they collide again on the same
|
|
11
|
+
* scheduling tick: six players plus the sweeper appending to one match can plausibly exhaust all
|
|
12
|
+
* eight attempts in a row, and the throw lands in the middle of `completeSeal`. A few milliseconds
|
|
13
|
+
* of full jitter, growing with the attempt, breaks the convoy for the cost of a timer.
|
|
14
|
+
*/
|
|
15
|
+
export declare function appendBackoff(attempt: number): Promise<void>;
|
|
6
16
|
//# sourceMappingURL=constraints.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constraints.d.ts","sourceRoot":"","sources":["../../src/shared/constraints.ts"],"names":[],"mappings":"AAwBA,sFAAsF;AACtF,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAazD;AAED,0EAA0E;AAC1E,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvF"}
|
|
1
|
+
{"version":3,"file":"constraints.d.ts","sourceRoot":"","sources":["../../src/shared/constraints.ts"],"names":[],"mappings":"AAwBA,sFAAsF;AACtF,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAazD;AAED,0EAA0E;AAC1E,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvF;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE"}
|
|
@@ -52,4 +52,17 @@ export async function insertUnlessTaken(write) {
|
|
|
52
52
|
throw error;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Jittered pause between two attempts at claiming the next event sequence number.
|
|
57
|
+
*
|
|
58
|
+
* `append` allocates its own sequence inside the insert, so concurrent appenders collide on the
|
|
59
|
+
* primary key and the losers retry. Retrying immediately means they collide again on the same
|
|
60
|
+
* scheduling tick: six players plus the sweeper appending to one match can plausibly exhaust all
|
|
61
|
+
* eight attempts in a row, and the throw lands in the middle of `completeSeal`. A few milliseconds
|
|
62
|
+
* of full jitter, growing with the attempt, breaks the convoy for the cost of a timer.
|
|
63
|
+
*/
|
|
64
|
+
export async function appendBackoff(attempt) {
|
|
65
|
+
const ceiling = Math.min(2 ** (attempt - 1), 16);
|
|
66
|
+
await new Promise((resolve) => setTimeout(resolve, Math.random() * ceiling));
|
|
67
|
+
}
|
|
55
68
|
//# sourceMappingURL=constraints.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constraints.js","sourceRoot":"","sources":["../../src/shared/constraints.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,eAAe,GAAG;IACtB,0BAA0B;IAC1B,4BAA4B;IAC5B,gDAAgD;CACjD,CAAA;AACD,MAAM,yBAAyB,GAAG,OAAO,CAAA;AACzC;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,CAAC,0BAA0B,EAAE,8BAA8B,CAAC,CAAA;AACxF,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB,sFAAsF;AACtF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AAEhC,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,OAAO,GAAY,KAAK,CAAA;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACjE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAgD,CAAA;QAC1E,IAAI,IAAI,KAAK,yBAAyB;YAAE,OAAO,IAAI,CAAA;QACnD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAC/E,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC9F,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,GAAI,OAA+B,CAAC,KAAK,CAAA;IAClD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA6B;IACnE,IAAI,CAAC;QACH,MAAM,KAAK,EAAE,CAAA;QACb,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,iBAAiB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAC1C,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"constraints.js","sourceRoot":"","sources":["../../src/shared/constraints.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,eAAe,GAAG;IACtB,0BAA0B;IAC1B,4BAA4B;IAC5B,gDAAgD;CACjD,CAAA;AACD,MAAM,yBAAyB,GAAG,OAAO,CAAA;AACzC;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,CAAC,0BAA0B,EAAE,8BAA8B,CAAC,CAAA;AACxF,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB,sFAAsF;AACtF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AAEhC,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,OAAO,GAAY,KAAK,CAAA;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACjE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAgD,CAAA;QAC1E,IAAI,IAAI,KAAK,yBAAyB;YAAE,OAAO,IAAI,CAAA;QACnD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAC/E,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC9F,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,GAAI,OAA+B,CAAC,KAAK,CAAA;IAClD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA6B;IACnE,IAAI,CAAC;QACH,MAAM,KAAK,EAAE,CAAA;QACb,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,iBAAiB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAC1C,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAChD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAA;AAC9E,CAAC"}
|
package/dist/shared/mappers.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Match, PersistedEvent, Player, Snapshot, SnapshotSummary, TakeoverVote, Turn, TurnOrders, TurnReport } from '@chaos-overlords/kernel';
|
|
1
|
+
import type { Match, PersistedEvent, PublicLobbyRow, Player, Snapshot, SnapshotSummary, TakeoverVote, Turn, TurnOrders, TurnReport } from '@chaos-overlords/kernel';
|
|
2
2
|
/**
|
|
3
3
|
* Row shapes after Drizzle's own mapping, identical across the two dialects: Dates for timestamps,
|
|
4
4
|
* parsed values for JSON, booleans for flags. Persisted enums are stored as text; each mapper
|
|
@@ -41,6 +41,7 @@ export interface TurnRow {
|
|
|
41
41
|
orderSetHash: string | null;
|
|
42
42
|
sealedSlots: unknown;
|
|
43
43
|
stateHash: string | null;
|
|
44
|
+
desyncedAt: Date | null;
|
|
44
45
|
}
|
|
45
46
|
export interface TurnOrdersRow {
|
|
46
47
|
matchId: string;
|
|
@@ -82,15 +83,15 @@ export declare const toMatchInsert: (match: Match) => {
|
|
|
82
83
|
id: string;
|
|
83
84
|
protocolVersion: number;
|
|
84
85
|
sessionVersion: number;
|
|
85
|
-
status: "
|
|
86
|
+
status: "abandoned" | "desynced" | "finished" | "lobby" | "running";
|
|
86
87
|
name: string;
|
|
87
|
-
visibility: "
|
|
88
|
+
visibility: "private" | "public";
|
|
88
89
|
maxPlayers: number;
|
|
89
90
|
settings: {
|
|
90
91
|
name: string;
|
|
91
92
|
maxPlayers: number;
|
|
92
93
|
turnTimerSeconds: number;
|
|
93
|
-
visibility: "
|
|
94
|
+
visibility: "private" | "public";
|
|
94
95
|
gameSettings: Record<string, unknown>;
|
|
95
96
|
};
|
|
96
97
|
hostPlayerId: string;
|
|
@@ -108,7 +109,7 @@ export declare const toTurn: (row: TurnRow) => Turn;
|
|
|
108
109
|
export declare const toTurnOrders: (row: TurnOrdersRow) => TurnOrders;
|
|
109
110
|
export declare const toTurnReport: (row: TurnReportRow) => TurnReport;
|
|
110
111
|
export declare const toSnapshot: (row: SnapshotRow) => Snapshot;
|
|
111
|
-
export declare const toSnapshotSummary: (row: Omit<SnapshotRow,
|
|
112
|
+
export declare const toSnapshotSummary: (row: Omit<SnapshotRow, 'body'>) => SnapshotSummary;
|
|
112
113
|
export interface TakeoverVoteRow {
|
|
113
114
|
matchId: string;
|
|
114
115
|
targetPlayerId: string;
|
|
@@ -119,4 +120,26 @@ export interface TakeoverVoteRow {
|
|
|
119
120
|
export declare const toTakeoverVote: (row: TakeoverVoteRow) => TakeoverVote;
|
|
120
121
|
export declare const toEvent: (row: EventRow) => PersistedEvent;
|
|
121
122
|
export declare const firstOrNull: <T>(rows: T[]) => T | null;
|
|
123
|
+
/**
|
|
124
|
+
* The public listing row as the two listing statements select it, before the contract shape.
|
|
125
|
+
*
|
|
126
|
+
* `seatCount` and `humanCount` are both carried because they answer the question for different
|
|
127
|
+
* statuses: a lobby advertises the seats it has taken, a running match the humans still in it —
|
|
128
|
+
* the ones playing and the ones a takeover vote has not yet decided on.
|
|
129
|
+
*/
|
|
130
|
+
export interface PublicLobbyRowShape {
|
|
131
|
+
id: string;
|
|
132
|
+
joinCode: string;
|
|
133
|
+
name: string;
|
|
134
|
+
hostDisplayName: string;
|
|
135
|
+
seatCount: number;
|
|
136
|
+
humanCount: unknown;
|
|
137
|
+
maxPlayers: number;
|
|
138
|
+
passwordHash: string | null;
|
|
139
|
+
status: string;
|
|
140
|
+
settings: unknown;
|
|
141
|
+
createdAt: Date;
|
|
142
|
+
hasSnapshot: unknown;
|
|
143
|
+
}
|
|
144
|
+
export declare const toPublicLobbyRow: (row: PublicLobbyRowShape) => PublicLobbyRow;
|
|
122
145
|
//# sourceMappingURL=mappers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../src/shared/mappers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../src/shared/mappers.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/mappers.js
CHANGED
|
@@ -71,6 +71,37 @@ export const toEvent = (row) => ({
|
|
|
71
71
|
createdAt: row.createdAt.toISOString(),
|
|
72
72
|
});
|
|
73
73
|
export const firstOrNull = (rows) => rows[0] ?? null;
|
|
74
|
+
export const toPublicLobbyRow = (row) => ({
|
|
75
|
+
id: row.id,
|
|
76
|
+
joinCode: row.joinCode,
|
|
77
|
+
name: row.name,
|
|
78
|
+
hostDisplayName: row.hostDisplayName,
|
|
79
|
+
playerCount: row.status === 'running' ? countColumn(row.humanCount) : row.seatCount,
|
|
80
|
+
maxPlayers: row.maxPlayers,
|
|
81
|
+
status: row.status,
|
|
82
|
+
settings: row.settings,
|
|
83
|
+
availableSlots: [],
|
|
84
|
+
availableSeatSummaries: [],
|
|
85
|
+
passwordProtected: row.passwordHash !== null,
|
|
86
|
+
hasSnapshot: booleanColumn(row.hasSnapshot),
|
|
87
|
+
createdAt: row.createdAt.toISOString(),
|
|
88
|
+
});
|
|
89
|
+
/**
|
|
90
|
+
* A driver-agnostic read of an aggregate or predicate column. `count(*)` comes back as a number on
|
|
91
|
+
* better-sqlite3 and D1 and as a decimal string on node-postgres, and `exists` is a boolean on
|
|
92
|
+
* Postgres and 0/1 on SQLite; both are normalized here rather than at each call site.
|
|
93
|
+
*/
|
|
94
|
+
function countColumn(value) {
|
|
95
|
+
const number = typeof value === 'string' ? Number(value) : value;
|
|
96
|
+
return typeof number === 'number' && Number.isFinite(number) ? number : 0;
|
|
97
|
+
}
|
|
98
|
+
function booleanColumn(value) {
|
|
99
|
+
if (typeof value === 'boolean')
|
|
100
|
+
return value;
|
|
101
|
+
if (typeof value === 'number')
|
|
102
|
+
return value !== 0;
|
|
103
|
+
return value === 't' || value === 'true' || value === '1';
|
|
104
|
+
}
|
|
74
105
|
/**
|
|
75
106
|
* Normalizes a protocol or session version at the database boundary, before it can leak into a
|
|
76
107
|
* JSON response.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mappers.js","sourceRoot":"","sources":["../../src/shared/mappers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mappers.js","sourceRoot":"","sources":["../../src/shared/mappers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BaseSQLiteDatabase } from 'drizzle-orm/sqlite-core';
|
|
2
|
+
import type * as schema from './schema';
|
|
3
|
+
/**
|
|
4
|
+
* Either SQLite driver Drizzle offers: better-sqlite3 (`'sync'`) or D1 (`'async'`). Awaiting a
|
|
5
|
+
* synchronous result is a no-op, so one implementation serves both. Every conditional write ends
|
|
6
|
+
* in `.returning()` because the two drivers report affected rows in different shapes.
|
|
7
|
+
*
|
|
8
|
+
* It lives here rather than beside the repositories so the modules those repositories are split
|
|
9
|
+
* across can name it without importing each other.
|
|
10
|
+
*/
|
|
11
|
+
export type SqliteDatabase = BaseSQLiteDatabase<'sync' | 'async', unknown, typeof schema>;
|
|
12
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/sqlite/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,KAAK,MAAM,MAAM,UAAU,CAAA;AAEvC;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/sqlite/database.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EventRepository } from '@chaos-overlords/kernel';
|
|
2
|
+
import type { SqliteDatabase } from './database';
|
|
3
|
+
/**
|
|
4
|
+
* The match event log in the SQLite dialect: the gapless, self-allocating sequence every stream
|
|
5
|
+
* cursor moves along. Its own module because the allocation rule — `max(seq) + 1` inside the
|
|
6
|
+
* insert, retried on the primary key — is the one invariant the whole delivery contract rests on.
|
|
7
|
+
*/
|
|
8
|
+
export declare function sqliteEventRepository(db: SqliteDatabase): EventRepository;
|
|
9
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/sqlite/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,yBAAyB,CAAA;AAI9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,cAAc,GAAG,eAAe,CAoDzE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { and, asc, desc, eq, sql } from 'drizzle-orm';
|
|
2
|
+
import { APPEND_ATTEMPTS, appendBackoff, isUniqueViolation } from '../shared/constraints';
|
|
3
|
+
import { toEvent } from '../shared/mappers';
|
|
4
|
+
import * as schema from './schema';
|
|
5
|
+
/**
|
|
6
|
+
* The match event log in the SQLite dialect: the gapless, self-allocating sequence every stream
|
|
7
|
+
* cursor moves along. Its own module because the allocation rule — `max(seq) + 1` inside the
|
|
8
|
+
* insert, retried on the primary key — is the one invariant the whole delivery contract rests on.
|
|
9
|
+
*/
|
|
10
|
+
export function sqliteEventRepository(db) {
|
|
11
|
+
const { matchEvents } = schema;
|
|
12
|
+
return {
|
|
13
|
+
/**
|
|
14
|
+
* The sequence number comes from the log itself inside the insert, so the allocation cannot be
|
|
15
|
+
* separated from the write: a committed `seq` therefore implies every lower one is committed,
|
|
16
|
+
* which is the invariant a stream cursor relies on. Concurrent appends collide on the primary
|
|
17
|
+
* key and the loser simply re-reads the maximum.
|
|
18
|
+
*/
|
|
19
|
+
async append(event) {
|
|
20
|
+
const nextSeq = sql `(select coalesce(max(${matchEvents.seq}), 0) + 1 from ${matchEvents} where ${eq(matchEvents.matchId, event.matchId)})`;
|
|
21
|
+
for (let attempt = 1; attempt <= APPEND_ATTEMPTS; attempt += 1) {
|
|
22
|
+
try {
|
|
23
|
+
const rows = await db
|
|
24
|
+
.insert(matchEvents)
|
|
25
|
+
.values({
|
|
26
|
+
matchId: event.matchId,
|
|
27
|
+
seq: nextSeq,
|
|
28
|
+
type: event.type,
|
|
29
|
+
payload: event.payload,
|
|
30
|
+
createdAt: new Date(event.createdAt),
|
|
31
|
+
})
|
|
32
|
+
.returning({ seq: matchEvents.seq });
|
|
33
|
+
const row = rows[0];
|
|
34
|
+
if (!row)
|
|
35
|
+
throw new Error(`append to ${event.matchId} reported no row`);
|
|
36
|
+
return { ...event, seq: row.seq };
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (!isUniqueViolation(error) || attempt === APPEND_ATTEMPTS)
|
|
40
|
+
throw error;
|
|
41
|
+
await appendBackoff(attempt);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
throw new Error(`could not append an event for ${event.matchId}`);
|
|
45
|
+
},
|
|
46
|
+
async listAfter(matchId, afterSeq, limit) {
|
|
47
|
+
const rows = await db
|
|
48
|
+
.select()
|
|
49
|
+
.from(matchEvents)
|
|
50
|
+
.where(and(eq(matchEvents.matchId, matchId), sql `${matchEvents.seq} > ${afterSeq}`))
|
|
51
|
+
.orderBy(asc(matchEvents.seq))
|
|
52
|
+
.limit(limit);
|
|
53
|
+
return rows.map(toEvent);
|
|
54
|
+
},
|
|
55
|
+
async lastSeq(matchId) {
|
|
56
|
+
const rows = await db
|
|
57
|
+
.select({ seq: matchEvents.seq })
|
|
58
|
+
.from(matchEvents)
|
|
59
|
+
.where(eq(matchEvents.matchId, matchId))
|
|
60
|
+
.orderBy(desc(matchEvents.seq))
|
|
61
|
+
.limit(1);
|
|
62
|
+
return rows[0]?.seq ?? 0;
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/sqlite/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import type { MultiplayerStorage } from '@chaos-overlords/kernel';
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Either SQLite driver Drizzle offers: better-sqlite3 (`'sync'`) or D1 (`'async'`). Awaiting a
|
|
6
|
-
* synchronous result is a no-op, so one implementation serves both. Every conditional write ends
|
|
7
|
-
* in `.returning()` because the two drivers report affected rows in different shapes.
|
|
8
|
-
*/
|
|
9
|
-
export type SqliteDatabase = BaseSQLiteDatabase<'sync' | 'async', unknown, typeof schema>;
|
|
2
|
+
import type { SqliteDatabase } from './database';
|
|
3
|
+
export type { SqliteDatabase };
|
|
10
4
|
export declare function createSqliteStorage(db: SqliteDatabase): MultiplayerStorage;
|
|
11
5
|
//# sourceMappingURL=repositories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repositories.d.ts","sourceRoot":"","sources":["../../src/sqlite/repositories.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repositories.d.ts","sourceRoot":"","sources":["../../src/sqlite/repositories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAKnB,MAAM,yBAAyB,CAAA;AA+BhC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAKhD,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,cAAc,GAAG,kBAAkB,CAS1E"}
|