Prototype voluntary seat handover with durable private retries
Let a current owner issue, cancel or replace a private 24-hour one-time offer. Recipients accept the same faction and saved game while old browser sessions, recovery keys and entry receipts lose authority. Preserve exact claim retries across refresh, restart and later offers, with private tab-scoped continuation. Fence every claim mutation to its winning transaction. Add durable receipts and additive backfill for already-issued offers without changing game JSON or existing seat authority. Block competing navigation during unresolved owner operations; remove invalidated owner kits on confirmed recovery. Record the pending CHOAM Nexus after-victory secrecy/window decision without inventing the unresolved gameplay or opening mode/publication gates. Validation: types/lint and 4,364 offline tests passed; production build passed; 43 HTTP tests passed. Added 19 offline and 3 HTTP regressions. Independent privacy/persistence review passed, including deterministic CAS interleavings, rollback, legacy migration and exact receipt restoration. Browser room 2EMYG4CY retained private setup choices after handover/refresh and continued into Storm; follow-up recovery removed its invalid offer with cards/forces/spice unchanged. All 218 opening rooms preserved (291 after QA and both broad runs). The opening 456 seat, 49 recovery-key, 56 recovery-receipt and 106 entry-receipt rows were also verified unchanged. Server reused; no restart or recurring automation. Final private report: ~/.local/share/dune/checkpoints/20260913-seat-handover/ verification-final/report.json. Source fingerprint: 8949cdf58eb8bc8bd33f2657c6b21352b3ee5e17e2a556c684a89073015632f4. Check/build/HTTP duration: 140565/6689/24835 ms. The earlier broad run passed; a final recovery-UI review fix required the second source-bound run. Goal aggregate counter 64,301,976 -> 65,031,751 before Git (729,775) for this bounded capability and its concurrency/recovery review; full goal remains active.
This commit is contained in:
1 parent
f0d3d9c464
commit
7dfd6b3048
24 files changed
+3570
-24
No files matched your search
@@ -0,0 +1,15 @@
|
||||
CREATE TABLE `seat_handover_offers` (
|
||||
`room_code` text NOT NULL,
|
||||
`player_id` text NOT NULL,
|
||||
`offer_hash` text NOT NULL,
|
||||
`secret_hash` text NOT NULL,
|
||||
`issuer_session_hash` text NOT NULL,
|
||||
`expires_at` integer NOT NULL,
|
||||
`claim_operation_hash` text,
|
||||
`session_hash` text,
|
||||
`claimed_at` integer,
|
||||
PRIMARY KEY(`room_code`, `player_id`),
|
||||
FOREIGN KEY (`room_code`) REFERENCES `rooms`(`code`) ON UPDATE no action ON DELETE cascade
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX `seat_handover_offers_offer_hash_unique` ON `seat_handover_offers` (`offer_hash`);
|
||||
@@ -0,0 +1,19 @@
|
||||
CREATE TABLE `seat_handover_claim_receipts` (
|
||||
`room_code` text NOT NULL,
|
||||
`player_id` text NOT NULL,
|
||||
`operation_hash` text NOT NULL,
|
||||
`offer_hash` text NOT NULL,
|
||||
`secret_hash` text NOT NULL,
|
||||
`session_hash` text NOT NULL,
|
||||
`claim_fence` text NOT NULL,
|
||||
`claimed_at` integer NOT NULL,
|
||||
PRIMARY KEY(`room_code`, `player_id`, `operation_hash`),
|
||||
FOREIGN KEY (`room_code`) REFERENCES `rooms`(`code`) ON UPDATE no action ON DELETE cascade
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX `seat_handover_claim_receipts_claim_fence_unique` ON `seat_handover_claim_receipts` (`claim_fence`);
|
||||
--> statement-breakpoint
|
||||
INSERT INTO `seat_handover_claim_receipts` (`room_code`,`player_id`,`operation_hash`,`offer_hash`,`secret_hash`,`session_hash`,`claim_fence`,`claimed_at`)
|
||||
SELECT `room_code`,`player_id`,`claim_operation_hash`,`offer_hash`,`secret_hash`,`session_hash`,'legacy:' || length(`room_code`) || ':' || `room_code` || ':' || length(`player_id`) || ':' || `player_id` || ':' || `claim_operation_hash`,`claimed_at`
|
||||
FROM `seat_handover_offers`
|
||||
WHERE `claim_operation_hash` IS NOT NULL AND `session_hash` IS NOT NULL AND `claimed_at` IS NOT NULL;
|
||||
@@ -0,0 +1,400 @@
|
||||
{
|
||||
"version": "6",
|
||||
"dialect": "sqlite",
|
||||
"id": "dcf803b3-13d9-4ec9-8c11-e96778ccad59",
|
||||
"prevId": "8a551145-9fb9-42a4-9273-3cad1043504c",
|
||||
"tables": {
|
||||
"room_entry_receipts": {
|
||||
"name": "room_entry_receipts",
|
||||
"columns": {
|
||||
"operation_hash": {
|
||||
"name": "operation_hash",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"request_hash": {
|
||||
"name": "request_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"session_hash": {
|
||||
"name": "session_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"room_entry_receipts_room_code_rooms_code_fk": {
|
||||
"name": "room_entry_receipts_room_code_rooms_code_fk",
|
||||
"tableFrom": "room_entry_receipts",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"rooms": {
|
||||
"name": "rooms",
|
||||
"columns": {
|
||||
"code": {
|
||||
"name": "code",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"state": {
|
||||
"name": "state",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"version": {
|
||||
"name": "version",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": 0
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"seat_handover_offers": {
|
||||
"name": "seat_handover_offers",
|
||||
"columns": {
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"offer_hash": {
|
||||
"name": "offer_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"secret_hash": {
|
||||
"name": "secret_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"issuer_session_hash": {
|
||||
"name": "issuer_session_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires_at": {
|
||||
"name": "expires_at",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"claim_operation_hash": {
|
||||
"name": "claim_operation_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"session_hash": {
|
||||
"name": "session_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"claimed_at": {
|
||||
"name": "claimed_at",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"seat_handover_offers_offer_hash_unique": {
|
||||
"name": "seat_handover_offers_offer_hash_unique",
|
||||
"columns": [
|
||||
"offer_hash"
|
||||
],
|
||||
"isUnique": true
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"seat_handover_offers_room_code_rooms_code_fk": {
|
||||
"name": "seat_handover_offers_room_code_rooms_code_fk",
|
||||
"tableFrom": "seat_handover_offers",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {
|
||||
"seat_handover_offers_room_code_player_id_pk": {
|
||||
"columns": [
|
||||
"room_code",
|
||||
"player_id"
|
||||
],
|
||||
"name": "seat_handover_offers_room_code_player_id_pk"
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"seat_recovery_keys": {
|
||||
"name": "seat_recovery_keys",
|
||||
"columns": {
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"recovery_hash": {
|
||||
"name": "recovery_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"current_operation_hash": {
|
||||
"name": "current_operation_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"seat_recovery_keys_room_code_rooms_code_fk": {
|
||||
"name": "seat_recovery_keys_room_code_rooms_code_fk",
|
||||
"tableFrom": "seat_recovery_keys",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {
|
||||
"seat_recovery_keys_room_code_player_id_pk": {
|
||||
"columns": [
|
||||
"room_code",
|
||||
"player_id"
|
||||
],
|
||||
"name": "seat_recovery_keys_room_code_player_id_pk"
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"seat_recovery_receipts": {
|
||||
"name": "seat_recovery_receipts",
|
||||
"columns": {
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"operation_hash": {
|
||||
"name": "operation_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"recovery_hash": {
|
||||
"name": "recovery_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"session_hash": {
|
||||
"name": "session_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"seat_recovery_receipts_room_code_rooms_code_fk": {
|
||||
"name": "seat_recovery_receipts_room_code_rooms_code_fk",
|
||||
"tableFrom": "seat_recovery_receipts",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {
|
||||
"seat_recovery_receipts_room_code_player_id_operation_hash_pk": {
|
||||
"columns": [
|
||||
"room_code",
|
||||
"player_id",
|
||||
"operation_hash"
|
||||
],
|
||||
"name": "seat_recovery_receipts_room_code_player_id_operation_hash_pk"
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"seats": {
|
||||
"name": "seats",
|
||||
"columns": {
|
||||
"token_hash": {
|
||||
"name": "token_hash",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"revoked": {
|
||||
"name": "revoked",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": 0
|
||||
},
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"seats_room_code_rooms_code_fk": {
|
||||
"name": "seats_room_code_rooms_code_fk",
|
||||
"tableFrom": "seats",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
}
|
||||
},
|
||||
"views": {},
|
||||
"enums": {},
|
||||
"_meta": {
|
||||
"schemas": {},
|
||||
"tables": {},
|
||||
"columns": {}
|
||||
},
|
||||
"internal": {
|
||||
"indexes": {}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,497 @@
|
||||
{
|
||||
"version": "6",
|
||||
"dialect": "sqlite",
|
||||
"id": "db4830ec-5bf2-4dad-b47a-45ebd3bb63b3",
|
||||
"prevId": "dcf803b3-13d9-4ec9-8c11-e96778ccad59",
|
||||
"tables": {
|
||||
"room_entry_receipts": {
|
||||
"name": "room_entry_receipts",
|
||||
"columns": {
|
||||
"operation_hash": {
|
||||
"name": "operation_hash",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"request_hash": {
|
||||
"name": "request_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"session_hash": {
|
||||
"name": "session_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"room_entry_receipts_room_code_rooms_code_fk": {
|
||||
"name": "room_entry_receipts_room_code_rooms_code_fk",
|
||||
"tableFrom": "room_entry_receipts",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"rooms": {
|
||||
"name": "rooms",
|
||||
"columns": {
|
||||
"code": {
|
||||
"name": "code",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"state": {
|
||||
"name": "state",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"version": {
|
||||
"name": "version",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": 0
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"seat_handover_claim_receipts": {
|
||||
"name": "seat_handover_claim_receipts",
|
||||
"columns": {
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"operation_hash": {
|
||||
"name": "operation_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"offer_hash": {
|
||||
"name": "offer_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"secret_hash": {
|
||||
"name": "secret_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"session_hash": {
|
||||
"name": "session_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"claim_fence": {
|
||||
"name": "claim_fence",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"claimed_at": {
|
||||
"name": "claimed_at",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"seat_handover_claim_receipts_claim_fence_unique": {
|
||||
"name": "seat_handover_claim_receipts_claim_fence_unique",
|
||||
"columns": [
|
||||
"claim_fence"
|
||||
],
|
||||
"isUnique": true
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"seat_handover_claim_receipts_room_code_rooms_code_fk": {
|
||||
"name": "seat_handover_claim_receipts_room_code_rooms_code_fk",
|
||||
"tableFrom": "seat_handover_claim_receipts",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {
|
||||
"seat_handover_claim_receipts_room_code_player_id_operation_hash_pk": {
|
||||
"columns": [
|
||||
"room_code",
|
||||
"player_id",
|
||||
"operation_hash"
|
||||
],
|
||||
"name": "seat_handover_claim_receipts_room_code_player_id_operation_hash_pk"
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"seat_handover_offers": {
|
||||
"name": "seat_handover_offers",
|
||||
"columns": {
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"offer_hash": {
|
||||
"name": "offer_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"secret_hash": {
|
||||
"name": "secret_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"issuer_session_hash": {
|
||||
"name": "issuer_session_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires_at": {
|
||||
"name": "expires_at",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"claim_operation_hash": {
|
||||
"name": "claim_operation_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"session_hash": {
|
||||
"name": "session_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"claimed_at": {
|
||||
"name": "claimed_at",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"seat_handover_offers_offer_hash_unique": {
|
||||
"name": "seat_handover_offers_offer_hash_unique",
|
||||
"columns": [
|
||||
"offer_hash"
|
||||
],
|
||||
"isUnique": true
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"seat_handover_offers_room_code_rooms_code_fk": {
|
||||
"name": "seat_handover_offers_room_code_rooms_code_fk",
|
||||
"tableFrom": "seat_handover_offers",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {
|
||||
"seat_handover_offers_room_code_player_id_pk": {
|
||||
"columns": [
|
||||
"room_code",
|
||||
"player_id"
|
||||
],
|
||||
"name": "seat_handover_offers_room_code_player_id_pk"
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"seat_recovery_keys": {
|
||||
"name": "seat_recovery_keys",
|
||||
"columns": {
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"recovery_hash": {
|
||||
"name": "recovery_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"current_operation_hash": {
|
||||
"name": "current_operation_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"seat_recovery_keys_room_code_rooms_code_fk": {
|
||||
"name": "seat_recovery_keys_room_code_rooms_code_fk",
|
||||
"tableFrom": "seat_recovery_keys",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {
|
||||
"seat_recovery_keys_room_code_player_id_pk": {
|
||||
"columns": [
|
||||
"room_code",
|
||||
"player_id"
|
||||
],
|
||||
"name": "seat_recovery_keys_room_code_player_id_pk"
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"seat_recovery_receipts": {
|
||||
"name": "seat_recovery_receipts",
|
||||
"columns": {
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"operation_hash": {
|
||||
"name": "operation_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"recovery_hash": {
|
||||
"name": "recovery_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"session_hash": {
|
||||
"name": "session_hash",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"seat_recovery_receipts_room_code_rooms_code_fk": {
|
||||
"name": "seat_recovery_receipts_room_code_rooms_code_fk",
|
||||
"tableFrom": "seat_recovery_receipts",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {
|
||||
"seat_recovery_receipts_room_code_player_id_operation_hash_pk": {
|
||||
"columns": [
|
||||
"room_code",
|
||||
"player_id",
|
||||
"operation_hash"
|
||||
],
|
||||
"name": "seat_recovery_receipts_room_code_player_id_operation_hash_pk"
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
},
|
||||
"seats": {
|
||||
"name": "seats",
|
||||
"columns": {
|
||||
"token_hash": {
|
||||
"name": "token_hash",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"revoked": {
|
||||
"name": "revoked",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": 0
|
||||
},
|
||||
"room_code": {
|
||||
"name": "room_code",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"player_id": {
|
||||
"name": "player_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"seats_room_code_rooms_code_fk": {
|
||||
"name": "seats_room_code_rooms_code_fk",
|
||||
"tableFrom": "seats",
|
||||
"tableTo": "rooms",
|
||||
"columnsFrom": [
|
||||
"room_code"
|
||||
],
|
||||
"columnsTo": [
|
||||
"code"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {},
|
||||
"checkConstraints": {}
|
||||
}
|
||||
},
|
||||
"views": {},
|
||||
"enums": {},
|
||||
"_meta": {
|
||||
"schemas": {},
|
||||
"tables": {},
|
||||
"columns": {}
|
||||
},
|
||||
"internal": {
|
||||
"indexes": {}
|
||||
}
|
||||
}
|
||||
@@ -29,6 +29,20 @@
|
||||
"when": 1788654062433,
|
||||
"tag": "0003_magical_hawkeye",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 4,
|
||||
"version": "6",
|
||||
"when": 1789276100598,
|
||||
"tag": "0004_flippant_archangel",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 5,
|
||||
"version": "6",
|
||||
"when": 1789276284776,
|
||||
"tag": "0005_salty_alice",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user