@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.
- package/dist/src/client/index.js +2 -2
- package/dist/src/client/index.js.map +2 -2
- package/dist/src/elysia/index.js +464 -4
- package/dist/src/elysia/index.js.map +6 -4
- package/dist/src/peer.d.ts +2 -0
- package/dist/src/peer.js +468 -4
- package/dist/src/peer.js.map +8 -5
- package/dist/src/polly-ui/ActionInput.d.ts +12 -2
- package/dist/src/polly-ui/ActionSelect.d.ts +36 -0
- package/dist/src/polly-ui/Button.d.ts +4 -0
- package/dist/src/polly-ui/Cluster.d.ts +36 -0
- package/dist/src/polly-ui/Code.d.ts +18 -0
- package/dist/src/polly-ui/Surface.d.ts +12 -1
- package/dist/src/polly-ui/Text.d.ts +43 -0
- package/dist/src/polly-ui/index.css +320 -194
- package/dist/src/polly-ui/index.d.ts +5 -1
- package/dist/src/polly-ui/index.js +533 -284
- package/dist/src/polly-ui/index.js.map +14 -8
- package/dist/src/polly-ui/internal/dispatch-action.d.ts +13 -0
- package/dist/src/polly-ui/internal/passthrough.d.ts +25 -0
- package/dist/src/polly-ui/markdown.js +3 -3
- package/dist/src/polly-ui/markdown.js.map +2 -2
- package/dist/src/polly-ui/styles.css +345 -194
- package/dist/src/polly-ui/theme.css +1 -0
- package/dist/src/shared/lib/peer-repo-server.d.ts +18 -0
- package/dist/src/shared/lib/sweep-sealed.d.ts +111 -0
- package/dist/tools/quality/src/cli.js +6 -2
- package/dist/tools/quality/src/cli.js.map +3 -3
- package/dist/tools/quality/src/index.js +6 -2
- package/dist/tools/quality/src/index.js.map +3 -3
- package/dist/tools/test/src/browser/run.js +89 -49
- package/dist/tools/test/src/browser/run.js.map +6 -5
- package/dist/tools/test/src/browser/runner-core.d.ts +32 -0
- package/dist/tools/test/src/e2e-mesh/index.js +193 -171
- package/dist/tools/test/src/e2e-mesh/index.js.map +4 -4
- package/dist/tools/test/src/visual/index.js +270 -251
- package/dist/tools/test/src/visual/index.js.map +5 -5
- package/dist/tools/verify/specs/tla/MeshSeed.cfg +27 -0
- package/dist/tools/verify/specs/tla/MeshSeed.tla +179 -0
- package/dist/tools/verify/specs/tla/README.md +11 -1
- package/dist/tools/verify/src/cli.js +136 -51
- package/dist/tools/verify/src/cli.js.map +9 -7
- package/dist/tools/visualize/src/cli.js +72 -2
- package/dist/tools/visualize/src/cli.js.map +5 -5
- package/package.json +3 -2
package/dist/src/client/index.js
CHANGED
|
@@ -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
|
-
//
|
|
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=
|
|
646
|
+
//# debugId=DBB93F1CDEC2CAC264756E2164756E21
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/client/wrapper.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": "
|
|
11
|
+
"debugId": "DBB93F1CDEC2CAC264756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
package/dist/src/elysia/index.js
CHANGED
|
@@ -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((
|
|
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
|
-
}, () =>
|
|
541
|
+
}, () => resolve2(created));
|
|
88
542
|
created.once("error", reject);
|
|
89
543
|
}));
|
|
90
544
|
const adapter = new WebSocketServerAdapter(wss);
|
|
91
|
-
const
|
|
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=
|
|
899
|
+
//# debugId=77B9B7B157F0E2A364756E2164756E21
|