@chaos-overlords/storage 0.9.5 → 0.9.7
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 +21 -674
- package/NOTICE +9 -12
- package/README.md +1 -1
- package/dist/postgres/events.d.ts.map +1 -1
- package/dist/postgres/events.js +34 -1
- package/dist/postgres/events.js.map +1 -1
- package/dist/postgres/repositories.js +47 -7
- package/dist/postgres/repositories.js.map +1 -1
- package/dist/postgres/schema.d.ts +51 -0
- package/dist/postgres/schema.d.ts.map +1 -1
- package/dist/postgres/schema.js +24 -2
- package/dist/postgres/schema.js.map +1 -1
- package/dist/postgres/takeovers.d.ts.map +1 -1
- package/dist/postgres/takeovers.js +24 -1
- package/dist/postgres/takeovers.js.map +1 -1
- package/dist/shared/constraints.d.ts +9 -3
- package/dist/shared/constraints.d.ts.map +1 -1
- package/dist/shared/constraints.js +9 -3
- package/dist/shared/constraints.js.map +1 -1
- package/dist/shared/mappers.d.ts +2 -0
- package/dist/shared/mappers.d.ts.map +1 -1
- package/dist/shared/mappers.js +1 -0
- package/dist/shared/mappers.js.map +1 -1
- package/dist/sqlite/events.d.ts.map +1 -1
- package/dist/sqlite/events.js +34 -1
- package/dist/sqlite/events.js.map +1 -1
- package/dist/sqlite/repositories.js +49 -8
- package/dist/sqlite/repositories.js.map +1 -1
- package/dist/sqlite/schema.d.ts +53 -0
- package/dist/sqlite/schema.d.ts.map +1 -1
- package/dist/sqlite/schema.js +24 -2
- package/dist/sqlite/schema.js.map +1 -1
- package/dist/sqlite/takeovers.d.ts.map +1 -1
- package/dist/sqlite/takeovers.js +24 -1
- package/dist/sqlite/takeovers.js.map +1 -1
- package/migrations/postgres/0006_stiff_newton_destine.sql +22 -0
- package/migrations/postgres/meta/0006_snapshot.json +942 -0
- package/migrations/postgres/meta/_journal.json +7 -0
- package/migrations/sqlite/0006_flawless_bedlam.sql +22 -0
- package/migrations/sqlite/meta/0006_snapshot.json +891 -0
- package/migrations/sqlite/meta/_journal.json +7 -0
- package/package.json +5 -5
package/dist/sqlite/takeovers.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ABSENT_HUMAN_STATUSES } from '@chaos-overlords/kernel';
|
|
2
|
-
import { and, asc, eq, gte, inArray, notExists, sql } from 'drizzle-orm';
|
|
2
|
+
import { and, asc, eq, gte, inArray, isNull, notExists, sql } from 'drizzle-orm';
|
|
3
3
|
import { toTakeoverVote } from '../shared/mappers';
|
|
4
4
|
import * as schema from './schema';
|
|
5
5
|
/**
|
|
@@ -30,6 +30,7 @@ export function sqliteTakeoverRepository(db) {
|
|
|
30
30
|
playerId: sql `${playerId}`.as('player_id'),
|
|
31
31
|
turn: sql `${turn}`.as('turn'),
|
|
32
32
|
openedAt: sql `${openedAt.getTime()}`.as('opened_at'),
|
|
33
|
+
announcedAt: sql `null`.as('announced_at'),
|
|
33
34
|
})
|
|
34
35
|
.from(players)
|
|
35
36
|
.where(and(eq(players.id, playerId), eq(players.matchId, matchId), inArray(players.status, [...ABSENT_HUMAN_STATUSES]))))
|
|
@@ -37,6 +38,28 @@ export function sqliteTakeoverRepository(db) {
|
|
|
37
38
|
.returning({ playerId: takeoverPrompts.playerId });
|
|
38
39
|
return rows.length === 1;
|
|
39
40
|
},
|
|
41
|
+
async getPrompt(matchId, playerId) {
|
|
42
|
+
const rows = await db
|
|
43
|
+
.select({
|
|
44
|
+
turn: takeoverPrompts.turn,
|
|
45
|
+
openedAt: takeoverPrompts.openedAt,
|
|
46
|
+
announcedAt: takeoverPrompts.announcedAt,
|
|
47
|
+
})
|
|
48
|
+
.from(takeoverPrompts)
|
|
49
|
+
.where(and(eq(takeoverPrompts.matchId, matchId), eq(takeoverPrompts.playerId, playerId)))
|
|
50
|
+
.limit(1);
|
|
51
|
+
return rows[0] ?? null;
|
|
52
|
+
},
|
|
53
|
+
async markPromptAnnounced(matchId, playerId, openedAt, at) {
|
|
54
|
+
const rows = await db
|
|
55
|
+
.update(takeoverPrompts)
|
|
56
|
+
.set({ announcedAt: at })
|
|
57
|
+
.where(and(eq(takeoverPrompts.matchId, matchId), eq(takeoverPrompts.playerId, playerId),
|
|
58
|
+
// The prompt that was announced, not one reopened for the seat since.
|
|
59
|
+
eq(takeoverPrompts.openedAt, openedAt), isNull(takeoverPrompts.announcedAt)))
|
|
60
|
+
.returning({ playerId: takeoverPrompts.playerId });
|
|
61
|
+
return rows.length === 1;
|
|
62
|
+
},
|
|
40
63
|
async closePrompt(matchId, playerId) {
|
|
41
64
|
// Close first so no concurrent vote can be admitted between vote cleanup and prompt removal,
|
|
42
65
|
// and leave alone the votes of a prompt reopened for the seat between the two statements.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"takeovers.js","sourceRoot":"","sources":["../../src/sqlite/takeovers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,yBAAyB,CAAA;AACxF,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"takeovers.js","sourceRoot":"","sources":["../../src/sqlite/takeovers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
ALTER TABLE "match_events" ADD COLUMN "dedupe_key" text;--> statement-breakpoint
|
|
2
|
+
ALTER TABLE "takeover_prompts" ADD COLUMN "announced_at" timestamp with time zone;--> statement-breakpoint
|
|
3
|
+
ALTER TABLE "turns" ADD COLUMN "settled_at" timestamp with time zone;--> statement-breakpoint
|
|
4
|
+
CREATE UNIQUE INDEX "match_events_dedupe_idx" ON "match_events" USING btree ("match_id","dedupe_key");--> statement-breakpoint
|
|
5
|
+
CREATE INDEX "match_events_type_idx" ON "match_events" USING btree ("match_id","type","seq");--> statement-breakpoint
|
|
6
|
+
CREATE INDEX "turns_settled_idx" ON "turns" USING btree ("status","settled_at");--> statement-breakpoint
|
|
7
|
+
-- Backfill: an announcement logged before this column existed carries no key, so the first repeat
|
|
8
|
+
-- of it after the upgrade (the sweep finishing a seal whose successor never opened, say) would find
|
|
9
|
+
-- nothing under its key and log it a second time. The earliest event of each fact takes the key its
|
|
10
|
+
-- announcement is now published under; a fact the old code logged twice keeps its later copy unkeyed.
|
|
11
|
+
UPDATE "match_events" SET "dedupe_key" = 'turn.sealed:' || ("payload"->>'turn') WHERE "dedupe_key" IS NULL AND "type" = 'turn.sealed' AND "seq" = (SELECT min(e."seq") FROM "match_events" e WHERE e."match_id" = "match_events"."match_id" AND e."type" = 'turn.sealed' AND (e."payload"->>'turn') = ("match_events"."payload"->>'turn'));--> statement-breakpoint
|
|
12
|
+
UPDATE "match_events" SET "dedupe_key" = 'turn.confirmed:' || ("payload"->>'turn') WHERE "dedupe_key" IS NULL AND "type" = 'turn.confirmed' AND "seq" = (SELECT min(e."seq") FROM "match_events" e WHERE e."match_id" = "match_events"."match_id" AND e."type" = 'turn.confirmed' AND (e."payload"->>'turn') = ("match_events"."payload"->>'turn'));--> statement-breakpoint
|
|
13
|
+
UPDATE "match_events" SET "dedupe_key" = 'turn.desynced:' || ("payload"->>'turn') WHERE "dedupe_key" IS NULL AND "type" = 'turn.desynced' AND "seq" = (SELECT min(e."seq") FROM "match_events" e WHERE e."match_id" = "match_events"."match_id" AND e."type" = 'turn.desynced' AND (e."payload"->>'turn') = ("match_events"."payload"->>'turn'));--> statement-breakpoint
|
|
14
|
+
UPDATE "match_events" SET "dedupe_key" = 'match.statusChanged:finished' WHERE "dedupe_key" IS NULL AND "type" = 'match.statusChanged' AND "payload"->>'status' = 'finished' AND "seq" = (SELECT min(e."seq") FROM "match_events" e WHERE e."match_id" = "match_events"."match_id" AND e."type" = 'match.statusChanged' AND e."payload"->>'status' = 'finished');--> statement-breakpoint
|
|
15
|
+
-- Backfill: a prompt opened before this column existed was announced by the call that opened it.
|
|
16
|
+
-- Without a stamp it would read as still owing its announcement, and the next call to ask about
|
|
17
|
+
-- the seat would publish `match.takeoverVoteRequested` a second time.
|
|
18
|
+
UPDATE "takeover_prompts" SET "announced_at" = "opened_at" WHERE "announced_at" IS NULL;--> statement-breakpoint
|
|
19
|
+
-- Backfill: a turn confirmed before this column existed had its follow-ups run by the verdict that
|
|
20
|
+
-- confirmed it. Without a stamp every one of them would be handed to the sweep as a verdict cut
|
|
21
|
+
-- short, and `turn.confirmed` would be logged again for the whole history of every live match.
|
|
22
|
+
UPDATE "turns" SET "settled_at" = coalesce("sealed_at", now()) WHERE "status" = 'confirmed' AND "settled_at" IS NULL;
|