digital-boardgame-framework 0.6.0 → 0.8.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.
Files changed (38) hide show
  1. package/dist/client/chat-panel.d.ts +16 -0
  2. package/dist/client/chat-panel.d.ts.map +1 -0
  3. package/dist/client/chat-panel.js +31 -0
  4. package/dist/client/chat-panel.js.map +1 -0
  5. package/dist/client/index.d.ts +4 -0
  6. package/dist/client/index.d.ts.map +1 -1
  7. package/dist/client/index.js +2 -0
  8. package/dist/client/index.js.map +1 -1
  9. package/dist/client/realtime.d.ts +3 -0
  10. package/dist/client/realtime.d.ts.map +1 -1
  11. package/dist/client/realtime.js +1 -1
  12. package/dist/client/realtime.js.map +1 -1
  13. package/dist/client/use-messages.d.ts +35 -0
  14. package/dist/client/use-messages.d.ts.map +1 -0
  15. package/dist/client/use-messages.js +85 -0
  16. package/dist/client/use-messages.js.map +1 -0
  17. package/dist/server/game-server.d.ts +36 -1
  18. package/dist/server/game-server.d.ts.map +1 -1
  19. package/dist/server/game-server.js +103 -0
  20. package/dist/server/game-server.js.map +1 -1
  21. package/dist/server/index.d.ts +1 -1
  22. package/dist/server/index.d.ts.map +1 -1
  23. package/dist/server/realtime.d.ts +6 -0
  24. package/dist/server/realtime.d.ts.map +1 -1
  25. package/dist/server/realtime.js +8 -1
  26. package/dist/server/realtime.js.map +1 -1
  27. package/dist/server/store.d.ts +22 -0
  28. package/dist/server/store.d.ts.map +1 -1
  29. package/dist/server/stores/fs-store.d.ts +4 -1
  30. package/dist/server/stores/fs-store.d.ts.map +1 -1
  31. package/dist/server/stores/fs-store.js +37 -0
  32. package/dist/server/stores/fs-store.js.map +1 -1
  33. package/dist/server/stores/supabase-store.d.ts +5 -1
  34. package/dist/server/stores/supabase-store.d.ts.map +1 -1
  35. package/dist/server/stores/supabase-store.js +35 -7
  36. package/dist/server/stores/supabase-store.js.map +1 -1
  37. package/package.json +1 -1
  38. package/supabase/schema.sql +16 -1
@@ -0,0 +1,16 @@
1
+ import { type CSSProperties } from 'react';
2
+ import { type MessagingClientApi, type UseMessagesOpts } from './use-messages.js';
3
+ /** Drop-in collapsible chat panel built on `useMessages`. Restyle via
4
+ * `className`/`style`, or skip it and build your own UI on the hook. */
5
+ export interface ChatPanelProps extends UseMessagesOpts {
6
+ client: MessagingClientApi;
7
+ /** The viewer's own seat — used to label/align their messages. */
8
+ you: string;
9
+ /** Map a seat id to a display label (default: the raw seat). */
10
+ seatLabel?: (seat: string) => string;
11
+ title?: string;
12
+ className?: string;
13
+ style?: CSSProperties;
14
+ }
15
+ export declare function ChatPanel({ client, you, seatLabel, title, className, style, ...opts }: ChatPanelProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=chat-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-panel.d.ts","sourceRoot":"","sources":["../../src/client/chat-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAe,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE/F;yEACyE;AACzE,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAYD,wBAAgB,SAAS,CAAC,EACxB,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAkB,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EACtE,EAAE,cAAc,2CAkDhB"}
@@ -0,0 +1,31 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useMessages } from './use-messages.js';
4
+ const panel = {
5
+ display: 'flex', flexDirection: 'column', gap: 6, maxWidth: 320,
6
+ background: '#17142480', border: '1px solid #ffffff1f', borderRadius: 10,
7
+ padding: 8, fontFamily: 'system-ui, sans-serif', fontSize: 13, color: '#e8e6f2',
8
+ };
9
+ const log = { maxHeight: 200, overflowY: 'auto', display: 'flex', flexDirection: 'column', gap: 4 };
10
+ const inputRow = { display: 'flex', gap: 6 };
11
+ const input = { flex: 1, background: '#0c0a14', color: '#e8e6f2', border: '1px solid #ffffff2e', borderRadius: 6, padding: '5px 8px', fontSize: 13 };
12
+ const sendBtn = { background: '#5a3380', color: 'white', border: 'none', borderRadius: 6, padding: '5px 12px', cursor: 'pointer', fontSize: 13 };
13
+ export function ChatPanel({ client, you, seatLabel, title = 'Messages', className, style, ...opts }) {
14
+ const { messages, send, sending, error } = useMessages(client, opts);
15
+ const [open, setOpen] = useState(false);
16
+ const [text, setText] = useState('');
17
+ const label = (s) => (seatLabel ? seatLabel(s) : s);
18
+ async function onSend() {
19
+ const t = text.trim();
20
+ if (!t)
21
+ return;
22
+ try {
23
+ await send(t);
24
+ setText('');
25
+ }
26
+ catch { /* error surfaced below */ }
27
+ }
28
+ return (_jsxs("div", { className: className, style: { ...panel, ...style }, children: [_jsxs("button", { type: "button", onClick: () => setOpen((o) => !o), style: { background: 'transparent', border: 'none', color: '#cbd', cursor: 'pointer', textAlign: 'left', fontSize: 13 }, children: ["\uD83D\uDCAC ", title, messages.length ? ` (${messages.length})` : '', " ", open ? '▾' : '▸'] }), open && (_jsxs(_Fragment, { children: [_jsxs("div", { style: log, children: [messages.length === 0 && _jsx("div", { style: { color: '#778', fontStyle: 'italic' }, children: "No messages yet." }), messages.map((m, i) => (_jsxs("div", { style: { textAlign: m.seat === you ? 'right' : 'left' }, children: [_jsxs("span", { style: { color: '#889', fontSize: 11 }, children: [m.seat === you ? 'You' : label(m.seat), ": "] }), _jsx("span", { children: m.body })] }, i)))] }), _jsxs("div", { style: inputRow, children: [_jsx("input", { style: input, value: text, placeholder: "Message\u2026", onChange: (e) => setText(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter')
29
+ onSend(); }, maxLength: 500 }), _jsx("button", { type: "button", style: sendBtn, onClick: onSend, disabled: sending, children: sending ? '…' : 'Send' })] }), error && _jsxs("div", { style: { color: '#f88', fontSize: 11 }, children: ["Couldn\u2019t send \u2014 ", error.message] })] }))] }));
30
+ }
31
+ //# sourceMappingURL=chat-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-panel.js","sourceRoot":"","sources":["../../src/client/chat-panel.tsx"],"names":[],"mappings":"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"}
@@ -4,4 +4,8 @@ export { useVersionCheck } from './use-version-check.js';
4
4
  export type { UseVersionCheckOpts, UseVersionCheckResult } from './use-version-check.js';
5
5
  export { UpdateBanner } from './update-banner.js';
6
6
  export type { UpdateBannerProps } from './update-banner.js';
7
+ export { useMessages } from './use-messages.js';
8
+ export type { ChatMessage, MessagingClientApi, UseMessagesOpts, UseMessagesResult, } from './use-messages.js';
9
+ export { ChatPanel } from './chat-panel.js';
10
+ export type { ChatPanelProps } from './chat-panel.js';
7
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EACV,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,iBAAiB,GACpE,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,4 +1,6 @@
1
1
  export { useGame } from './use-game.js';
2
2
  export { useVersionCheck } from './use-version-check.js';
3
3
  export { UpdateBanner } from './update-banner.js';
4
+ export { useMessages } from './use-messages.js';
5
+ export { ChatPanel } from './chat-panel.js';
4
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
@@ -5,6 +5,9 @@ export interface SupabaseRealtimeOpts {
5
5
  gameId: string;
6
6
  /** Must match the server broadcaster's topicPrefix. Default 'game:'. */
7
7
  topicPrefix?: string;
8
+ /** Broadcast event to listen for. Default 'moved' (a move). Use 'message'
9
+ * for chat (pair with useMessages). */
10
+ event?: string;
8
11
  }
9
12
  /** Build a `subscribe` fn for `useGame({ subscribe })`. */
10
13
  export declare function subscribeSupabaseRealtime(opts: SupabaseRealtimeOpts): (onChange: () => void) => () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/client/realtime.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,2DAA2D;AAC3D,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,oBAAoB,GACzB,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAetC"}
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/client/realtime.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;4CACwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2DAA2D;AAC3D,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,oBAAoB,GACzB,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAetC"}
@@ -15,7 +15,7 @@ export function subscribeSupabaseRealtime(opts) {
15
15
  const topic = `${opts.topicPrefix ?? 'game:'}${opts.gameId}`;
16
16
  const channel = client
17
17
  .channel(topic)
18
- .on('broadcast', { event: 'moved' }, () => onChange())
18
+ .on('broadcast', { event: opts.event ?? 'moved' }, () => onChange())
19
19
  .subscribe();
20
20
  return () => {
21
21
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/client/realtime.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,iFAAiF;AACjF,6EAA6E;AAC7E,6EAA6E;AAC7E,EAAE;AACF,6EAA6E;AAC7E,sDAAsD;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAWrD,2DAA2D;AAC3D,MAAM,UAAU,yBAAyB,CACvC,IAA0B;IAE1B,OAAO,CAAC,QAAQ,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE;YAC1D,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE;SAChC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM;aACnB,OAAO,CAAC,KAAK,CAAC;aACd,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;aACrD,SAAS,EAAE,CAAC;QACf,OAAO,GAAG,EAAE;YACV,IAAI,CAAC;gBAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACrD,IAAI,CAAC;gBAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC5D,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/client/realtime.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,iFAAiF;AACjF,6EAA6E;AAC7E,6EAA6E;AAC7E,EAAE;AACF,6EAA6E;AAC7E,sDAAsD;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAcrD,2DAA2D;AAC3D,MAAM,UAAU,yBAAyB,CACvC,IAA0B;IAE1B,OAAO,CAAC,QAAQ,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE;YAC1D,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE;SAChC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM;aACnB,OAAO,CAAC,KAAK,CAAC;aACd,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;aACnE,SAAS,EAAE,CAAC;QACf,OAAO,GAAG,EAAE;YACV,IAAI,CAAC;gBAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACrD,IAAI,CAAC;gBAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC5D,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** A chat message as the client sees it (mirrors the server's ChatMessage). */
2
+ export interface ChatMessage {
3
+ seat: string;
4
+ body: string;
5
+ at: string;
6
+ }
7
+ /** Transport the hook talks to — the consumer implements it (HTTP to the
8
+ * game's chat endpoints), exactly like GameClientApi for moves. Both calls
9
+ * return the refreshed message list. */
10
+ export interface MessagingClientApi {
11
+ listMessages(): Promise<ChatMessage[]>;
12
+ postMessage(body: string): Promise<ChatMessage[]>;
13
+ }
14
+ export interface UseMessagesOpts {
15
+ /** Poll interval (ms). Default 12_000, or 30_000 when `subscribe` is given
16
+ * (push drives the fast updates; polling is a fallback). */
17
+ pollMs?: number;
18
+ pauseWhenHidden?: boolean;
19
+ /** Optional realtime push: given a callback, set up a subscription that fires
20
+ * it when a new message arrives (e.g. Supabase Realtime "message" broadcast);
21
+ * return an unsubscribe fn. */
22
+ subscribe?: (onChange: () => void) => () => void;
23
+ }
24
+ export interface UseMessagesResult {
25
+ messages: ChatMessage[];
26
+ send: (body: string) => Promise<void>;
27
+ sending: boolean;
28
+ error: Error | null;
29
+ refresh: () => Promise<void>;
30
+ }
31
+ /** Chat hook: fetches messages (poll + optional realtime push) and sends them.
32
+ * Transport-agnostic — the framework only needs the "something changed" signal
33
+ * and a post/list client. */
34
+ export declare function useMessages(client: MessagingClientApi, opts?: UseMessagesOpts): UseMessagesResult;
35
+ //# sourceMappingURL=use-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-messages.d.ts","sourceRoot":"","sources":["../../src/client/use-messages.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;yCAEyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,eAAe;IAC9B;iEAC6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;oCAEgC;IAChC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;8BAE8B;AAC9B,wBAAgB,WAAW,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,GAAE,eAAoB,GAAG,iBAAiB,CA6DrG"}
@@ -0,0 +1,85 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ /** Chat hook: fetches messages (poll + optional realtime push) and sends them.
3
+ * Transport-agnostic — the framework only needs the "something changed" signal
4
+ * and a post/list client. */
5
+ export function useMessages(client, opts = {}) {
6
+ const [messages, setMessages] = useState([]);
7
+ const [sending, setSending] = useState(false);
8
+ const [error, setError] = useState(null);
9
+ const mounted = useRef(false);
10
+ const refresh = useCallback(async () => {
11
+ try {
12
+ const m = await client.listMessages();
13
+ if (mounted.current) {
14
+ setMessages(m);
15
+ setError(null);
16
+ }
17
+ }
18
+ catch (e) {
19
+ if (mounted.current)
20
+ setError(e instanceof Error ? e : new Error(String(e)));
21
+ }
22
+ }, [client]);
23
+ const send = useCallback(async (body) => {
24
+ const text = body.trim();
25
+ if (!text || sending)
26
+ return;
27
+ setSending(true);
28
+ try {
29
+ const m = await client.postMessage(text);
30
+ if (mounted.current) {
31
+ setMessages(m);
32
+ setError(null);
33
+ }
34
+ }
35
+ catch (e) {
36
+ if (mounted.current)
37
+ setError(e instanceof Error ? e : new Error(String(e)));
38
+ throw e;
39
+ }
40
+ finally {
41
+ if (mounted.current)
42
+ setSending(false);
43
+ }
44
+ }, [client, sending]);
45
+ useEffect(() => {
46
+ mounted.current = true;
47
+ refresh();
48
+ const ms = opts.pollMs ?? (opts.subscribe ? 30_000 : 12_000);
49
+ let handle = null;
50
+ const start = () => { if (!handle)
51
+ handle = setInterval(refresh, ms); };
52
+ const stop = () => { if (handle) {
53
+ clearInterval(handle);
54
+ handle = null;
55
+ } };
56
+ start();
57
+ const pauseWhenHidden = opts.pauseWhenHidden !== false;
58
+ const onVis = () => {
59
+ if (!pauseWhenHidden || typeof document === 'undefined')
60
+ return;
61
+ if (document.visibilityState === 'hidden')
62
+ stop();
63
+ else {
64
+ refresh();
65
+ start();
66
+ }
67
+ };
68
+ if (pauseWhenHidden && typeof document !== 'undefined') {
69
+ document.addEventListener('visibilitychange', onVis);
70
+ }
71
+ let unsubscribe;
72
+ if (opts.subscribe)
73
+ unsubscribe = opts.subscribe(() => { refresh(); });
74
+ return () => {
75
+ mounted.current = false;
76
+ stop();
77
+ if (typeof document !== 'undefined')
78
+ document.removeEventListener('visibilitychange', onVis);
79
+ if (unsubscribe)
80
+ unsubscribe();
81
+ };
82
+ }, [refresh, opts.pollMs, opts.pauseWhenHidden, opts.subscribe]);
83
+ return { messages, send, sending, error, refresh };
84
+ }
85
+ //# sourceMappingURL=use-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-messages.js","sourceRoot":"","sources":["../../src/client/use-messages.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { GameAdapter } from '../core/adapter.js';
2
2
  import type { Codec } from '../core/codec.js';
3
3
  import type { LogEntry } from '../core/log.js';
4
- import type { SnapshotStore, BugReportRow, ReportFilter } from './store.js';
4
+ import type { SnapshotStore, BugReportRow, ReportFilter, ChatMessage } from './store.js';
5
5
  import type { Notifier } from './notify.js';
6
6
  import type { ReportForwarder } from './forward.js';
7
7
  import type { GameBroadcaster } from './realtime.js';
@@ -53,6 +53,7 @@ export interface ReportSubmission {
53
53
  }
54
54
  export declare class GameServer<S, A, P extends string = string> {
55
55
  private opts;
56
+ private static readonly MESSAGE_MAX_LEN;
56
57
  constructor(opts: GameServerOpts<S, A, P>);
57
58
  createGame(args: CreateGameArgs<S, P>): Promise<CreateGameResult<P>>;
58
59
  fetch(gameId: string, token: string): Promise<ViewResult<S>>;
@@ -66,6 +67,40 @@ export declare class GameServer<S, A, P extends string = string> {
66
67
  report(gameId: string, token: string, body: ReportSubmission): Promise<{
67
68
  reportId: string;
68
69
  }>;
70
+ /**
71
+ * Scheduled stale-turn reminders. Call periodically (e.g. from a Cloudflare
72
+ * Cron Trigger) so the player on the clock gets an "it's your turn" email even
73
+ * when NO client is open — the gap that makes request-driven reminders miss
74
+ * vs-AI games (the AI has no client to drive a refresh).
75
+ *
76
+ * For each active game it reads the latest snapshot, computes `currentActor`
77
+ * (robust — works whether the snapshot was written by a human submit or a
78
+ * server-side AI advance), and runs an inactivity clock kept in `meta.reminder`:
79
+ * - new turn since last sweep → (re)start the clock, no email;
80
+ * - same turn, idle ≥ `olderThanMs`, not yet sent, actor has an email →
81
+ * `notifier.notifyYourTurn`, mark sent (once per turn);
82
+ * - game over → mark the game resolved (sweep cleanup).
83
+ *
84
+ * Clock granularity is the sweep interval (the clock starts when a sweep first
85
+ * observes a turn), which is fine for hour/day-scale reminders. Best-effort:
86
+ * a per-game failure is logged and skipped, never thrown.
87
+ */
88
+ sweepTurnReminders(opts: {
89
+ olderThanMs: number;
90
+ nowMs?: number;
91
+ }): Promise<{
92
+ scanned: number;
93
+ reminded: number;
94
+ resolvedMarked: number;
95
+ }>;
96
+ /** Post a chat message. Auth-gated: only a seat in this game may post, and the
97
+ * sender is stamped from the token (never trusted from the client, so you
98
+ * can't post as your opponent). Body is trimmed + capped. Returns the
99
+ * refreshed message list. Best-effort realtime "message" ping after storing. */
100
+ postMessage(gameId: string, token: string, body: string): Promise<ChatMessage[]>;
101
+ /** Read chat. Auth-gated — only a seat in this game may read (chat is private
102
+ * to the participants). Chronological order. */
103
+ listMessages(gameId: string, token: string, limit?: number): Promise<ChatMessage[]>;
69
104
  listReports(filter?: ReportFilter): Promise<BugReportRow[]>;
70
105
  resolveReport(reportId: string, resolution: string): Promise<void>;
71
106
  private get schemaVersion();
@@ -1 +1 @@
1
- {"version":3,"file":"game-server.d.ts","sourceRoot":"","sources":["../../src/server/game-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"game-server.d.ts","sourceRoot":"","sources":["../../src/server/game-server.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ function splitSnapshotVersion(raw) {
12
12
  }
13
13
  export class GameServer {
14
14
  opts;
15
+ static MESSAGE_MAX_LEN = 500;
15
16
  constructor(opts) {
16
17
  this.opts = opts;
17
18
  }
@@ -178,6 +179,108 @@ export class GameServer {
178
179
  }
179
180
  return { reportId: row.reportId };
180
181
  }
182
+ /**
183
+ * Scheduled stale-turn reminders. Call periodically (e.g. from a Cloudflare
184
+ * Cron Trigger) so the player on the clock gets an "it's your turn" email even
185
+ * when NO client is open — the gap that makes request-driven reminders miss
186
+ * vs-AI games (the AI has no client to drive a refresh).
187
+ *
188
+ * For each active game it reads the latest snapshot, computes `currentActor`
189
+ * (robust — works whether the snapshot was written by a human submit or a
190
+ * server-side AI advance), and runs an inactivity clock kept in `meta.reminder`:
191
+ * - new turn since last sweep → (re)start the clock, no email;
192
+ * - same turn, idle ≥ `olderThanMs`, not yet sent, actor has an email →
193
+ * `notifier.notifyYourTurn`, mark sent (once per turn);
194
+ * - game over → mark the game resolved (sweep cleanup).
195
+ *
196
+ * Clock granularity is the sweep interval (the clock starts when a sweep first
197
+ * observes a turn), which is fine for hour/day-scale reminders. Best-effort:
198
+ * a per-game failure is logged and skipped, never thrown.
199
+ */
200
+ async sweepTurnReminders(opts) {
201
+ const now = opts.nowMs ?? Date.now();
202
+ const games = await this.opts.store.listActiveGames();
203
+ let reminded = 0, resolvedMarked = 0;
204
+ for (const meta of games) {
205
+ try {
206
+ const latest = await this.opts.store.getLatest(meta.gameId);
207
+ if (!latest)
208
+ continue;
209
+ const state = this.decodeSnapshot(latest.state);
210
+ const actor = this.opts.adapter.currentActor(state);
211
+ if (actor === null) {
212
+ if (!meta.resolved) {
213
+ await this.opts.store.putGameMeta({ ...meta, resolved: true });
214
+ resolvedMarked++;
215
+ }
216
+ continue;
217
+ }
218
+ const r = meta.reminder;
219
+ if (!r || r.turn !== latest.turn) {
220
+ // Activity since we last looked → restart the clock, don't email yet.
221
+ await this.opts.store.putGameMeta({
222
+ ...meta,
223
+ reminder: { turn: latest.turn, since: new Date(now).toISOString(), sent: false },
224
+ });
225
+ continue;
226
+ }
227
+ if (r.sent)
228
+ continue;
229
+ if (now - new Date(r.since).getTime() < opts.olderThanMs)
230
+ continue;
231
+ const email = meta.emails?.[actor];
232
+ if (email && this.opts.notifier) {
233
+ try {
234
+ await this.opts.notifier.notifyYourTurn({
235
+ email,
236
+ gameUrl: this.opts.gameUrl(meta.gameId, meta.tokens[actor]),
237
+ gameId: meta.gameId,
238
+ turn: latest.turn,
239
+ });
240
+ reminded++;
241
+ }
242
+ catch (e) {
243
+ // eslint-disable-next-line no-console
244
+ console.error('[dbf] turn reminder failed:', e);
245
+ }
246
+ }
247
+ // Mark sent regardless (no email on file → nothing to retry; avoid re-spin).
248
+ await this.opts.store.putGameMeta({ ...meta, reminder: { ...r, sent: true } });
249
+ }
250
+ catch (e) {
251
+ // eslint-disable-next-line no-console
252
+ console.error(`[dbf] sweep failed for game ${meta.gameId}:`, e);
253
+ }
254
+ }
255
+ return { scanned: games.length, reminded, resolvedMarked };
256
+ }
257
+ // -------- chat --------
258
+ /** Post a chat message. Auth-gated: only a seat in this game may post, and the
259
+ * sender is stamped from the token (never trusted from the client, so you
260
+ * can't post as your opponent). Body is trimmed + capped. Returns the
261
+ * refreshed message list. Best-effort realtime "message" ping after storing. */
262
+ async postMessage(gameId, token, body) {
263
+ const { actor } = await this.authenticate(gameId, token);
264
+ const text = (body ?? '').toString().replace(/\s+/g, ' ').trim().slice(0, GameServer.MESSAGE_MAX_LEN);
265
+ if (text) {
266
+ await this.opts.store.postMessage(gameId, { seat: actor, body: text, at: new Date().toISOString() });
267
+ if (this.opts.broadcaster?.messagePosted) {
268
+ try {
269
+ await this.opts.broadcaster.messagePosted(gameId);
270
+ }
271
+ catch (e) { /* eslint-disable-next-line no-console */
272
+ console.error('[dbf] message broadcast failed:', e);
273
+ }
274
+ }
275
+ }
276
+ return this.opts.store.listMessages(gameId);
277
+ }
278
+ /** Read chat. Auth-gated — only a seat in this game may read (chat is private
279
+ * to the participants). Chronological order. */
280
+ async listMessages(gameId, token, limit) {
281
+ await this.authenticate(gameId, token);
282
+ return this.opts.store.listMessages(gameId, limit);
283
+ }
181
284
  // Public-read: triage endpoint. Returns reports with no PII (tokens/emails
182
285
  // are stored in GameMeta, never in reports). Safe to expose unauthenticated
183
286
  // for agent triage per the trust-tier rule.
@@ -1 +1 @@
1
- {"version":3,"file":"game-server.js","sourceRoot":"","sources":["../../src/server/game-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"game-server.js","sourceRoot":"","sources":["../../src/server/game-server.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  export { GameServer } from './game-server.js';
2
2
  export type { GameServerOpts, CreateGameArgs, CreateGameResult, ViewResult, ReportSubmission, } from './game-server.js';
3
- export type { SnapshotStore, GameMeta, SnapshotRow, BugReportRow, ReportFilter, } from './store.js';
3
+ export type { SnapshotStore, GameMeta, ReminderState, SnapshotRow, BugReportRow, ReportFilter, ChatMessage, } from './store.js';
4
4
  export { ConflictError } from './store.js';
5
5
  export { SupabaseStore } from './stores/supabase-store.js';
6
6
  export type { Notifier, NotifyTurnArgs } from './notify.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EACV,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,GAC/E,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,GACjE,MAAM,YAAY,CAAC;AAOpB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EACL,uBAAuB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,GACxE,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,GAC1D,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EACV,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,GAC/E,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,GAC7F,MAAM,YAAY,CAAC;AAOpB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EACL,uBAAuB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,GACxE,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,GAC1D,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
@@ -4,10 +4,14 @@ export interface GameBroadcaster {
4
4
  gameMoved(gameId: string, info: {
5
5
  turn: number;
6
6
  }): Promise<void>;
7
+ /** Optional: a new chat message was posted — clients refresh their message
8
+ * list. Carries no message content (signal only), same as gameMoved. */
9
+ messagePosted?(gameId: string): Promise<void>;
7
10
  }
8
11
  /** Default: broadcasts nothing (clients fall back to polling). */
9
12
  export declare class NoopBroadcaster implements GameBroadcaster {
10
13
  gameMoved(): Promise<void>;
14
+ messagePosted(): Promise<void>;
11
15
  }
12
16
  export interface SupabaseBroadcasterOpts {
13
17
  supabaseUrl: string;
@@ -24,5 +28,7 @@ export declare class SupabaseBroadcaster implements GameBroadcaster {
24
28
  gameMoved(gameId: string, info: {
25
29
  turn: number;
26
30
  }): Promise<void>;
31
+ messagePosted(gameId: string): Promise<void>;
32
+ private broadcast;
27
33
  }
28
34
  //# sourceMappingURL=realtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/server/realtime.ts"],"names":[],"mappings":"AASA;2EAC2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,kEAAkE;AAClE,qBAAa,eAAgB,YAAW,eAAe;IAC/C,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;0CAC0C;AAC1C,qBAAa,mBAAoB,YAAW,eAAe;IAC7C,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,uBAAuB;IAE3C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAavE"}
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/server/realtime.ts"],"names":[],"mappings":"AASA;2EAC2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE;6EACyE;IACzE,aAAa,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED,kEAAkE;AAClE,qBAAa,eAAgB,YAAW,eAAe;IAC/C,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAC1B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;0CAC0C;AAC1C,qBAAa,mBAAoB,YAAW,eAAe;IAC7C,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,uBAAuB;IAE3C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAIpC,SAAS;CAaxB"}
@@ -9,6 +9,7 @@
9
9
  /** Default: broadcasts nothing (clients fall back to polling). */
10
10
  export class NoopBroadcaster {
11
11
  async gameMoved() { }
12
+ async messagePosted() { }
12
13
  }
13
14
  /** Broadcasts via Supabase Realtime's server broadcast endpoint. The payload is
14
15
  * only the turn number — never state. */
@@ -18,6 +19,12 @@ export class SupabaseBroadcaster {
18
19
  this.opts = opts;
19
20
  }
20
21
  async gameMoved(gameId, info) {
22
+ await this.broadcast(gameId, 'moved', { turn: info.turn });
23
+ }
24
+ async messagePosted(gameId) {
25
+ await this.broadcast(gameId, 'message', {});
26
+ }
27
+ async broadcast(gameId, event, payload) {
21
28
  const topic = `${this.opts.topicPrefix ?? 'game:'}${gameId}`;
22
29
  const res = await fetch(`${this.opts.supabaseUrl}/realtime/v1/api/broadcast`, {
23
30
  method: 'POST',
@@ -26,7 +33,7 @@ export class SupabaseBroadcaster {
26
33
  Authorization: `Bearer ${this.opts.serviceKey}`,
27
34
  'Content-Type': 'application/json',
28
35
  },
29
- body: JSON.stringify({ messages: [{ topic, event: 'moved', payload: { turn: info.turn } }] }),
36
+ body: JSON.stringify({ messages: [{ topic, event, payload }] }),
30
37
  });
31
38
  if (!res.ok)
32
39
  throw new Error(`Supabase broadcast failed: ${res.status} ${await res.text()}`);
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/server/realtime.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,uEAAuE;AAQvE,kEAAkE;AAClE,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAC,SAAS,KAAgC,CAAC;CACjD;AAUD;0CAC0C;AAC1C,MAAM,OAAO,mBAAmB;IACV;IAApB,YAAoB,IAA6B;QAA7B,SAAI,GAAJ,IAAI,CAAyB;IAAG,CAAC;IAErD,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,IAAsB;QACpD,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,4BAA4B,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;gBAC5B,aAAa,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBAC/C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;SAC9F,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF"}
1
+ {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/server/realtime.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,uEAAuE;AAWvE,kEAAkE;AAClE,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAC,SAAS,KAAgC,CAAC;IAChD,KAAK,CAAC,aAAa,KAAgC,CAAC;CACrD;AAUD;0CAC0C;AAC1C,MAAM,OAAO,mBAAmB;IACV;IAApB,YAAoB,IAA6B;QAA7B,SAAI,GAAJ,IAAI,CAAyB;IAAG,CAAC;IAErD,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,IAAsB;QACpD,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc;QAChC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,KAAa,EAAE,OAAgB;QACrE,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,4BAA4B,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;gBAC5B,aAAa,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBAC/C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SAChE,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF"}
@@ -9,11 +9,30 @@ export interface GameMeta {
9
9
  emails?: Record<string, string>;
10
10
  createdAt: string;
11
11
  resolved?: boolean;
12
+ /** Stale-turn-reminder bookkeeping, maintained by GameServer.sweepTurnReminders.
13
+ * Not used during normal play. */
14
+ reminder?: ReminderState;
15
+ }
16
+ /** Tracks the inactivity clock for stale-turn reminders. `turn` is the last
17
+ * snapshot turn the sweep observed; `since` is when it first observed it; `sent`
18
+ * marks that a reminder for this turn has gone out (dedupe). */
19
+ export interface ReminderState {
20
+ turn: number;
21
+ since: string;
22
+ sent: boolean;
12
23
  }
13
24
  export interface SnapshotRow {
14
25
  turn: number;
15
26
  state: string;
16
27
  }
28
+ /** A player-to-player chat message. Stored OUT of game state (it's not a move),
29
+ * so it never touches snapshots or redaction. `seat` is stamped server-side
30
+ * from the sender's token (clients can't forge it). `at` is an ISO timestamp. */
31
+ export interface ChatMessage {
32
+ seat: string;
33
+ body: string;
34
+ at: string;
35
+ }
17
36
  export interface BugReportRow {
18
37
  reportId: string;
19
38
  gameId: string;
@@ -47,6 +66,9 @@ export interface ReportFilter {
47
66
  export interface SnapshotStore {
48
67
  putGameMeta(meta: GameMeta): Promise<void>;
49
68
  getGameMeta(gameId: string): Promise<GameMeta | null>;
69
+ listActiveGames(): Promise<GameMeta[]>;
70
+ postMessage(gameId: string, msg: ChatMessage): Promise<void>;
71
+ listMessages(gameId: string, limit?: number): Promise<ChatMessage[]>;
50
72
  deleteGame(gameId: string): Promise<void>;
51
73
  putSnapshot(gameId: string, row: SnapshotRow): Promise<void>;
52
74
  getLatest(gameId: string): Promise<SnapshotRow | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/server/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQ/C,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,SAAoD;CAIxE;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;iFAG6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAKtD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAK1C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACvD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEnD,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/server/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQ/C,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,SAAoD;CAIxE;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;uCACmC;IACnC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED;;iEAEiE;AACjE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;kFAEkF;AAClF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;iFAG6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAItD,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAIvC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAKrE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAK1C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACvD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEnD,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE"}
@@ -1,10 +1,13 @@
1
- import type { SnapshotStore, GameMeta, SnapshotRow, BugReportRow, ReportFilter } from '../store.js';
1
+ import type { SnapshotStore, GameMeta, SnapshotRow, BugReportRow, ReportFilter, ChatMessage } from '../store.js';
2
2
  export declare class FsStore implements SnapshotStore {
3
3
  private root;
4
4
  constructor(root: string);
5
5
  private ensureDir;
6
6
  putGameMeta(meta: GameMeta): Promise<void>;
7
7
  getGameMeta(gameId: string): Promise<GameMeta | null>;
8
+ listActiveGames(): Promise<GameMeta[]>;
9
+ postMessage(gameId: string, msg: ChatMessage): Promise<void>;
10
+ listMessages(gameId: string, limit?: number): Promise<ChatMessage[]>;
8
11
  deleteGame(gameId: string): Promise<void>;
9
12
  putSnapshot(gameId: string, row: SnapshotRow): Promise<void>;
10
13
  getLatest(gameId: string): Promise<SnapshotRow | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"fs-store.d.ts","sourceRoot":"","sources":["../../../src/server/stores/fs-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EACjE,MAAM,aAAa,CAAC;AAQrB,qBAAa,OAAQ,YAAW,aAAa;IAC/B,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;YAElB,SAAS;IAIjB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAOrD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAKtD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgBlD,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C,WAAW,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoB3D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOzE"}
1
+ {"version":3,"file":"fs-store.d.ts","sourceRoot":"","sources":["../../../src/server/stores/fs-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAC9E,MAAM,aAAa,CAAC;AAQrB,qBAAa,OAAQ,YAAW,aAAa;IAC/B,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;YAElB,SAAS;IAIjB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAOrD,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAWtC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IASjE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAKtD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgBlD,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C,WAAW,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoB3D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOzE"}
@@ -27,6 +27,43 @@ export class FsStore {
27
27
  return null;
28
28
  }
29
29
  }
30
+ async listActiveGames() {
31
+ let ids;
32
+ try {
33
+ ids = await fs.readdir(join(this.root, 'games'));
34
+ }
35
+ catch {
36
+ return [];
37
+ }
38
+ const out = [];
39
+ for (const id of ids) {
40
+ const meta = await this.getGameMeta(id);
41
+ if (meta && !meta.resolved)
42
+ out.push(meta);
43
+ }
44
+ return out;
45
+ }
46
+ async postMessage(gameId, msg) {
47
+ const dir = join(this.root, 'games', gameId);
48
+ await fs.mkdir(dir, { recursive: true });
49
+ const path = join(dir, 'messages.json');
50
+ let arr = [];
51
+ try {
52
+ arr = JSON.parse(await fs.readFile(path, 'utf8'));
53
+ }
54
+ catch { /* none yet */ }
55
+ arr.push(msg);
56
+ await fs.writeFile(path, JSON.stringify(arr));
57
+ }
58
+ async listMessages(gameId, limit = 100) {
59
+ try {
60
+ const arr = JSON.parse(await fs.readFile(join(this.root, 'games', gameId, 'messages.json'), 'utf8'));
61
+ return arr.slice(-limit);
62
+ }
63
+ catch {
64
+ return [];
65
+ }
66
+ }
30
67
  async deleteGame(gameId) {
31
68
  // force: true → no error if the game dir doesn't exist (idempotent).
32
69
  await fs.rm(join(this.root, 'games', gameId), { recursive: true, force: true });
@@ -1 +1 @@
1
- {"version":3,"file":"fs-store.js","sourceRoot":"","sources":["../../../src/server/stores/fs-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs-store.js","sourceRoot":"","sources":["../../../src/server/stores/fs-store.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,14 @@
1
1
  import type { SupabaseClient } from '@supabase/supabase-js';
2
- import type { SnapshotStore, GameMeta, SnapshotRow, BugReportRow, ReportFilter } from '../store.js';
2
+ import type { SnapshotStore, GameMeta, SnapshotRow, BugReportRow, ReportFilter, ChatMessage } from '../store.js';
3
3
  export declare class SupabaseStore implements SnapshotStore {
4
4
  private client;
5
5
  constructor(client: SupabaseClient);
6
6
  putGameMeta(meta: GameMeta): Promise<void>;
7
+ private rowToMeta;
7
8
  getGameMeta(gameId: string): Promise<GameMeta | null>;
9
+ listActiveGames(): Promise<GameMeta[]>;
10
+ postMessage(gameId: string, msg: ChatMessage): Promise<void>;
11
+ listMessages(gameId: string, limit?: number): Promise<ChatMessage[]>;
8
12
  deleteGame(gameId: string): Promise<void>;
9
13
  putSnapshot(gameId: string, row: SnapshotRow): Promise<void>;
10
14
  getLatest(gameId: string): Promise<SnapshotRow | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"supabase-store.d.ts","sourceRoot":"","sources":["../../../src/server/stores/supabase-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EACV,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EACjE,MAAM,aAAa,CAAC;AAKrB,qBAAa,aAAc,YAAW,aAAa;IACrC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEpC,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAerD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQtD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOlD,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB3C,WAAW,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA2B3D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMzE"}
1
+ {"version":3,"file":"supabase-store.d.ts","sourceRoot":"","sources":["../../../src/server/stores/supabase-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EACV,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAC9E,MAAM,aAAa,CAAC;AAKrB,qBAAa,aAAc,YAAW,aAAa;IACrC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEpC,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD,OAAO,CAAC,SAAS;IAYX,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAQrD,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAOtC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAUjE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQtD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOlD,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB3C,WAAW,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA2B3D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMzE"}
@@ -13,17 +13,12 @@ export class SupabaseStore {
13
13
  emails: meta.emails ?? {},
14
14
  created_at: meta.createdAt,
15
15
  resolved: meta.resolved ?? false,
16
+ reminder: meta.reminder ?? null,
16
17
  });
17
18
  if (error)
18
19
  throw error;
19
20
  }
20
- async getGameMeta(gameId) {
21
- const { data, error } = await this.client
22
- .from('dbf_games').select('*').eq('game_id', gameId).maybeSingle();
23
- if (error)
24
- throw error;
25
- if (!data)
26
- return null;
21
+ rowToMeta(data) {
27
22
  return {
28
23
  gameId: data.game_id,
29
24
  players: data.players,
@@ -31,8 +26,41 @@ export class SupabaseStore {
31
26
  emails: data.emails,
32
27
  createdAt: data.created_at,
33
28
  resolved: data.resolved,
29
+ reminder: data.reminder ?? undefined,
34
30
  };
35
31
  }
32
+ async getGameMeta(gameId) {
33
+ const { data, error } = await this.client
34
+ .from('dbf_games').select('*').eq('game_id', gameId).maybeSingle();
35
+ if (error)
36
+ throw error;
37
+ if (!data)
38
+ return null;
39
+ return this.rowToMeta(data);
40
+ }
41
+ async listActiveGames() {
42
+ const { data, error } = await this.client
43
+ .from('dbf_games').select('*').eq('resolved', false);
44
+ if (error)
45
+ throw error;
46
+ return (data ?? []).map((d) => this.rowToMeta(d));
47
+ }
48
+ async postMessage(gameId, msg) {
49
+ const { error } = await this.client.from('dbf_messages')
50
+ .insert({ game_id: gameId, seat: msg.seat, body: msg.body, created_at: msg.at });
51
+ if (error)
52
+ throw error;
53
+ }
54
+ async listMessages(gameId, limit = 100) {
55
+ const { data, error } = await this.client.from('dbf_messages')
56
+ .select('seat,body,created_at')
57
+ .eq('game_id', gameId).order('created_at', { ascending: false }).limit(limit);
58
+ if (error)
59
+ throw error;
60
+ return (data ?? [])
61
+ .map((r) => ({ seat: r.seat, body: r.body, at: r.created_at }))
62
+ .reverse();
63
+ }
36
64
  async deleteGame(gameId) {
37
65
  // Snapshots are removed by the dbf_snapshots → dbf_games ON DELETE CASCADE
38
66
  // (see schema.sql). Reports have no FK and intentionally survive.
@@ -1 +1 @@
1
- {"version":3,"file":"supabase-store.js","sourceRoot":"","sources":["../../../src/server/stores/supabase-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"supabase-store.js","sourceRoot":"","sources":["../../../src/server/stores/supabase-store.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,mEAAmE;AAEnE,MAAM,OAAO,aAAa;IACJ;IAApB,YAAoB,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAE9C,KAAK,CAAC,WAAW,CAAC,IAAc;QAC9B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;YAC3D,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;YACzB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;YAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;SAChC,CAAC,CAAC;QACH,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;IACzB,CAAC;IAEO,SAAS,CAAC,IAA6B;QAC7C,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,OAAiB;YAC9B,OAAO,EAAE,IAAI,CAAC,OAAmB;YACjC,MAAM,EAAE,IAAI,CAAC,MAAgC;YAC7C,MAAM,EAAE,IAAI,CAAC,MAA4C;YACzD,SAAS,EAAE,IAAI,CAAC,UAAoB;YACpC,QAAQ,EAAE,IAAI,CAAC,QAA+B;YAC9C,QAAQ,EAAG,IAAI,CAAC,QAAiC,IAAI,SAAS;SAC/D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM;aACtC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACrE,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;QACvB,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM;aACtC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;QACvB,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,GAAgB;QAChD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;aACrD,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,KAAK,GAAG,GAAG;QAC5C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;aAC3D,MAAM,CAAC,sBAAsB,CAAC;aAC9B,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChF,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;QACvB,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;aAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAc,EAAE,IAAI,EAAE,CAAC,CAAC,IAAc,EAAE,EAAE,EAAE,CAAC,CAAC,UAAoB,EAAE,CAAC,CAAC;aAC5F,OAAO,EAAE,CAAC;IACf,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,2EAA2E;QAC3E,kEAAkE;QAClE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrF,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,GAAgB;QAChD,4EAA4E;QAC5E,0EAA0E;QAC1E,kBAAkB;QAClB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC;YAC/D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK;SAClD,CAAC,CAAC;QACH,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,MAAM,IAAI,aAAa,CAAC,YAAY,MAAM,IAAI,GAAG,CAAC,IAAI,iBAAiB,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;aAC5D,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;aAC1C,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;QACvB,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;aAC5D,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;QACvB,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAiB;QAC/B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;YAC7D,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,OAAO,EAAE,GAAG,CAAC,MAAM;YACnB,aAAa,EAAE,GAAG,CAAC,YAAY;YAC/B,WAAW,EAAE,GAAG,CAAC,UAAU;YAC3B,eAAe,EAAE,GAAG,CAAC,cAAc;YACnC,aAAa,EAAE,GAAG,CAAC,YAAY;YAC/B,UAAU,EAAE,GAAG,CAAC,SAAS;YACzB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;YAC9B,YAAY,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACrC,UAAU,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;YACjC,UAAU,EAAE,GAAG,CAAC,SAAS;YACzB,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;SACnC,CAAC,CAAC;QACH,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAqB;QACrC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9F,IAAI,MAAM,EAAE,KAAK;YAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,MAAM,EAAE,QAAQ;YAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,MAAM,EAAE,QAAQ;YAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,MAAM,EAAE,UAAU;YAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,MAAM,EAAE,MAAM;YAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;QAChC,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;QACvB,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5B,QAAQ,EAAE,CAAC,CAAC,SAAS;YACrB,MAAM,EAAE,CAAC,CAAC,OAAO;YACjB,YAAY,EAAE,CAAC,CAAC,aAAa;YAC7B,UAAU,EAAE,CAAC,CAAC,WAAW;YACzB,cAAc,EAAE,CAAC,CAAC,eAAe;YACjC,YAAY,EAAE,CAAC,CAAC,aAAa;YAC7B,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,SAAS;YACjC,WAAW,EAAE,CAAC,CAAC,YAAY,IAAI,SAAS;YACxC,SAAS,EAAE,CAAC,CAAC,UAAU,IAAI,SAAS;YACpC,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,SAAS;SACtC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,UAAkB;QACtD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;YAC7D,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;SAC/D,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC7B,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC;IACzB,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "digital-boardgame-framework",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Foundation library for turn-based digital boardgames: deterministic engine plumbing, async multiplayer, agent-friendly bug triage.",
5
5
  "keywords": ["boardgame", "board-game", "multiplayer", "async-multiplayer", "turn-based", "game-framework", "supabase", "cloudflare-pages"],
6
6
  "author": "John Champaign",
@@ -8,8 +8,12 @@ create table if not exists dbf_games (
8
8
  tokens jsonb not null,
9
9
  emails jsonb not null default '{}'::jsonb,
10
10
  created_at timestamptz not null default now(),
11
- resolved boolean not null default false
11
+ resolved boolean not null default false,
12
+ reminder jsonb -- stale-turn-reminder bookkeeping (GameServer.sweepTurnReminders)
12
13
  );
14
+ -- Existing databases created before the `reminder` column was added:
15
+ -- alter table dbf_games add column if not exists reminder jsonb;
16
+ create index if not exists dbf_games_active on dbf_games(game_id) where resolved = false;
13
17
 
14
18
  create table if not exists dbf_snapshots (
15
19
  game_id text not null references dbf_games(game_id) on delete cascade,
@@ -20,6 +24,17 @@ create table if not exists dbf_snapshots (
20
24
  );
21
25
  create index if not exists dbf_snapshots_latest on dbf_snapshots(game_id, turn desc);
22
26
 
27
+ -- Player-to-player chat — stored out of game state (never touches snapshots /
28
+ -- redaction). Sender seat is stamped server-side from the auth token.
29
+ create table if not exists dbf_messages (
30
+ id bigint generated always as identity primary key,
31
+ game_id text not null references dbf_games(game_id) on delete cascade,
32
+ seat text not null,
33
+ body text not null,
34
+ created_at timestamptz not null default now()
35
+ );
36
+ create index if not exists dbf_messages_game on dbf_messages(game_id, created_at);
37
+
23
38
  create table if not exists dbf_reports (
24
39
  report_id text primary key,
25
40
  game_id text not null,