@fairfox/polly 0.71.0 → 0.73.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 (45) hide show
  1. package/dist/src/client/index.js +2 -2
  2. package/dist/src/client/index.js.map +2 -2
  3. package/dist/src/elysia/index.js +464 -4
  4. package/dist/src/elysia/index.js.map +6 -4
  5. package/dist/src/peer.d.ts +2 -0
  6. package/dist/src/peer.js +468 -4
  7. package/dist/src/peer.js.map +8 -5
  8. package/dist/src/polly-ui/ActionInput.d.ts +12 -2
  9. package/dist/src/polly-ui/ActionSelect.d.ts +36 -0
  10. package/dist/src/polly-ui/Button.d.ts +4 -0
  11. package/dist/src/polly-ui/Cluster.d.ts +36 -0
  12. package/dist/src/polly-ui/Code.d.ts +18 -0
  13. package/dist/src/polly-ui/Surface.d.ts +12 -1
  14. package/dist/src/polly-ui/Text.d.ts +43 -0
  15. package/dist/src/polly-ui/index.css +320 -194
  16. package/dist/src/polly-ui/index.d.ts +5 -1
  17. package/dist/src/polly-ui/index.js +533 -284
  18. package/dist/src/polly-ui/index.js.map +14 -8
  19. package/dist/src/polly-ui/internal/dispatch-action.d.ts +13 -0
  20. package/dist/src/polly-ui/internal/passthrough.d.ts +25 -0
  21. package/dist/src/polly-ui/markdown.js +3 -3
  22. package/dist/src/polly-ui/markdown.js.map +2 -2
  23. package/dist/src/polly-ui/styles.css +345 -194
  24. package/dist/src/polly-ui/theme.css +1 -0
  25. package/dist/src/shared/lib/peer-repo-server.d.ts +18 -0
  26. package/dist/src/shared/lib/sweep-sealed.d.ts +111 -0
  27. package/dist/tools/quality/src/cli.js +6 -2
  28. package/dist/tools/quality/src/cli.js.map +3 -3
  29. package/dist/tools/quality/src/index.js +6 -2
  30. package/dist/tools/quality/src/index.js.map +3 -3
  31. package/dist/tools/test/src/browser/run.js +89 -49
  32. package/dist/tools/test/src/browser/run.js.map +6 -5
  33. package/dist/tools/test/src/browser/runner-core.d.ts +32 -0
  34. package/dist/tools/test/src/e2e-mesh/index.js +193 -171
  35. package/dist/tools/test/src/e2e-mesh/index.js.map +4 -4
  36. package/dist/tools/test/src/visual/index.js +270 -251
  37. package/dist/tools/test/src/visual/index.js.map +5 -5
  38. package/dist/tools/verify/specs/tla/MeshSeed.cfg +27 -0
  39. package/dist/tools/verify/specs/tla/MeshSeed.tla +179 -0
  40. package/dist/tools/verify/specs/tla/README.md +11 -1
  41. package/dist/tools/verify/src/cli.js +136 -51
  42. package/dist/tools/verify/src/cli.js.map +9 -7
  43. package/dist/tools/visualize/src/cli.js +72 -2
  44. package/dist/tools/visualize/src/cli.js.map +5 -5
  45. package/package.json +3 -2
@@ -72,7 +72,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
72
72
  // src/client/wrapper.ts
73
73
  import { treaty } from "@elysiajs/eden";
74
74
 
75
- // ../../node_modules/.bun/@preact+signals-core@1.14.2/node_modules/@preact/signals-core/dist/signals-core.module.js
75
+ // node_modules/.bun/@preact+signals-core@1.14.2/node_modules/@preact/signals-core/dist/signals-core.module.js
76
76
  var i = Symbol.for("preact-signals");
77
77
  function t() {
78
78
  if (!(s > 1)) {
@@ -643,4 +643,4 @@ export {
643
643
  createPollyClient
644
644
  };
645
645
 
646
- //# debugId=74C4CA57821ED6F364756E2164756E21
646
+ //# debugId=DBB93F1CDEC2CAC264756E2164756E21
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/client/wrapper.ts", "../../../node_modules/.bun/@preact+signals-core@1.14.2/node_modules/@preact/signals-core/dist/signals-core.module.js", "../src/core/clock.ts", "../src/elysia/route-match.ts"],
3
+ "sources": ["../src/client/wrapper.ts", "../node_modules/.bun/@preact+signals-core@1.14.2/node_modules/@preact/signals-core/dist/signals-core.module.js", "../src/core/clock.ts", "../src/elysia/route-match.ts"],
4
4
  "sourcesContent": [
5
5
  "// @ts-nocheck - Optional peer dependencies (elysia, @elysiajs/eden)\nimport { treaty } from \"@elysiajs/eden\";\nimport { type Signal, signal } from \"@preact/signals-core\";\nimport { createLamportClock } from \"../core/clock\";\nimport { findMatchingConfig } from \"../elysia/route-match\";\nimport type { ClientEffectConfig, PollyResponseMetadata, RoutePattern } from \"../elysia/types\";\n\n/**\n * Offline queue entry\n */\ninterface QueuedRequest {\n id: string;\n method: string;\n path: string;\n body: unknown;\n optimisticResult?: unknown;\n timestamp: number;\n}\n\n/**\n * Client-side state management\n */\ninterface ClientState {\n isOnline: Signal<boolean>;\n isSyncing: Signal<boolean>;\n queuedRequests: Signal<QueuedRequest[]>;\n}\n\n/**\n * Polly client options\n */\nexport interface PollyClientOptions {\n /**\n * Client state signals that should be synced\n */\n state?: Record<string, Signal<unknown>>;\n\n /**\n * Client-side effect handlers, keyed by the same route pattern used in the\n * server config (e.g. `'POST /todos'`). The wrapper looks up handlers here\n * after a successful request — handlers are imported, never shipped from\n * the server.\n */\n clientEffects?: Record<RoutePattern, ClientEffectConfig[\"client\"]>;\n\n /**\n * Callback when online/offline status changes\n */\n onOfflineChange?: (isOnline: boolean) => void;\n\n /**\n * Enable WebSocket for real-time updates (default: true in dev, false in prod)\n */\n websocket?: boolean;\n\n /**\n * WebSocket path (default: '/polly/ws')\n */\n websocketPath?: string;\n}\n\n/**\n * Create a Polly-enhanced Eden client\n *\n * In DEV mode:\n * - Processes server metadata for hot reloading\n * - Executes client effects from server\n * - Handles offline queueing\n * - Connects WebSocket for real-time updates\n *\n * In PROD mode:\n * - Minimal wrapper (client effects are bundled)\n * - Optional WebSocket for real-time features\n * - Offline queueing still works\n *\n * Example:\n * ```typescript\n * import { createPollyClient } from '@fairfox/polly/client';\n * import { $syncedState } from '@fairfox/polly';\n * import type { app } from './server';\n *\n * const clientState = {\n * todos: $syncedState('todos', []),\n * user: $syncedState('user', null),\n * };\n *\n * export const api = createPollyClient<typeof app>('http://localhost:3000', {\n * state: clientState,\n * websocket: true,\n * });\n * ```\n */\nexport function createPollyClient<T extends Record<string, unknown>>(\n url: string,\n options: PollyClientOptions = {}\n) {\n const isDev = process.env.NODE_ENV !== \"production\";\n const baseClient = treaty<T>(url);\n const clock = createLamportClock(\"client\");\n\n // Client state\n const clientState: ClientState = {\n isOnline: signal(typeof navigator === \"undefined\" ? true : navigator.onLine),\n isSyncing: signal(false),\n queuedRequests: signal<QueuedRequest[]>([]),\n };\n\n // WebSocket connection for real-time updates (opt-in in prod)\n let ws: WebSocket | null = null;\n const shouldUseWebSocket = options.websocket === undefined ? isDev : options.websocket;\n\n if (shouldUseWebSocket && typeof WebSocket !== \"undefined\") {\n const wsPath = options.websocketPath || \"/polly/ws\";\n const wsUrl = url.replace(/^http/, \"ws\") + wsPath;\n\n try {\n ws = new WebSocket(wsUrl);\n\n ws.addEventListener(\"open\", () => {\n console.log(\"[Polly] WebSocket connected\");\n });\n\n ws.addEventListener(\"message\", (event) => {\n const message = JSON.parse(event.data);\n\n if (message.type === \"state-sync\") {\n // Initial state sync\n // nosemgrep: javascript.lang.security.insecure-object-assign.insecure-object-assign — `message.state` is already typed wire data delivered by the polly server; the trust boundary is the WebSocket auth, not Object.assign.\n Object.assign(options.state || {}, message.state);\n } else if (message.type === \"effect\") {\n // Remote effect triggered by another client (broadcast)\n console.log(\"[Polly] Received broadcast effect:\", message);\n // In production, handle this via your bundled effects\n // In dev, the effect handler comes from metadata\n }\n });\n\n ws.addEventListener(\"error\", (error) => {\n // biome-ignore lint/suspicious/noConsole: Error logging is intentional\n console.error(\"[Polly] WebSocket error:\", error);\n });\n } catch (error) {\n // biome-ignore lint/suspicious/noConsole: Error logging is intentional\n console.error(\"[Polly] Failed to create WebSocket:\", error);\n }\n }\n\n // Online/offline listeners (browser only)\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", () => {\n clientState.isOnline.value = true;\n options.onOfflineChange?.(true);\n processQueue();\n });\n\n window.addEventListener(\"offline\", () => {\n clientState.isOnline.value = false;\n options.onOfflineChange?.(false);\n });\n }\n\n /**\n * Process queued requests when back online\n */\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Queue processing requires complex branching logic\n async function processQueue() {\n if (clientState.queuedRequests.value.length === 0) return;\n\n clientState.isSyncing.value = true;\n\n const queue = [...clientState.queuedRequests.value];\n clientState.queuedRequests.value = [];\n\n for (const req of queue) {\n try {\n // Replay request\n const response = await fetch(url + req.path, {\n method: req.method,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req.body),\n });\n\n const result = await response.json();\n\n // In dev mode, process metadata\n if (isDev) {\n const metadataHeader = response.headers.get(\"X-Polly-Metadata\");\n if (metadataHeader) {\n const metadata: PollyResponseMetadata = JSON.parse(metadataHeader);\n\n // Handle merge if optimistic update was used\n if (req.optimisticResult && metadata.offline?.merge) {\n const mergeStrategy = metadata.offline.merge;\n\n if (mergeStrategy === \"replace\") {\n // Replace optimistic with server result (default)\n // The client effect will handle this\n } else if (typeof mergeStrategy === \"function\") {\n // TODO: call mergeStrategy(req.optimisticResult, result) and apply\n // the merged state to local signals.\n }\n }\n\n // Execute client effect — looked up locally by route, never deserialised from the wire\n if (metadata.hasClientEffect) {\n const handler = findMatchingConfig(options.clientEffects, req.method, req.path);\n if (handler) {\n handler({\n result,\n body: req.body,\n state: { client: options.state || {}, server: {} },\n params: {},\n clock: metadata.clock,\n });\n }\n }\n }\n }\n } catch (error) {\n // biome-ignore lint/suspicious/noConsole: Error logging is intentional\n console.error(\"[Polly] Failed to replay request:\", req, error);\n // Re-queue on failure\n clientState.queuedRequests.value.push(req);\n }\n }\n\n clientState.isSyncing.value = false;\n }\n\n // Return the base client with additional Polly features\n return {\n ...baseClient,\n $polly: {\n state: clientState,\n clock,\n ws,\n /**\n * Manually process queued requests\n */\n sync: processQueue,\n },\n };\n}\n",
6
6
  "var i=Symbol.for(\"preact-signals\");function t(){if(!(s>1)){var i,t=!1;!function(){var i=c;c=void 0;while(void 0!==i){if(i.S.v===i.v)i.S.i=i.i;i=i.o}}();while(void 0!==h){var n=h;h=void 0;v++;while(void 0!==n){var r=n.u;n.u=void 0;n.f&=-3;if(!(8&n.f)&&w(n))try{n.c()}catch(n){if(!t){i=n;t=!0}}n=r}}v=0;s--;if(t)throw i}else s--}function n(i){if(s>0)return i();e=++u;s++;try{return i()}finally{t()}}var r=void 0;function o(i){var t=r;r=void 0;try{return i()}finally{r=t}}var f,h=void 0,s=0,v=0,u=0,e=0,c=void 0,d=0;function a(i){if(void 0!==r){var t=i.n;if(void 0===t||t.t!==r){t={i:0,S:i,p:r.s,n:void 0,t:r,e:void 0,x:void 0,r:t};if(void 0!==r.s)r.s.n=t;r.s=t;i.n=t;if(32&r.f)i.S(t);return t}else if(-1===t.i){t.i=0;if(void 0!==t.n){t.n.p=t.p;if(void 0!==t.p)t.p.n=t.n;t.p=r.s;t.n=void 0;r.s.n=t;r.s=t}return t}}}function l(i,t){this.v=i;this.i=0;this.n=void 0;this.t=void 0;this.l=0;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}l.prototype.brand=i;l.prototype.h=function(){return!0};l.prototype.S=function(i){var t=this,n=this.t;if(n!==i&&void 0===i.e){i.x=n;this.t=i;if(void 0!==n)n.e=i;else o(function(){var i;null==(i=t.W)||i.call(t)})}};l.prototype.U=function(i){var t=this;if(void 0!==this.t){var n=i.e,r=i.x;if(void 0!==n){n.x=r;i.e=void 0}if(void 0!==r){r.e=n;i.x=void 0}if(i===this.t){this.t=r;if(void 0===r)o(function(){var i;null==(i=t.Z)||i.call(t)})}}};l.prototype.subscribe=function(i){var t=this;return j(function(){var n=t.value,o=r;r=void 0;try{i(n)}finally{r=o}},{name:\"sub\"})};l.prototype.valueOf=function(){return this.value};l.prototype.toString=function(){return this.value+\"\"};l.prototype.toJSON=function(){return this.value};l.prototype.peek=function(){var i=this;return o(function(){return i.value})};Object.defineProperty(l.prototype,\"value\",{get:function(){var i=a(this);if(void 0!==i)i.i=this.i;return this.v},set:function(i){if(i!==this.v){if(v>100)throw new Error(\"Cycle detected\");!function(i){if(0!==s&&0===v)if(i.l!==e){i.l=e;c={S:i,v:i.v,i:i.i,o:c}}}(this);this.v=i;this.i++;d++;s++;try{for(var n=this.t;void 0!==n;n=n.x)n.t.N()}finally{t()}}}});function y(i,t){return new l(i,t)}function w(i){for(var t=i.s;void 0!==t;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function _(i){for(var t=i.s;void 0!==t;t=t.n){var n=t.S.n;if(void 0!==n)t.r=n;t.S.n=t;t.i=-1;if(void 0===t.n){i.s=t;break}}}function b(i){var t=i.s,n=void 0;while(void 0!==t){var r=t.p;if(-1===t.i){t.S.U(t);if(void 0!==r)r.n=t.n;if(void 0!==t.n)t.n.p=r}else n=t;t.S.n=t.r;if(void 0!==t.r)t.r=void 0;t=r}i.s=n}function p(i,t){l.call(this,void 0);this.x=i;this.s=void 0;this.g=d-1;this.f=4;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}p.prototype=new l;p.prototype.h=function(){this.f&=-3;if(1&this.f)return!1;if(32==(36&this.f))return!0;this.f&=-5;if(this.g===d)return!0;this.g=d;this.f|=1;if(this.i>0&&!w(this)){this.f&=-2;return!0}var i=r;try{_(this);r=this;var t=this.x();if(16&this.f||this.v!==t||0===this.i){this.v=t;this.f&=-17;this.i++}}catch(i){this.v=i;this.f|=16;this.i++}r=i;b(this);this.f&=-2;return!0};p.prototype.S=function(i){if(void 0===this.t){this.f|=36;for(var t=this.s;void 0!==t;t=t.n)t.S.S(t)}l.prototype.S.call(this,i)};p.prototype.U=function(i){if(void 0!==this.t){l.prototype.U.call(this,i);if(void 0===this.t){this.f&=-33;for(var t=this.s;void 0!==t;t=t.n)t.S.U(t)}}};p.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var i=this.t;void 0!==i;i=i.x)i.t.N()}};Object.defineProperty(p.prototype,\"value\",{get:function(){if(1&this.f)throw new Error(\"Cycle detected\");var i=a(this);this.h();if(void 0!==i)i.i=this.i;if(16&this.f)throw this.v;return this.v}});function g(i,t){return new p(i,t)}function S(i){var n=i.m;i.m=void 0;if(\"function\"==typeof n){s++;var o=r;r=void 0;try{n()}catch(t){i.f&=-2;i.f|=8;m(i);throw t}finally{r=o;t()}}}function m(i){for(var t=i.s;void 0!==t;t=t.n)t.S.U(t);i.x=void 0;i.s=void 0;S(i)}function x(i){if(r!==this)throw new Error(\"Out-of-order effect\");b(this);r=i;this.f&=-2;if(8&this.f)m(this);t()}function E(i,t){this.x=i;this.m=void 0;this.s=void 0;this.u=void 0;this.f=32;this.name=null==t?void 0:t.name;if(f)f.push(this)}E.prototype.c=function(){var i=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var t=this.x();if(\"function\"==typeof t)this.m=t}finally{i()}};E.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1;this.f&=-9;S(this);_(this);s++;var i=r;r=this;return x.bind(this,i)};E.prototype.N=function(){if(!(2&this.f)){this.f|=2;this.u=h;h=this}};E.prototype.d=function(){this.f|=8;if(!(1&this.f))m(this)};E.prototype.dispose=function(){this.d()};function j(i,t){var n=new E(i,t);try{n.c()}catch(i){n.d();throw i}var r=n.d.bind(n);r[Symbol.dispose]=r;return r}function C(i){return function(){var t=arguments,r=this;return n(function(){return o(function(){return i.apply(r,[].slice.call(t))})})}}function O(){var i=f;f=[];return function(){var t=f;if(f&&i)i=i.concat(f);f=i;return t}}var k=function(i){for(var t in i){var n=i[t];if(\"function\"==typeof n)i[t]=C(n);else if(\"object\"==typeof n&&null!==n&&!(\"brand\"in n))k(n)}};function T(i){return function(){var t,n,r=O();try{n=i.apply(void 0,[].slice.call(arguments))}catch(i){f=void 0;throw i}finally{t=r()}k(n);n[Symbol.dispose]=C(function(){if(t)for(var i=0;i<t.length;i++)t[i].dispose();t=void 0});return n}}export{p as Computed,E as Effect,l as Signal,C as action,n as batch,g as computed,T as createModel,j as effect,y as signal,o as untracked};//# sourceMappingURL=signals-core.module.js.map\n",
@@ -8,6 +8,6 @@
8
8
  "/**\n * Route pattern matcher\n * Supports:\n * - Exact match: 'POST /todos'\n * - Param match: 'GET /todos/:id'\n * - Wildcard: '/todos/*'\n */\nexport function matchRoute(pattern: string, method: string, path: string): boolean {\n const spaceIdx = pattern.indexOf(\" \");\n const patternMethod = spaceIdx === -1 ? null : pattern.slice(0, spaceIdx);\n const patternPath = spaceIdx === -1 ? pattern : pattern.slice(spaceIdx + 1);\n\n if (patternMethod && patternMethod !== method) {\n return false;\n }\n\n const patternSegments = patternPath.split(\"/\").filter(Boolean);\n const pathSegments = path.split(\"/\").filter(Boolean);\n\n if (patternSegments.length !== pathSegments.length && !patternPath.includes(\"*\")) {\n return false;\n }\n\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSeg = patternSegments[i];\n const pathSeg = pathSegments[i];\n\n if (patternSeg === \"*\") return true;\n if (patternSeg?.startsWith(\":\")) continue;\n if (patternSeg !== pathSeg) return false;\n }\n\n return true;\n}\n\nexport function findMatchingConfig<T>(\n configs: Record<string, T> | undefined,\n method: string,\n path: string\n): T | undefined {\n if (!configs) return undefined;\n\n for (const [pattern, config] of Object.entries(configs)) {\n if (matchRoute(pattern, method, path)) {\n return config;\n }\n }\n\n return undefined;\n}\n"
9
9
  ],
10
10
  "mappings": "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",
11
- "debugId": "74C4CA57821ED6F364756E2164756E21",
11
+ "debugId": "DBB93F1CDEC2CAC264756E2164756E21",
12
12
  "names": []
13
13
  }
@@ -69,10 +69,464 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
69
69
  throw Error('Dynamic require of "' + x + '" is not supported');
70
70
  });
71
71
 
72
+ // node:path
73
+ var exports_path = {};
74
+ __export(exports_path, {
75
+ sep: () => sep,
76
+ resolve: () => resolve,
77
+ relative: () => relative,
78
+ posix: () => posix,
79
+ parse: () => parse,
80
+ normalize: () => normalize,
81
+ join: () => join,
82
+ isAbsolute: () => isAbsolute,
83
+ format: () => format,
84
+ extname: () => extname,
85
+ dirname: () => dirname,
86
+ delimiter: () => delimiter,
87
+ default: () => path_default,
88
+ basename: () => basename,
89
+ _makeLong: () => _makeLong
90
+ });
91
+ function assertPath(path) {
92
+ if (typeof path !== "string")
93
+ throw TypeError("Path must be a string. Received " + JSON.stringify(path));
94
+ }
95
+ function normalizeStringPosix(path, allowAboveRoot) {
96
+ var res = "", lastSegmentLength = 0, lastSlash = -1, dots = 0, code;
97
+ for (var i = 0;i <= path.length; ++i) {
98
+ if (i < path.length)
99
+ code = path.charCodeAt(i);
100
+ else if (code === 47)
101
+ break;
102
+ else
103
+ code = 47;
104
+ if (code === 47) {
105
+ if (lastSlash === i - 1 || dots === 1)
106
+ ;
107
+ else if (lastSlash !== i - 1 && dots === 2) {
108
+ if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 || res.charCodeAt(res.length - 2) !== 46) {
109
+ if (res.length > 2) {
110
+ var lastSlashIndex = res.lastIndexOf("/");
111
+ if (lastSlashIndex !== res.length - 1) {
112
+ if (lastSlashIndex === -1)
113
+ res = "", lastSegmentLength = 0;
114
+ else
115
+ res = res.slice(0, lastSlashIndex), lastSegmentLength = res.length - 1 - res.lastIndexOf("/");
116
+ lastSlash = i, dots = 0;
117
+ continue;
118
+ }
119
+ } else if (res.length === 2 || res.length === 1) {
120
+ res = "", lastSegmentLength = 0, lastSlash = i, dots = 0;
121
+ continue;
122
+ }
123
+ }
124
+ if (allowAboveRoot) {
125
+ if (res.length > 0)
126
+ res += "/..";
127
+ else
128
+ res = "..";
129
+ lastSegmentLength = 2;
130
+ }
131
+ } else {
132
+ if (res.length > 0)
133
+ res += "/" + path.slice(lastSlash + 1, i);
134
+ else
135
+ res = path.slice(lastSlash + 1, i);
136
+ lastSegmentLength = i - lastSlash - 1;
137
+ }
138
+ lastSlash = i, dots = 0;
139
+ } else if (code === 46 && dots !== -1)
140
+ ++dots;
141
+ else
142
+ dots = -1;
143
+ }
144
+ return res;
145
+ }
146
+ function _format(sep, pathObject) {
147
+ var dir = pathObject.dir || pathObject.root, base = pathObject.base || (pathObject.name || "") + (pathObject.ext || "");
148
+ if (!dir)
149
+ return base;
150
+ if (dir === pathObject.root)
151
+ return dir + base;
152
+ return dir + sep + base;
153
+ }
154
+ function resolve() {
155
+ var resolvedPath = "", resolvedAbsolute = false, cwd;
156
+ for (var i = arguments.length - 1;i >= -1 && !resolvedAbsolute; i--) {
157
+ var path;
158
+ if (i >= 0)
159
+ path = arguments[i];
160
+ else {
161
+ if (cwd === undefined)
162
+ cwd = process.cwd();
163
+ path = cwd;
164
+ }
165
+ if (assertPath(path), path.length === 0)
166
+ continue;
167
+ resolvedPath = path + "/" + resolvedPath, resolvedAbsolute = path.charCodeAt(0) === 47;
168
+ }
169
+ if (resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute), resolvedAbsolute)
170
+ if (resolvedPath.length > 0)
171
+ return "/" + resolvedPath;
172
+ else
173
+ return "/";
174
+ else if (resolvedPath.length > 0)
175
+ return resolvedPath;
176
+ else
177
+ return ".";
178
+ }
179
+ function normalize(path) {
180
+ if (assertPath(path), path.length === 0)
181
+ return ".";
182
+ var isAbsolute = path.charCodeAt(0) === 47, trailingSeparator = path.charCodeAt(path.length - 1) === 47;
183
+ if (path = normalizeStringPosix(path, !isAbsolute), path.length === 0 && !isAbsolute)
184
+ path = ".";
185
+ if (path.length > 0 && trailingSeparator)
186
+ path += "/";
187
+ if (isAbsolute)
188
+ return "/" + path;
189
+ return path;
190
+ }
191
+ function isAbsolute(path) {
192
+ return assertPath(path), path.length > 0 && path.charCodeAt(0) === 47;
193
+ }
194
+ function join() {
195
+ if (arguments.length === 0)
196
+ return ".";
197
+ var joined;
198
+ for (var i = 0;i < arguments.length; ++i) {
199
+ var arg = arguments[i];
200
+ if (assertPath(arg), arg.length > 0)
201
+ if (joined === undefined)
202
+ joined = arg;
203
+ else
204
+ joined += "/" + arg;
205
+ }
206
+ if (joined === undefined)
207
+ return ".";
208
+ return normalize(joined);
209
+ }
210
+ function relative(from, to) {
211
+ if (assertPath(from), assertPath(to), from === to)
212
+ return "";
213
+ if (from = resolve(from), to = resolve(to), from === to)
214
+ return "";
215
+ var fromStart = 1;
216
+ for (;fromStart < from.length; ++fromStart)
217
+ if (from.charCodeAt(fromStart) !== 47)
218
+ break;
219
+ var fromEnd = from.length, fromLen = fromEnd - fromStart, toStart = 1;
220
+ for (;toStart < to.length; ++toStart)
221
+ if (to.charCodeAt(toStart) !== 47)
222
+ break;
223
+ var toEnd = to.length, toLen = toEnd - toStart, length = fromLen < toLen ? fromLen : toLen, lastCommonSep = -1, i = 0;
224
+ for (;i <= length; ++i) {
225
+ if (i === length) {
226
+ if (toLen > length) {
227
+ if (to.charCodeAt(toStart + i) === 47)
228
+ return to.slice(toStart + i + 1);
229
+ else if (i === 0)
230
+ return to.slice(toStart + i);
231
+ } else if (fromLen > length) {
232
+ if (from.charCodeAt(fromStart + i) === 47)
233
+ lastCommonSep = i;
234
+ else if (i === 0)
235
+ lastCommonSep = 0;
236
+ }
237
+ break;
238
+ }
239
+ var fromCode = from.charCodeAt(fromStart + i), toCode = to.charCodeAt(toStart + i);
240
+ if (fromCode !== toCode)
241
+ break;
242
+ else if (fromCode === 47)
243
+ lastCommonSep = i;
244
+ }
245
+ var out = "";
246
+ for (i = fromStart + lastCommonSep + 1;i <= fromEnd; ++i)
247
+ if (i === fromEnd || from.charCodeAt(i) === 47)
248
+ if (out.length === 0)
249
+ out += "..";
250
+ else
251
+ out += "/..";
252
+ if (out.length > 0)
253
+ return out + to.slice(toStart + lastCommonSep);
254
+ else {
255
+ if (toStart += lastCommonSep, to.charCodeAt(toStart) === 47)
256
+ ++toStart;
257
+ return to.slice(toStart);
258
+ }
259
+ }
260
+ function _makeLong(path) {
261
+ return path;
262
+ }
263
+ function dirname(path) {
264
+ if (assertPath(path), path.length === 0)
265
+ return ".";
266
+ var code = path.charCodeAt(0), hasRoot = code === 47, end = -1, matchedSlash = true;
267
+ for (var i = path.length - 1;i >= 1; --i)
268
+ if (code = path.charCodeAt(i), code === 47) {
269
+ if (!matchedSlash) {
270
+ end = i;
271
+ break;
272
+ }
273
+ } else
274
+ matchedSlash = false;
275
+ if (end === -1)
276
+ return hasRoot ? "/" : ".";
277
+ if (hasRoot && end === 1)
278
+ return "//";
279
+ return path.slice(0, end);
280
+ }
281
+ function basename(path, ext) {
282
+ if (ext !== undefined && typeof ext !== "string")
283
+ throw TypeError('"ext" argument must be a string');
284
+ assertPath(path);
285
+ var start = 0, end = -1, matchedSlash = true, i;
286
+ if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
287
+ if (ext.length === path.length && ext === path)
288
+ return "";
289
+ var extIdx = ext.length - 1, firstNonSlashEnd = -1;
290
+ for (i = path.length - 1;i >= 0; --i) {
291
+ var code = path.charCodeAt(i);
292
+ if (code === 47) {
293
+ if (!matchedSlash) {
294
+ start = i + 1;
295
+ break;
296
+ }
297
+ } else {
298
+ if (firstNonSlashEnd === -1)
299
+ matchedSlash = false, firstNonSlashEnd = i + 1;
300
+ if (extIdx >= 0)
301
+ if (code === ext.charCodeAt(extIdx)) {
302
+ if (--extIdx === -1)
303
+ end = i;
304
+ } else
305
+ extIdx = -1, end = firstNonSlashEnd;
306
+ }
307
+ }
308
+ if (start === end)
309
+ end = firstNonSlashEnd;
310
+ else if (end === -1)
311
+ end = path.length;
312
+ return path.slice(start, end);
313
+ } else {
314
+ for (i = path.length - 1;i >= 0; --i)
315
+ if (path.charCodeAt(i) === 47) {
316
+ if (!matchedSlash) {
317
+ start = i + 1;
318
+ break;
319
+ }
320
+ } else if (end === -1)
321
+ matchedSlash = false, end = i + 1;
322
+ if (end === -1)
323
+ return "";
324
+ return path.slice(start, end);
325
+ }
326
+ }
327
+ function extname(path) {
328
+ assertPath(path);
329
+ var startDot = -1, startPart = 0, end = -1, matchedSlash = true, preDotState = 0;
330
+ for (var i = path.length - 1;i >= 0; --i) {
331
+ var code = path.charCodeAt(i);
332
+ if (code === 47) {
333
+ if (!matchedSlash) {
334
+ startPart = i + 1;
335
+ break;
336
+ }
337
+ continue;
338
+ }
339
+ if (end === -1)
340
+ matchedSlash = false, end = i + 1;
341
+ if (code === 46) {
342
+ if (startDot === -1)
343
+ startDot = i;
344
+ else if (preDotState !== 1)
345
+ preDotState = 1;
346
+ } else if (startDot !== -1)
347
+ preDotState = -1;
348
+ }
349
+ if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)
350
+ return "";
351
+ return path.slice(startDot, end);
352
+ }
353
+ function format(pathObject) {
354
+ if (pathObject === null || typeof pathObject !== "object")
355
+ throw TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
356
+ return _format("/", pathObject);
357
+ }
358
+ function parse(path) {
359
+ assertPath(path);
360
+ var ret = { root: "", dir: "", base: "", ext: "", name: "" };
361
+ if (path.length === 0)
362
+ return ret;
363
+ var code = path.charCodeAt(0), isAbsolute2 = code === 47, start;
364
+ if (isAbsolute2)
365
+ ret.root = "/", start = 1;
366
+ else
367
+ start = 0;
368
+ var startDot = -1, startPart = 0, end = -1, matchedSlash = true, i = path.length - 1, preDotState = 0;
369
+ for (;i >= start; --i) {
370
+ if (code = path.charCodeAt(i), code === 47) {
371
+ if (!matchedSlash) {
372
+ startPart = i + 1;
373
+ break;
374
+ }
375
+ continue;
376
+ }
377
+ if (end === -1)
378
+ matchedSlash = false, end = i + 1;
379
+ if (code === 46) {
380
+ if (startDot === -1)
381
+ startDot = i;
382
+ else if (preDotState !== 1)
383
+ preDotState = 1;
384
+ } else if (startDot !== -1)
385
+ preDotState = -1;
386
+ }
387
+ if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
388
+ if (end !== -1)
389
+ if (startPart === 0 && isAbsolute2)
390
+ ret.base = ret.name = path.slice(1, end);
391
+ else
392
+ ret.base = ret.name = path.slice(startPart, end);
393
+ } else {
394
+ if (startPart === 0 && isAbsolute2)
395
+ ret.name = path.slice(1, startDot), ret.base = path.slice(1, end);
396
+ else
397
+ ret.name = path.slice(startPart, startDot), ret.base = path.slice(startPart, end);
398
+ ret.ext = path.slice(startDot, end);
399
+ }
400
+ if (startPart > 0)
401
+ ret.dir = path.slice(0, startPart - 1);
402
+ else if (isAbsolute2)
403
+ ret.dir = "/";
404
+ return ret;
405
+ }
406
+ var sep = "/", delimiter = ":", posix, path_default;
407
+ var init_path = __esm(() => {
408
+ posix = ((p) => (p.posix = p, p))({ resolve, normalize, isAbsolute, join, relative, _makeLong, dirname, basename, extname, format, parse, sep, delimiter, win32: null, posix: null });
409
+ path_default = posix;
410
+ });
411
+
412
+ // src/shared/lib/sweep-sealed.ts
413
+ var exports_sweep_sealed = {};
414
+ __export(exports_sweep_sealed, {
415
+ sweepSealed: () => sweepSealed
416
+ });
417
+ import { Automerge } from "@automerge/automerge-repo/slim";
418
+ function concat(parts) {
419
+ let total = 0;
420
+ for (const part of parts)
421
+ total += part.byteLength;
422
+ const out = new Uint8Array(total);
423
+ let offset = 0;
424
+ for (const part of parts) {
425
+ out.set(part, offset);
426
+ offset += part.byteLength;
427
+ }
428
+ return out;
429
+ }
430
+ function materialise(chunks) {
431
+ const content = chunks.filter((chunk) => chunk.key[1] !== "sync-state" && chunk.data !== undefined).sort((a, b) => (a.key[1] === "snapshot" ? 0 : 1) - (b.key[1] === "snapshot" ? 0 : 1));
432
+ if (content.length === 0)
433
+ return;
434
+ try {
435
+ return Automerge.loadIncremental(Automerge.init(), concat(content.map((chunk) => chunk.data)));
436
+ } catch {
437
+ return;
438
+ }
439
+ }
440
+ async function collectChunksByDocument(storage, documentIds) {
441
+ const chunks = [];
442
+ if (documentIds === undefined) {
443
+ chunks.push(...await storage.loadRange([]));
444
+ } else {
445
+ for (const documentId of documentIds) {
446
+ chunks.push(...await storage.loadRange([documentId]));
447
+ }
448
+ }
449
+ const byDocument = new Map;
450
+ for (const chunk of chunks) {
451
+ const documentId = chunk.key[0];
452
+ if (documentId === undefined)
453
+ continue;
454
+ const existing = byDocument.get(documentId);
455
+ if (existing)
456
+ existing.push(chunk);
457
+ else
458
+ byDocument.set(documentId, [chunk]);
459
+ }
460
+ return byDocument;
461
+ }
462
+ function classifyDocument(documentId, chunks, context) {
463
+ const doc = materialise(chunks);
464
+ if (doc === undefined)
465
+ return { action: "ignore" };
466
+ const sealedAt = context.isSealed(doc);
467
+ if (sealedAt === undefined)
468
+ return { action: "ignore" };
469
+ const id = documentId;
470
+ if (context.repo.handles[id] !== undefined) {
471
+ return { action: "keep", entry: { documentId: id, reason: "open-handle" } };
472
+ }
473
+ if (context.at - sealedAt < context.olderThan) {
474
+ return { action: "keep", entry: { documentId: id, reason: "too-recent" } };
475
+ }
476
+ const byteSize = chunks.reduce((sum, chunk) => sum + (chunk.data?.byteLength ?? 0), 0);
477
+ return { action: "sweep", entry: { documentId: id, sealedAt, byteSize } };
478
+ }
479
+ async function sweepSealed(options) {
480
+ const { repo, storage, isSealed, olderThan } = options;
481
+ const dryRun = options.dryRun ?? false;
482
+ const now = options.now ?? Date.now;
483
+ const byDocument = await collectChunksByDocument(storage, options.documentIds);
484
+ const swept = [];
485
+ const kept = [];
486
+ const at = now();
487
+ for (const [documentId, chunks] of byDocument) {
488
+ const verdict = classifyDocument(documentId, chunks, { repo, isSealed, olderThan, at });
489
+ if (verdict.action === "keep") {
490
+ kept.push(verdict.entry);
491
+ } else if (verdict.action === "sweep") {
492
+ swept.push(verdict.entry);
493
+ if (!dryRun)
494
+ await storage.removeRange([documentId]);
495
+ }
496
+ }
497
+ return { swept, kept, dryRun };
498
+ }
499
+ var init_sweep_sealed = () => {};
500
+
72
501
  // src/elysia/peer-repo-plugin.ts
73
502
  import { Elysia } from "elysia";
74
503
 
75
504
  // src/shared/lib/peer-repo-server.ts
505
+ async function listNodeFSDocumentIds(baseDirectory) {
506
+ const [{ readdir }, { join: join2 }] = await Promise.all([
507
+ import("node:fs/promises"),
508
+ Promise.resolve().then(() => (init_path(), exports_path))
509
+ ]);
510
+ let shards;
511
+ try {
512
+ shards = await readdir(baseDirectory);
513
+ } catch (error) {
514
+ if (error.code === "ENOENT")
515
+ return [];
516
+ throw error;
517
+ }
518
+ const documentIds = [];
519
+ for (const shard of shards) {
520
+ const entries = await readdir(join2(baseDirectory, shard), {
521
+ withFileTypes: true
522
+ }).catch(() => []);
523
+ for (const entry of entries) {
524
+ if (entry.isDirectory())
525
+ documentIds.push(shard + entry.name);
526
+ }
527
+ }
528
+ return documentIds;
529
+ }
76
530
  async function createPeerRepoServer(options) {
77
531
  const [{ Repo }, { WebSocketServerAdapter }, { NodeFSStorageAdapter }, ws] = await Promise.all([
78
532
  import("@automerge/automerge-repo/slim"),
@@ -80,15 +534,16 @@ async function createPeerRepoServer(options) {
80
534
  import("@automerge/automerge-repo-storage-nodefs"),
81
535
  import("ws")
82
536
  ]);
83
- const wss = await (options.webSocketServer ? Promise.resolve(options.webSocketServer) : new Promise((resolve, reject) => {
537
+ const wss = await (options.webSocketServer ? Promise.resolve(options.webSocketServer) : new Promise((resolve2, reject) => {
84
538
  const created = new ws.WebSocketServer({
85
539
  port: options.port,
86
540
  ...options.host !== undefined && { host: options.host }
87
- }, () => resolve(created));
541
+ }, () => resolve2(created));
88
542
  created.once("error", reject);
89
543
  }));
90
544
  const adapter = new WebSocketServerAdapter(wss);
91
- const storage = new NodeFSStorageAdapter(options.storagePath);
545
+ const storagePath = options.storagePath ?? "automerge-repo-data";
546
+ const storage = new NodeFSStorageAdapter(storagePath);
92
547
  const repo = new Repo({
93
548
  network: [adapter],
94
549
  storage
@@ -99,6 +554,11 @@ async function createPeerRepoServer(options) {
99
554
  webSocketServer: wss,
100
555
  adapter,
101
556
  storage,
557
+ sweepSealed: async (sweepOptions) => {
558
+ const documentIds = await listNodeFSDocumentIds(storagePath);
559
+ const { sweepSealed: sweepSealed2 } = await Promise.resolve().then(() => (init_sweep_sealed(), exports_sweep_sealed));
560
+ return sweepSealed2({ repo, storage, documentIds, ...sweepOptions });
561
+ },
102
562
  close: async () => {
103
563
  for (const client of wss.clients) {
104
564
  try {
@@ -436,4 +896,4 @@ export {
436
896
  peerRepo
437
897
  };
438
898
 
439
- //# debugId=EDAD4E57925183E464756E2164756E21
899
+ //# debugId=77B9B7B157F0E2A364756E2164756E21