dsh-poker 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/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +56 -0
- package/cordis.patch.yml +3 -0
- package/lib/client.js +2419 -0
- package/lib/client.js.map +1 -0
- package/lib/index.js +3051 -0
- package/lib/index.js.map +1 -0
- package/lib/invariant-C3ZiFskw.js +13 -0
- package/lib/invariant-C3ZiFskw.js.map +1 -0
- package/lib/invariant.js +3 -0
- package/lib/join/card-back-landlord.png +0 -0
- package/lib/join/card-back.png +0 -0
- package/lib/join/face-a.png +0 -0
- package/lib/join/face-j.png +0 -0
- package/lib/join/face-k.png +0 -0
- package/lib/join/face-q.png +0 -0
- package/lib/join/index.html +13 -0
- package/lib/join/index.js +8910 -0
- package/lib/join/index.js.map +1 -0
- package/lib/join/join.css +14 -0
- package/lib/join/joker-black.png +0 -0
- package/lib/join/joker-red.png +0 -0
- package/lib/join/role-farmer-b.png +0 -0
- package/lib/join/role-farmer-c.png +0 -0
- package/lib/join/role-farmer.png +0 -0
- package/lib/join/role-landlord-b.png +0 -0
- package/lib/join/role-landlord.png +0 -0
- package/lib/join/role-spectator.png +0 -0
- package/lib/types/client/CardBack.d.ts +7 -0
- package/lib/types/client/CardBack.d.ts.map +1 -0
- package/lib/types/client/CardFace.d.ts +8 -0
- package/lib/types/client/CardFace.d.ts.map +1 -0
- package/lib/types/client/HostApp.d.ts +4 -0
- package/lib/types/client/HostApp.d.ts.map +1 -0
- package/lib/types/client/InviteDialog.d.ts +15 -0
- package/lib/types/client/InviteDialog.d.ts.map +1 -0
- package/lib/types/client/JoinForm.d.ts +13 -0
- package/lib/types/client/JoinForm.d.ts.map +1 -0
- package/lib/types/client/LobbyView.d.ts +34 -0
- package/lib/types/client/LobbyView.d.ts.map +1 -0
- package/lib/types/client/SeatAvatar.d.ts +18 -0
- package/lib/types/client/SeatAvatar.d.ts.map +1 -0
- package/lib/types/client/SeatRow.d.ts +8 -0
- package/lib/types/client/SeatRow.d.ts.map +1 -0
- package/lib/types/client/SettingsCard.d.ts +6 -0
- package/lib/types/client/SettingsCard.d.ts.map +1 -0
- package/lib/types/client/SettlementView.d.ts +6 -0
- package/lib/types/client/SettlementView.d.ts.map +1 -0
- package/lib/types/client/TableView.d.ts +16 -0
- package/lib/types/client/TableView.d.ts.map +1 -0
- package/lib/types/client/card-stack.d.ts +3 -0
- package/lib/types/client/card-stack.d.ts.map +1 -0
- package/lib/types/client/host-api.d.ts +50 -0
- package/lib/types/client/host-api.d.ts.map +1 -0
- package/lib/types/client/index.d.ts +5 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/client/slots.d.ts +3 -0
- package/lib/types/client/slots.d.ts.map +1 -0
- package/lib/types/client/store.d.ts +15 -0
- package/lib/types/client/store.d.ts.map +1 -0
- package/lib/types/config.d.ts +76 -0
- package/lib/types/config.d.ts.map +1 -0
- package/lib/types/crypto.d.ts +9 -0
- package/lib/types/crypto.d.ts.map +1 -0
- package/lib/types/engine/cards.d.ts +22 -0
- package/lib/types/engine/cards.d.ts.map +1 -0
- package/lib/types/engine/deal.d.ts +11 -0
- package/lib/types/engine/deal.d.ts.map +1 -0
- package/lib/types/engine/hands.d.ts +16 -0
- package/lib/types/engine/hands.d.ts.map +1 -0
- package/lib/types/engine/index.d.ts +7 -0
- package/lib/types/engine/index.d.ts.map +1 -0
- package/lib/types/engine/play.d.ts +73 -0
- package/lib/types/engine/play.d.ts.map +1 -0
- package/lib/types/engine/random.d.ts +2 -0
- package/lib/types/engine/random.d.ts.map +1 -0
- package/lib/types/engine/score.d.ts +11 -0
- package/lib/types/engine/score.d.ts.map +1 -0
- package/lib/types/identity/player.d.ts +6 -0
- package/lib/types/identity/player.d.ts.map +1 -0
- package/lib/types/index.d.ts +8 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/invariant.d.ts +9 -0
- package/lib/types/invariant.d.ts.map +1 -0
- package/lib/types/join/JoinApp.d.ts +2 -0
- package/lib/types/join/JoinApp.d.ts.map +1 -0
- package/lib/types/join/main.d.ts +2 -0
- package/lib/types/join/main.d.ts.map +1 -0
- package/lib/types/net/auth.d.ts +16 -0
- package/lib/types/net/auth.d.ts.map +1 -0
- package/lib/types/net/join-page.d.ts +6 -0
- package/lib/types/net/join-page.d.ts.map +1 -0
- package/lib/types/net/json.d.ts +3 -0
- package/lib/types/net/json.d.ts.map +1 -0
- package/lib/types/net/protocol.d.ts +2 -0
- package/lib/types/net/protocol.d.ts.map +1 -0
- package/lib/types/net/routes.d.ts +4 -0
- package/lib/types/net/routes.d.ts.map +1 -0
- package/lib/types/net/views.d.ts +3 -0
- package/lib/types/net/views.d.ts.map +1 -0
- package/lib/types/net/ws.d.ts +8 -0
- package/lib/types/net/ws.d.ts.map +1 -0
- package/lib/types/persist/domain.d.ts +104 -0
- package/lib/types/persist/domain.d.ts.map +1 -0
- package/lib/types/persist/schemas.d.ts +79 -0
- package/lib/types/persist/schemas.d.ts.map +1 -0
- package/lib/types/room/RoomManager.d.ts +142 -0
- package/lib/types/room/RoomManager.d.ts.map +1 -0
- package/lib/types/settle/audit.d.ts +15 -0
- package/lib/types/settle/audit.d.ts.map +1 -0
- package/lib/types/settle/escrow.d.ts +4 -0
- package/lib/types/settle/escrow.d.ts.map +1 -0
- package/lib/types/settle/grant.d.ts +7 -0
- package/lib/types/settle/grant.d.ts.map +1 -0
- package/lib/types/settle/ledger.d.ts +39 -0
- package/lib/types/settle/ledger.d.ts.map +1 -0
- package/lib/types/settle/math.d.ts +12 -0
- package/lib/types/settle/math.d.ts.map +1 -0
- package/lib/types/types.d.ts +253 -0
- package/lib/types/types.d.ts.map +1 -0
- package/package.json +116 -0
- package/prepare.mjs +16 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type BidScore, type Hand, type PlayerId, type Settlement } from '../types.ts';
|
|
2
|
+
export interface ScoreInput {
|
|
3
|
+
readonly hand: Pick<Hand, 'handId' | 'bid' | 'landlordSeat' | 'farmerDoubledBySeat' | 'landlordReDouble' | 'mingPaiMult' | 'bombCount' | 'rocketCount' | 'spring'>;
|
|
4
|
+
readonly stakeAtoms: bigint;
|
|
5
|
+
readonly maxMultiplier: number;
|
|
6
|
+
readonly winner: 'landlord' | 'farmers';
|
|
7
|
+
readonly playerIds: readonly PlayerId[];
|
|
8
|
+
}
|
|
9
|
+
export declare function scoreHand(input: ScoreInput): Settlement;
|
|
10
|
+
export declare function describeBid(bid: BidScore): string;
|
|
11
|
+
//# sourceMappingURL=score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../../../src/engine/score.ts"],"names":[],"mappings":"AAAA,OAAO,EAC8B,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAC/D,KAAK,UAAU,EAC3B,MAAM,aAAa,CAAA;AAGpB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,cAAc,GAAG,qBAAqB,GAAG,kBAAkB,GAAG,aAAa,GAAG,WAAW,GAAG,aAAa,GAAG,QAAQ,CAAC,CAAA;IAClK,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAA;CACxC;AAQD,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAuCvD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAEjD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type PlayerId } from '../types.ts';
|
|
2
|
+
export declare function newPlayerId(): PlayerId;
|
|
3
|
+
export declare function sanitizeDisplayName(raw: string): string;
|
|
4
|
+
export declare function sanitizeRoomTitle(raw: string, fallback?: string): string;
|
|
5
|
+
export declare function sanitizeAvatarUrl(raw: unknown, routePrefix: string): string | null;
|
|
6
|
+
//# sourceMappingURL=player.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../../../../src/identity/player.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGvD,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,MAAM,CAIvE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUlF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import { Config, type PluginConfig } from './config.ts';
|
|
3
|
+
export declare const name = "doudizhu";
|
|
4
|
+
export declare const inject: string[];
|
|
5
|
+
export { Config };
|
|
6
|
+
export declare const DOUDIZHU_NS: import("@deepseek-ai/dsh-settings").SettingsNamespace;
|
|
7
|
+
export declare function apply(ctx: Context, config: PluginConfig): void;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAE,MAAM,EAAiB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAKtE,eAAO,MAAM,IAAI,aAAa,CAAA;AAC9B,eAAO,MAAM,MAAM,UAA4B,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,eAAO,MAAM,WAAW,uDAAgC,CAAA;AAExD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA8B9D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const PACKAGE_NAME = "dsh-poker";
|
|
2
|
+
export declare const CLIENT_ID = "dsh-poker";
|
|
3
|
+
export declare const SUBPROTOCOL = "doudizhu.v1";
|
|
4
|
+
export declare const MAX_FRAME_BYTES: number;
|
|
5
|
+
export declare const MAX_DISPLAY_NAME = 16;
|
|
6
|
+
export declare const MAX_ROOM_TITLE = 24;
|
|
7
|
+
export declare const MAX_CHAT = 80;
|
|
8
|
+
export declare const MAX_SPECTATORS = 16;
|
|
9
|
+
//# sourceMappingURL=invariant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariant.d.ts","sourceRoot":"","sources":["../../../src/invariant.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,cAAc,CAAA;AACvC,eAAO,MAAM,SAAS,cAAc,CAAA;AACpC,eAAO,MAAM,WAAW,gBAAgB,CAAA;AACxC,eAAO,MAAM,eAAe,QAAY,CAAA;AACxC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAClC,eAAO,MAAM,cAAc,KAAK,CAAA;AAChC,eAAO,MAAM,QAAQ,KAAK,CAAA;AAC1B,eAAO,MAAM,cAAc,KAAK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JoinApp.d.ts","sourceRoot":"","sources":["../../../../src/join/JoinApp.tsx"],"names":[],"mappings":"AAUA,wBAAgB,OAAO,gCAsGtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../src/join/main.tsx"],"names":[],"mappings":"AAEA,OAAO,2BAA2B,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IncomingMessage } from '@deepseek-ai/cordis';
|
|
2
|
+
export declare function isLoopbackHost(hostHeader: string | undefined, remoteAddress: string | undefined): boolean;
|
|
3
|
+
export declare function requestOrigin(req: IncomingMessage): string | null;
|
|
4
|
+
export declare function originAllowed(origin: string | null, publicBaseUrl: string, browser: boolean): boolean;
|
|
5
|
+
export declare function isLoopbackOrigin(origin: string): boolean;
|
|
6
|
+
export declare function isBrowserRequest(req: IncomingMessage): boolean;
|
|
7
|
+
export declare function assertOrigin(req: IncomingMessage, publicBaseUrl: string): void;
|
|
8
|
+
export declare function assertMutatingHeaders(req: IncomingMessage): void;
|
|
9
|
+
export declare function parseCookies(req: IncomingMessage): Record<string, string>;
|
|
10
|
+
export declare function cookieHeader(name: string, value: string, opts: {
|
|
11
|
+
secure: boolean;
|
|
12
|
+
sameSite: 'Lax' | 'Strict';
|
|
13
|
+
maxAge?: number;
|
|
14
|
+
}): string;
|
|
15
|
+
export declare function header(req: IncomingMessage, name: string): string | undefined;
|
|
16
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/net/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1D,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAMzG;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAUjE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAKrG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAOxD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAE9D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAO9E;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAMhE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWzE;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,KAAK,GAAG,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE,MAAM,CAUR;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-page.d.ts","sourceRoot":"","sources":["../../../../src/net/join-page.ts"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,IAAI,MAAM,CAerC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgB7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../../src/net/json.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../../src/net/protocol.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,GACrE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/net/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmC,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AASzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAS/F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../../../src/net/views.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAEvD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IncomingMessage } from 'node:http';
|
|
2
|
+
import type { Duplex } from 'node:stream';
|
|
3
|
+
import type { WebServer } from '@deepseek-ai/cordis';
|
|
4
|
+
import type { RoomManager } from '../room/RoomManager.ts';
|
|
5
|
+
export declare function registerDouDizhuSocket(server: WebServer, manager: RoomManager): () => void;
|
|
6
|
+
export declare function protocolOf(req: IncomingMessage): string | undefined;
|
|
7
|
+
export type { Duplex };
|
|
8
|
+
//# sourceMappingURL=ws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../../../src/net/ws.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAWzD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,IAAI,CAmE1F;AAyBD,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAEnE;AAED,YAAY,EAAE,MAAM,EAAE,CAAA"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { type GrantRecord, type HandCheckpoint, type LedgerRecord, type PlayerRecord, type RoomRecord } from './schemas.ts';
|
|
2
|
+
export interface KvLike<V> {
|
|
3
|
+
get(key: string): V | undefined;
|
|
4
|
+
put(key: string, value: V): Promise<void>;
|
|
5
|
+
delete(key: string): Promise<boolean>;
|
|
6
|
+
entries(): IterableIterator<[string, V]>;
|
|
7
|
+
}
|
|
8
|
+
export interface DomainLike {
|
|
9
|
+
tables: {
|
|
10
|
+
rooms: KvLike<RoomRecord>;
|
|
11
|
+
players: KvLike<PlayerRecord>;
|
|
12
|
+
grants: KvLike<GrantRecord>;
|
|
13
|
+
ledger: KvLike<LedgerRecord>;
|
|
14
|
+
hands: KvLike<HandCheckpoint>;
|
|
15
|
+
};
|
|
16
|
+
close(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare const DOUDIZHU_DOMAIN_SPEC: {
|
|
19
|
+
readonly name: "doudizhu";
|
|
20
|
+
readonly version: 1;
|
|
21
|
+
readonly tables: {
|
|
22
|
+
readonly rooms: import("zod").ZodObject<{
|
|
23
|
+
roomId: import("zod").ZodString;
|
|
24
|
+
roomCode: import("zod").ZodString;
|
|
25
|
+
title: import("zod").ZodDefault<import("zod").ZodString>;
|
|
26
|
+
hostPlayerId: import("zod").ZodString;
|
|
27
|
+
phase: import("zod").ZodEnum<{
|
|
28
|
+
waiting: "waiting";
|
|
29
|
+
dealing: "dealing";
|
|
30
|
+
bidding: "bidding";
|
|
31
|
+
doubling: "doubling";
|
|
32
|
+
playing: "playing";
|
|
33
|
+
settling: "settling";
|
|
34
|
+
void: "void";
|
|
35
|
+
closed: "closed";
|
|
36
|
+
}>;
|
|
37
|
+
stakeAtoms: import("zod").ZodString;
|
|
38
|
+
maxMultiplier: import("zod").ZodNumber;
|
|
39
|
+
seatCount: import("zod").ZodDefault<import("zod").ZodUnion<readonly [import("zod").ZodLiteral<3>, import("zod").ZodLiteral<4>]>>;
|
|
40
|
+
laiZi: import("zod").ZodDefault<import("zod").ZodBoolean>;
|
|
41
|
+
inviteExpiresAt: import("zod").ZodString;
|
|
42
|
+
createdAt: import("zod").ZodString;
|
|
43
|
+
shareable: import("zod").ZodBoolean;
|
|
44
|
+
roomSecret: import("zod").ZodString;
|
|
45
|
+
sitInviteHash: import("zod").ZodString;
|
|
46
|
+
watchInviteHash: import("zod").ZodString;
|
|
47
|
+
lastLandlordSeat: import("zod").ZodNullable<import("zod").ZodNumber>;
|
|
48
|
+
}, import("zod/v4/core").$strip>;
|
|
49
|
+
readonly players: import("zod").ZodObject<{
|
|
50
|
+
playerId: import("zod").ZodString;
|
|
51
|
+
displayName: import("zod").ZodString;
|
|
52
|
+
avatarUrl: import("zod").ZodNullable<import("zod").ZodString>;
|
|
53
|
+
availableAtoms: import("zod").ZodString;
|
|
54
|
+
welcomeGranted: import("zod").ZodBoolean;
|
|
55
|
+
createdAt: import("zod").ZodString;
|
|
56
|
+
}, import("zod/v4/core").$strip>;
|
|
57
|
+
readonly grants: import("zod").ZodObject<{
|
|
58
|
+
grantId: import("zod").ZodString;
|
|
59
|
+
playerId: import("zod").ZodString;
|
|
60
|
+
roomId: import("zod").ZodString;
|
|
61
|
+
maxExposureAtoms: import("zod").ZodString;
|
|
62
|
+
issuedAt: import("zod").ZodString;
|
|
63
|
+
expiresAt: import("zod").ZodString;
|
|
64
|
+
source: import("zod").ZodLiteral<"host-welcome">;
|
|
65
|
+
issuedBy: import("zod").ZodLiteral<"room-host">;
|
|
66
|
+
}, import("zod/v4/core").$strip>;
|
|
67
|
+
readonly ledger: import("zod").ZodObject<{
|
|
68
|
+
entryId: import("zod").ZodString;
|
|
69
|
+
ts: import("zod").ZodString;
|
|
70
|
+
roomId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
71
|
+
handId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
72
|
+
settlementId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
73
|
+
from: import("zod").ZodString;
|
|
74
|
+
to: import("zod").ZodString;
|
|
75
|
+
atoms: import("zod").ZodString;
|
|
76
|
+
reason: import("zod").ZodEnum<{
|
|
77
|
+
void: "void";
|
|
78
|
+
welcome: "welcome";
|
|
79
|
+
freeze: "freeze";
|
|
80
|
+
unfreeze: "unfreeze";
|
|
81
|
+
settle: "settle";
|
|
82
|
+
}>;
|
|
83
|
+
prevHash: import("zod").ZodString;
|
|
84
|
+
hash: import("zod").ZodString;
|
|
85
|
+
}, import("zod/v4/core").$strip>;
|
|
86
|
+
readonly hands: import("zod").ZodObject<{
|
|
87
|
+
handId: import("zod").ZodString;
|
|
88
|
+
roomId: import("zod").ZodString;
|
|
89
|
+
sealedHands: import("zod").ZodString;
|
|
90
|
+
publicJson: import("zod").ZodString;
|
|
91
|
+
seq: import("zod").ZodNumber;
|
|
92
|
+
}, import("zod/v4/core").$strip>;
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
export declare class MemoryKv<V> implements KvLike<V> {
|
|
96
|
+
private readonly map;
|
|
97
|
+
get(key: string): V | undefined;
|
|
98
|
+
put(key: string, value: V): Promise<void>;
|
|
99
|
+
delete(key: string): Promise<boolean>;
|
|
100
|
+
entries(): IterableIterator<[string, V]>;
|
|
101
|
+
}
|
|
102
|
+
export declare function createMemoryDomain(): DomainLike;
|
|
103
|
+
export declare function openDoudizhuDomain(storage: unknown): Promise<DomainLike | null>;
|
|
104
|
+
//# sourceMappingURL=domain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../../../src/persist/domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAC7F,MAAM,cAAc,CAAA;AAErB,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAA;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrC,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;CACzC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;QACzB,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;QAC7B,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;QAC3B,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;QAC5B,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;KAC9B,CAAA;IACD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAUvB,CAAA;AAEV,qBAAa,QAAQ,CAAC,CAAC,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAuB;IAC3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAGzB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAGzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAG3C,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;CAGzC;AAED,wBAAgB,kBAAkB,IAAI,UAAU,CAW/C;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAmCrF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const TokenAtomString: z.ZodString;
|
|
3
|
+
export declare const RoomRecordSchema: z.ZodObject<{
|
|
4
|
+
roomId: z.ZodString;
|
|
5
|
+
roomCode: z.ZodString;
|
|
6
|
+
title: z.ZodDefault<z.ZodString>;
|
|
7
|
+
hostPlayerId: z.ZodString;
|
|
8
|
+
phase: z.ZodEnum<{
|
|
9
|
+
waiting: "waiting";
|
|
10
|
+
dealing: "dealing";
|
|
11
|
+
bidding: "bidding";
|
|
12
|
+
doubling: "doubling";
|
|
13
|
+
playing: "playing";
|
|
14
|
+
settling: "settling";
|
|
15
|
+
void: "void";
|
|
16
|
+
closed: "closed";
|
|
17
|
+
}>;
|
|
18
|
+
stakeAtoms: z.ZodString;
|
|
19
|
+
maxMultiplier: z.ZodNumber;
|
|
20
|
+
seatCount: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<3>, z.ZodLiteral<4>]>>;
|
|
21
|
+
laiZi: z.ZodDefault<z.ZodBoolean>;
|
|
22
|
+
inviteExpiresAt: z.ZodString;
|
|
23
|
+
createdAt: z.ZodString;
|
|
24
|
+
shareable: z.ZodBoolean;
|
|
25
|
+
roomSecret: z.ZodString;
|
|
26
|
+
sitInviteHash: z.ZodString;
|
|
27
|
+
watchInviteHash: z.ZodString;
|
|
28
|
+
lastLandlordSeat: z.ZodNullable<z.ZodNumber>;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
export declare const PlayerRecordSchema: z.ZodObject<{
|
|
31
|
+
playerId: z.ZodString;
|
|
32
|
+
displayName: z.ZodString;
|
|
33
|
+
avatarUrl: z.ZodNullable<z.ZodString>;
|
|
34
|
+
availableAtoms: z.ZodString;
|
|
35
|
+
welcomeGranted: z.ZodBoolean;
|
|
36
|
+
createdAt: z.ZodString;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
export declare const TokenGrantSchema: z.ZodObject<{
|
|
39
|
+
grantId: z.ZodString;
|
|
40
|
+
playerId: z.ZodString;
|
|
41
|
+
roomId: z.ZodString;
|
|
42
|
+
maxExposureAtoms: z.ZodString;
|
|
43
|
+
issuedAt: z.ZodString;
|
|
44
|
+
expiresAt: z.ZodString;
|
|
45
|
+
source: z.ZodLiteral<"host-welcome">;
|
|
46
|
+
issuedBy: z.ZodLiteral<"room-host">;
|
|
47
|
+
}, z.core.$strip>;
|
|
48
|
+
export declare const LedgerEntrySchema: z.ZodObject<{
|
|
49
|
+
entryId: z.ZodString;
|
|
50
|
+
ts: z.ZodString;
|
|
51
|
+
roomId: z.ZodOptional<z.ZodString>;
|
|
52
|
+
handId: z.ZodOptional<z.ZodString>;
|
|
53
|
+
settlementId: z.ZodOptional<z.ZodString>;
|
|
54
|
+
from: z.ZodString;
|
|
55
|
+
to: z.ZodString;
|
|
56
|
+
atoms: z.ZodString;
|
|
57
|
+
reason: z.ZodEnum<{
|
|
58
|
+
void: "void";
|
|
59
|
+
welcome: "welcome";
|
|
60
|
+
freeze: "freeze";
|
|
61
|
+
unfreeze: "unfreeze";
|
|
62
|
+
settle: "settle";
|
|
63
|
+
}>;
|
|
64
|
+
prevHash: z.ZodString;
|
|
65
|
+
hash: z.ZodString;
|
|
66
|
+
}, z.core.$strip>;
|
|
67
|
+
export declare const HandCheckpointSchema: z.ZodObject<{
|
|
68
|
+
handId: z.ZodString;
|
|
69
|
+
roomId: z.ZodString;
|
|
70
|
+
sealedHands: z.ZodString;
|
|
71
|
+
publicJson: z.ZodString;
|
|
72
|
+
seq: z.ZodNumber;
|
|
73
|
+
}, z.core.$strip>;
|
|
74
|
+
export type RoomRecord = z.infer<typeof RoomRecordSchema>;
|
|
75
|
+
export type PlayerRecord = z.infer<typeof PlayerRecordSchema>;
|
|
76
|
+
export type GrantRecord = z.infer<typeof TokenGrantSchema>;
|
|
77
|
+
export type LedgerRecord = z.infer<typeof LedgerEntrySchema>;
|
|
78
|
+
export type HandCheckpoint = z.infer<typeof HandCheckpointSchema>;
|
|
79
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../../src/persist/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,eAAe,aAA8B,CAAA;AAE1D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiB3B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;;;;iBAO7B,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;iBAS3B,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;iBAY5B,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;iBAM/B,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AACzD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAC7D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { type HealthCounters } from '../settle/audit.ts';
|
|
2
|
+
import { type ClientCommand, type PlayerId, type PlayerView, type RejectCode, type RoomId, type Seat, type SeatCount, type ServerEvent } from '../types.ts';
|
|
3
|
+
import { type PluginConfig, type ResolvedConfig } from '../config.ts';
|
|
4
|
+
export interface JoinRequest {
|
|
5
|
+
roomCode: string;
|
|
6
|
+
invite: string;
|
|
7
|
+
displayName: string;
|
|
8
|
+
role: 'sit' | 'watch';
|
|
9
|
+
local?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface JoinResult {
|
|
12
|
+
playerId: PlayerId;
|
|
13
|
+
roomId: RoomId;
|
|
14
|
+
seat: Seat | null;
|
|
15
|
+
wsTicket: string;
|
|
16
|
+
cookie: string;
|
|
17
|
+
view: PlayerView;
|
|
18
|
+
}
|
|
19
|
+
export interface CreateRoomRequest {
|
|
20
|
+
stakeM: number;
|
|
21
|
+
maxMultiplier: number;
|
|
22
|
+
seatCount?: SeatCount;
|
|
23
|
+
laiZi?: boolean;
|
|
24
|
+
hostDisplayName?: string;
|
|
25
|
+
title?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface CreateRoomResult {
|
|
28
|
+
roomId: RoomId;
|
|
29
|
+
roomCode: string;
|
|
30
|
+
sitUrl: string;
|
|
31
|
+
watchUrl: string;
|
|
32
|
+
seatCapAtoms: string;
|
|
33
|
+
shareable: boolean;
|
|
34
|
+
hostCookie: string;
|
|
35
|
+
hostPlayerId: PlayerId;
|
|
36
|
+
view: PlayerView;
|
|
37
|
+
}
|
|
38
|
+
export interface Session {
|
|
39
|
+
cookie: string;
|
|
40
|
+
playerId: PlayerId;
|
|
41
|
+
roomId: RoomId;
|
|
42
|
+
kind: 'seat' | 'watch' | 'host';
|
|
43
|
+
expiresAt: number;
|
|
44
|
+
}
|
|
45
|
+
interface Ticket {
|
|
46
|
+
playerId: PlayerId;
|
|
47
|
+
roomId: RoomId;
|
|
48
|
+
expiresAt: number;
|
|
49
|
+
}
|
|
50
|
+
export type ViewListener = (playerId: PlayerId, event: ServerEvent) => void;
|
|
51
|
+
export declare class RoomManager {
|
|
52
|
+
private readonly ctx;
|
|
53
|
+
private config;
|
|
54
|
+
private domain;
|
|
55
|
+
private ledger;
|
|
56
|
+
private readonly rooms;
|
|
57
|
+
private readonly roomsByCode;
|
|
58
|
+
private readonly sessions;
|
|
59
|
+
private readonly tickets;
|
|
60
|
+
private readonly hostCookies;
|
|
61
|
+
private readonly listeners;
|
|
62
|
+
private readonly timers;
|
|
63
|
+
readonly counters: HealthCounters & {
|
|
64
|
+
startedAt: number;
|
|
65
|
+
bump(key: Exclude<keyof HealthCounters, "needsAudit" | "uptimeMs" | "roomsActive" | "wsConnected">): void;
|
|
66
|
+
};
|
|
67
|
+
private persistReady;
|
|
68
|
+
constructor(ctx: {
|
|
69
|
+
logger?: {
|
|
70
|
+
warn(message: unknown): void;
|
|
71
|
+
info(message: unknown): void;
|
|
72
|
+
};
|
|
73
|
+
webServer?: {
|
|
74
|
+
port?: number;
|
|
75
|
+
};
|
|
76
|
+
} | null, config: PluginConfig, storage: unknown);
|
|
77
|
+
ready(): Promise<void>;
|
|
78
|
+
replaceConfig(config: PluginConfig): void;
|
|
79
|
+
getConfig(): ResolvedConfig;
|
|
80
|
+
onEvent(listener: ViewListener): () => void;
|
|
81
|
+
dispose(): Promise<void>;
|
|
82
|
+
health(): HealthCounters;
|
|
83
|
+
createRoom(req: CreateRoomRequest, hostCookie?: string): Promise<CreateRoomResult>;
|
|
84
|
+
join(req: JoinRequest): Promise<JoinResult>;
|
|
85
|
+
sessionByCookie(cookie: string | undefined): Session | undefined;
|
|
86
|
+
isHostCookie(cookie: string | undefined): boolean;
|
|
87
|
+
consumeTicket(ticket: string): Ticket | undefined;
|
|
88
|
+
issueTicket(playerId: PlayerId, roomId: RoomId): string;
|
|
89
|
+
view(roomId: RoomId, playerId: PlayerId): PlayerView;
|
|
90
|
+
eventsSince(roomId: RoomId, playerId: PlayerId, seq: number): {
|
|
91
|
+
events: ServerEvent[];
|
|
92
|
+
untilSeq: number;
|
|
93
|
+
};
|
|
94
|
+
ledgerFor(playerId: PlayerId): import("../settle/ledger.ts").LedgerSnapshot;
|
|
95
|
+
command(roomId: RoomId, playerId: PlayerId, command: ClientCommand, isHost?: boolean): Promise<{
|
|
96
|
+
seq: number;
|
|
97
|
+
}>;
|
|
98
|
+
markConnected(playerId: PlayerId, roomId: RoomId): void;
|
|
99
|
+
markDisconnected(playerId: PlayerId, roomId: RoomId): void;
|
|
100
|
+
listenPort: () => number;
|
|
101
|
+
private hydrate;
|
|
102
|
+
private uniqueCode;
|
|
103
|
+
private roomByCode;
|
|
104
|
+
private requireRoom;
|
|
105
|
+
private firstEmptySeat;
|
|
106
|
+
private addSpectator;
|
|
107
|
+
private sitInternal;
|
|
108
|
+
private stand;
|
|
109
|
+
private setReady;
|
|
110
|
+
private maybeDeal;
|
|
111
|
+
private bid;
|
|
112
|
+
private mingPai;
|
|
113
|
+
private rename;
|
|
114
|
+
private double;
|
|
115
|
+
private play;
|
|
116
|
+
private pass;
|
|
117
|
+
private chat;
|
|
118
|
+
private rematch;
|
|
119
|
+
private kick;
|
|
120
|
+
private closeRoom;
|
|
121
|
+
private settle;
|
|
122
|
+
private voidHand;
|
|
123
|
+
private onTick;
|
|
124
|
+
private requireEngine;
|
|
125
|
+
private requireSeat;
|
|
126
|
+
private seatOf;
|
|
127
|
+
private displayNameOf;
|
|
128
|
+
private patchSeat;
|
|
129
|
+
private setConnected;
|
|
130
|
+
private viewFor;
|
|
131
|
+
private revealedHands;
|
|
132
|
+
private remainingRanks;
|
|
133
|
+
private persistRoom;
|
|
134
|
+
private broadcast;
|
|
135
|
+
private push;
|
|
136
|
+
private emit;
|
|
137
|
+
}
|
|
138
|
+
export declare function fail(code: RejectCode, reason: string): Error & {
|
|
139
|
+
code: RejectCode;
|
|
140
|
+
};
|
|
141
|
+
export {};
|
|
142
|
+
//# sourceMappingURL=RoomManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoomManager.d.ts","sourceRoot":"","sources":["../../../../src/room/RoomManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface HealthCounters {
|
|
2
|
+
roomsActive: number;
|
|
3
|
+
handsStarted: number;
|
|
4
|
+
handsVoided: number;
|
|
5
|
+
wsConnected: number;
|
|
6
|
+
cmdRejected: number;
|
|
7
|
+
settlementsCommitted: number;
|
|
8
|
+
needsAudit: boolean;
|
|
9
|
+
uptimeMs: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function createCounters(startedAt?: number): HealthCounters & {
|
|
12
|
+
startedAt: number;
|
|
13
|
+
bump(key: Exclude<keyof HealthCounters, 'needsAudit' | 'uptimeMs' | 'roomsActive' | 'wsConnected'>): void;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../../src/settle/audit.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,cAAc,CAAC,SAAS,SAAa,GAAG,cAAc,GAAG;IACvE,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,cAAc,EAAE,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,CAAC,GAAG,IAAI,CAAA;CAC1G,CAiBA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escrow.d.ts","sourceRoot":"","sources":["../../../../src/settle/escrow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,CAAA;AAEvB,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAE9F"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DomainLike } from '../persist/domain.ts';
|
|
2
|
+
import type { GrantRecord } from '../persist/schemas.ts';
|
|
3
|
+
import { type GrantId, type PlayerId, type RoomId, type TokenGrant } from '../types.ts';
|
|
4
|
+
export declare function issueHostGrant(playerId: PlayerId, roomId: RoomId, maxExposureAtoms: bigint, ttlHours?: number): TokenGrant;
|
|
5
|
+
export declare function persistGrant(domain: DomainLike, grant: TokenGrant): Promise<void>;
|
|
6
|
+
export declare function grantRecord(domain: DomainLike, grantId: GrantId): GrantRecord | undefined;
|
|
7
|
+
//# sourceMappingURL=grant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grant.d.ts","sourceRoot":"","sources":["../../../../src/settle/grant.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAgC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAErH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,QAAQ,SAAK,GACZ,UAAU,CAYZ;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAEzF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { DomainLike } from '../persist/domain.ts';
|
|
2
|
+
import type { LedgerRecord, PlayerRecord } from '../persist/schemas.ts';
|
|
3
|
+
import { type PlayerId, type TokenAtomString } from '../types.ts';
|
|
4
|
+
export type LedgerReason = LedgerRecord['reason'];
|
|
5
|
+
export interface LedgerSnapshot {
|
|
6
|
+
readonly availableAtoms: TokenAtomString;
|
|
7
|
+
readonly escrowAtoms: TokenAtomString;
|
|
8
|
+
readonly entries: readonly LedgerRecord[];
|
|
9
|
+
}
|
|
10
|
+
export declare class Ledger {
|
|
11
|
+
private readonly domain;
|
|
12
|
+
private welcomeAtoms;
|
|
13
|
+
private tipHash;
|
|
14
|
+
private readonly escrow;
|
|
15
|
+
constructor(domain: DomainLike, welcomeAtoms: bigint);
|
|
16
|
+
getAvailable(playerId: PlayerId): bigint;
|
|
17
|
+
getEscrow(playerId: PlayerId): bigint;
|
|
18
|
+
snapshot(playerId: PlayerId): LedgerSnapshot;
|
|
19
|
+
ensurePlayer(playerId: PlayerId, displayName: string, avatarUrl: string | null): Promise<PlayerRecord>;
|
|
20
|
+
grantWelcome(playerId: PlayerId, row?: {
|
|
21
|
+
playerId: string;
|
|
22
|
+
displayName: string;
|
|
23
|
+
avatarUrl: string | null;
|
|
24
|
+
availableAtoms: string;
|
|
25
|
+
welcomeGranted: boolean;
|
|
26
|
+
createdAt: string;
|
|
27
|
+
} | undefined): Promise<PlayerRecord>;
|
|
28
|
+
freeze(playerId: PlayerId, atoms: bigint, roomId: string): Promise<void>;
|
|
29
|
+
unfreeze(playerId: PlayerId, atoms: bigint, roomId: string, reason?: 'unfreeze' | 'void'): Promise<void>;
|
|
30
|
+
settleTransfer(from: PlayerId, to: PlayerId, atoms: bigint, meta: {
|
|
31
|
+
roomId: string;
|
|
32
|
+
handId: string;
|
|
33
|
+
settlementId: string;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
replaceWelcome(welcomeAtoms: bigint): void;
|
|
36
|
+
private applyAvailable;
|
|
37
|
+
private append;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../../../src/settle/ledger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACvE,OAAO,EAAwD,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAEvH,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;AAEjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAA;IACxC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAA;CAC1C;AAED,qBAAa,MAAM;IAKf,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,YAAY;IALtB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;gBAGlC,MAAM,EAAE,UAAU,EAC3B,YAAY,EAAE,MAAM;IAK9B,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;IAKxC,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;IAIrC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc;IAWtC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAsBtG,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG;;;;;;;iBAA2C,GAAG,OAAO,CAAC,YAAY,CAAC;IAavG,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,UAAU,GAAG,MAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAapH,cAAc,CAClB,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAC7D,OAAO,CAAC,IAAI,CAAC;IAsBhB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;YAI5B,cAAc;YAuBd,MAAM;CAWrB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const STAKE_LADDER_M: readonly [1, 2, 5, 10, 20, 50, 100];
|
|
2
|
+
export declare const DEFAULT_STAKE_M = 1;
|
|
3
|
+
export declare const DEFAULT_MAX_MULTIPLIER = 8;
|
|
4
|
+
export declare const DEFAULT_WELCOME_ATOMS = 200000000n;
|
|
5
|
+
export declare const ATOMS_PER_M = 1000000n;
|
|
6
|
+
export declare const ATOMS_PER_B = 1000000000n;
|
|
7
|
+
export declare function stakeAtomsFromM(stakeM: number): bigint;
|
|
8
|
+
export declare function perFarmerCapAtoms(stakeAtoms: bigint, maxMultiplier: number): bigint;
|
|
9
|
+
export declare function seatCapAtoms(stakeAtoms: bigint, maxMultiplier: number, seatCount?: 3 | 4): bigint;
|
|
10
|
+
/** Display token atoms as AI-token units: M (million) or B (billion). Never dump raw zeros. */
|
|
11
|
+
export declare function formatM(atoms: bigint): string;
|
|
12
|
+
//# sourceMappingURL=math.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../../../src/settle/math.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,qCAAsC,CAAA;AACjE,eAAO,MAAM,eAAe,IAAI,CAAA;AAChC,eAAO,MAAM,sBAAsB,IAAI,CAAA;AACvC,eAAO,MAAM,qBAAqB,aAAe,CAAA;AACjD,eAAO,MAAM,WAAW,WAAa,CAAA;AACrC,eAAO,MAAM,WAAW,cAAiB,CAAA;AAEzC,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,GAAE,CAAC,GAAG,CAAK,GAAG,MAAM,CAGpG;AAED,+FAA+F;AAC/F,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK7C"}
|