@candypoets/nipworker 0.0.77 → 0.82.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.
@@ -68,11 +68,11 @@ export interface InitOutput {
68
68
  readonly crypto_setPrivateKey: (a: number, b: number, c: number) => [number, number];
69
69
  readonly crypto_signEvent: (a: number, b: number, c: number) => any;
70
70
  readonly init_tracing: (a: number, b: number) => void;
71
- readonly wasm_bindgen__convert__closures_____invoke__h9ed329622efc412d: (a: number, b: number, c: any) => void;
72
- readonly wasm_bindgen__closure__destroy__hbb3e147482ea61e2: (a: number, b: number) => void;
73
- readonly wasm_bindgen__convert__closures_____invoke__h97fec0bf7c7e4173: (a: number, b: number) => void;
74
- readonly wasm_bindgen__closure__destroy__h5902797d4730ddc3: (a: number, b: number) => void;
75
- readonly wasm_bindgen__convert__closures_____invoke__h21af4bfb35f9aaf6: (a: number, b: number, c: any, d: any) => void;
71
+ readonly wasm_bindgen__convert__closures_____invoke__hda26f2f5ec165974: (a: number, b: number) => void;
72
+ readonly wasm_bindgen__closure__destroy__h4940f445e6734f49: (a: number, b: number) => void;
73
+ readonly wasm_bindgen__convert__closures_____invoke__h9843c338a3572dc8: (a: number, b: number, c: any) => void;
74
+ readonly wasm_bindgen__closure__destroy__h4c8cbcd6ef379072: (a: number, b: number) => void;
75
+ readonly wasm_bindgen__convert__closures_____invoke__h8c2872b8ed2caf8c: (a: number, b: number, c: any, d: any) => void;
76
76
  readonly __wbindgen_malloc: (a: number, b: number) => number;
77
77
  readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
78
78
  readonly __wbindgen_exn_store: (a: number) => void;
@@ -13,11 +13,11 @@ export const crypto_setNip46QR: (a: number, b: number, c: number, d: number, e:
13
13
  export const crypto_setPrivateKey: (a: number, b: number, c: number) => [number, number];
14
14
  export const crypto_signEvent: (a: number, b: number, c: number) => any;
15
15
  export const init_tracing: (a: number, b: number) => void;
16
- export const wasm_bindgen__convert__closures_____invoke__h9ed329622efc412d: (a: number, b: number, c: any) => void;
17
- export const wasm_bindgen__closure__destroy__hbb3e147482ea61e2: (a: number, b: number) => void;
18
- export const wasm_bindgen__convert__closures_____invoke__h97fec0bf7c7e4173: (a: number, b: number) => void;
19
- export const wasm_bindgen__closure__destroy__h5902797d4730ddc3: (a: number, b: number) => void;
20
- export const wasm_bindgen__convert__closures_____invoke__h21af4bfb35f9aaf6: (a: number, b: number, c: any, d: any) => void;
16
+ export const wasm_bindgen__convert__closures_____invoke__hda26f2f5ec165974: (a: number, b: number) => void;
17
+ export const wasm_bindgen__closure__destroy__h4940f445e6734f49: (a: number, b: number) => void;
18
+ export const wasm_bindgen__convert__closures_____invoke__h9843c338a3572dc8: (a: number, b: number, c: any) => void;
19
+ export const wasm_bindgen__closure__destroy__h4c8cbcd6ef379072: (a: number, b: number) => void;
20
+ export const wasm_bindgen__convert__closures_____invoke__h8c2872b8ed2caf8c: (a: number, b: number, c: any, d: any) => void;
21
21
  export const __wbindgen_malloc: (a: number, b: number) => number;
22
22
  export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
23
23
  export const __wbindgen_exn_store: (a: number) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAuB,KAAK,kBAAkB,EAAE,MAAM,GAAG,CAAC;AAMhF,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5F,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,cAwCrD;AAED,wBAAgB,eAAe,CAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,aAAa,EAAE,EACzB,QAAQ,GAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAe,EACrD,OAAO,GAAE,kBAA2C,GAClD,MAAM,IAAI,CAqFZ;AAED,wBAAgB,UAAU,CACzB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,aAAa,EACpB,QAAQ,GAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAe,EACrD,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAGzD,GACC,MAAM,IAAI,CAwCZ;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,QAIrF"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAuB,KAAK,kBAAkB,EAAE,MAAM,GAAG,CAAC;AAMhF,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5F,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,cAwCrD;AAED,wBAAgB,eAAe,CAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,aAAa,EAAE,EACzB,QAAQ,GAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAe,EACrD,OAAO,GAAE,kBAA2C,GAClD,MAAM,IAAI,CAgFZ;AAED,wBAAgB,UAAU,CACzB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,aAAa,EACpB,QAAQ,GAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAe,EACrD,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAGzD,GACC,MAAM,IAAI,CAuCZ;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,QAIrF"}
package/dist/hooks.js CHANGED
@@ -1 +1 @@
1
- import{s as g,m as c,S as h}from"./index2.js";import{B as w}from"./ring-buffer.js";const E=new TextDecoder;function S(e){const f=new w(g);let d=!1,u=10;const s=10,o=100;return(async()=>{for(;!d;){let i=0;for(;;){const a=f.read();if(!a)break;i++;const r=E.decode(a),t=r.indexOf("|");if(t>0){const n=r.slice(0,t),b=r.slice(t+1);(n==="connected"||n==="failed"||n==="close")&&e(n,b)}}u=i>0?s:Math.min(u*2,o),await new Promise(a=>setTimeout(a,u))}})(),()=>{d=!0}}function y(e,f,d=()=>{},u={closeOnEose:!1}){if(!e)return console.warn("useSharedSubscription: No subscription ID provided"),()=>{};let s=null,o=4,i=!0,a=!1,r=!1;e=c.createShortId(e);let t=!1,n=!1;const b=()=>{if(!i||!s){n=!1;return}if(!n){n=!0;try{let l=h.readMessages(s,o);for(;l.hasNewData&&s;){for(const v of l.messages)d(v);o=l.newReadPosition,l=h.readMessages(s,o)}}catch(l){l instanceof TypeError&&l.message.includes("DataView")||console.error(`[HOOK] Error processing events for ${e}:`,l)}finally{n=!1}}},p=()=>{i&&(t||(t=!0,queueMicrotask(()=>{t=!1,b()})))},m=()=>{a||(console.log(`[HOOK] Unsubscribing from ${e}`),i=!1,r&&(c.removeEventListener(`subscription:${e}`,p),c.unsubscribe(e),a=!0),Promise.resolve().then(()=>{s=null,o=4}))};return s=c.subscribe(e,f,u),r=!0,c.addEventListener(`subscription:${e}`,p),p(),m}function O(e,f,d=()=>{},u={trackStatus:!0,defaultRelays:[]}){if(!e)return console.warn("usePublish: No publish ID provided"),()=>{};let s=null,o=4,i=!0;const a=()=>{i=!1,c.removeEventListener(`publish:${e}`,r)};s=c.publish(e,f,u.defaultRelays);const r=()=>{if(!i||!s)return;const t=h.readMessages(s,o);t.hasNewData&&(t.messages.forEach(n=>{d(n)}),o=t.newReadPosition)};return u.trackStatus&&(c.addEventListener(`publish:${e}`,r),queueMicrotask(r)),a}function P(e,f){c.signEvent(e,f)}export{O as usePublish,S as useRelayStatus,P as useSignEvent,y as useSubscription};
1
+ import{s as w,m as c,S as h}from"./index2.js";import{B as g}from"./ring-buffer.js";const E=new TextDecoder;function y(e){const l=new g(w);let f=!1,u=10;const s=10,a=100;return(async()=>{for(;!f;){let i=0;for(;;){const o=l.read();if(!o)break;i++;const r=E.decode(o),t=r.indexOf("|");if(t>0){const n=r.slice(0,t),m=r.slice(t+1);(n==="connected"||n==="failed"||n==="close")&&e(n,m)}}u=i>0?s:Math.min(u*2,a),await new Promise(o=>setTimeout(o,u))}})(),()=>{f=!0}}function M(e,l,f=()=>{},u={closeOnEose:!1}){if(!e)return()=>{};let s=null,a=4,i=!0,o=!1,r=!1;e=c.createShortId(e);let t=!1,n=!1;const m=()=>{if(!i||!s){n=!1;return}if(!n){n=!0;try{let d=h.readMessages(s,a);for(;d.hasNewData&&s;){for(const v of d.messages)f(v);a=d.newReadPosition,d=h.readMessages(s,a)}}catch{}finally{n=!1}}},b=()=>{i&&(t||(t=!0,queueMicrotask(()=>{t=!1,m()})))},p=()=>{o||(i=!1,r&&(c.removeEventListener(`subscription:${e}`,b),c.unsubscribe(e),o=!0),Promise.resolve().then(()=>{s=null,a=4}))};return s=c.subscribe(e,l,u),r=!0,c.addEventListener(`subscription:${e}`,b),b(),p}function S(e,l,f=()=>{},u={trackStatus:!0,defaultRelays:[]}){if(!e)return()=>{};let s=null,a=4,i=!0;const o=()=>{i=!1,c.removeEventListener(`publish:${e}`,r)};s=c.publish(e,l,u.defaultRelays);const r=()=>{if(!i||!s)return;const t=h.readMessages(s,a);t.hasNewData&&(t.messages.forEach(n=>{f(n)}),a=t.newReadPosition)};return u.trackStatus&&(c.addEventListener(`publish:${e}`,r),queueMicrotask(r)),o}function k(e,l){c.signEvent(e,l)}export{S as usePublish,y as useRelayStatus,k as useSignEvent,M as useSubscription};
package/dist/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sources":["../src/hooks.ts"],"sourcesContent":["import { Event, EventTemplate } from 'nostr-tools';\nimport { SharedBufferReader } from 'src/lib/SharedBuffer';\n// import { nipWorker, statusRing } from '.';\nimport { WorkerMessage } from './generated/nostr/fb';\nimport { RequestObject, statusRing, manager, type SubscriptionConfig } from '.';\nimport { ByteRingBuffer } from './ws/ring-buffer'; // existing helper\n\nconst decoder = new TextDecoder();\n\n// Provide a handler from your app (e.g., React setState or Redux dispatch)\nexport type StatusHandler = (status: 'connected' | 'failed' | 'close', url: string) => void;\n\nexport function useRelayStatus(onStatus: StatusHandler) {\n\tconst ring = new ByteRingBuffer(statusRing);\n\n\tlet stopped = false;\n\tlet backoffMs = 10;\n\tconst MIN_BACKOFF_MS = 10;\n\tconst MAX_BACKOFF_MS = 100;\n\n\tconst loop = async () => {\n\t\twhile (!stopped) {\n\t\t\tlet processed = 0;\n\n\t\t\twhile (true) {\n\t\t\t\tconst record = ring.read();\n\t\t\t\tif (!record) break;\n\n\t\t\t\tprocessed++;\n\t\t\t\tconst line = decoder.decode(record);\n\t\t\t\tconst sep = line.indexOf('|');\n\t\t\t\tif (sep > 0) {\n\t\t\t\t\tconst status = line.slice(0, sep) as 'connected' | 'failed' | 'close';\n\t\t\t\t\tconst url = line.slice(sep + 1);\n\t\t\t\t\tif (status === 'connected' || status === 'failed' || status === 'close') {\n\t\t\t\t\t\tonStatus(status, url);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbackoffMs = processed > 0 ? MIN_BACKOFF_MS : Math.min(backoffMs * 2, MAX_BACKOFF_MS);\n\t\t\tawait new Promise((r) => setTimeout(r, backoffMs));\n\t\t}\n\t};\n\n\t// Fire-and-forget\n\tloop();\n\n\t// Return a stop handle\n\treturn () => {\n\t\tstopped = true;\n\t};\n}\n\nexport function useSubscription(\n\tsubId: string,\n\trequests: RequestObject[],\n\tcallback: (message: WorkerMessage) => void = () => {},\n\toptions: SubscriptionConfig = { closeOnEose: false }\n): () => void {\n\tif (!subId) {\n\t\tconsole.warn('useSharedSubscription: No subscription ID provided');\n\t\treturn () => {};\n\t}\n\n\tlet buffer: SharedArrayBuffer | null = null;\n\tlet lastReadPos = 4;\n\tlet running = true;\n\tlet hasUnsubscribed = false;\n\tlet hasSubscribed = false;\n\tlet originId = subId;\n\tsubId = manager.createShortId(subId);\n\t// const manager = nipWorker.getManager(subId);\n\n\t// Reentrancy/coalescing flags\n\tlet scheduled = false;\n\tlet processing = false;\n\n\tconst processEvents = (): void => {\n\t\tif (!running || !buffer) {\n\t\t\tprocessing = false;\n\t\t\treturn;\n\t\t}\n\t\tif (processing) return; // Avoid overlapping runs\n\t\tprocessing = true;\n\t\ttry {\n\t\t\tlet result = SharedBufferReader.readMessages(buffer, lastReadPos);\n\t\t\twhile (result.hasNewData && buffer) {\n\t\t\t\tfor (const message of result.messages) {\n\t\t\t\t\tcallback(message);\n\t\t\t\t}\n\t\t\t\tlastReadPos = result.newReadPosition;\n\t\t\t\tresult = SharedBufferReader.readMessages(buffer, lastReadPos);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Guard against null buffer in race conditions\n\t\t\tif (!(e instanceof TypeError && e.message.includes('DataView'))) {\n\t\t\t\tconsole.error(`[HOOK] Error processing events for ${subId}:`, e);\n\t\t\t}\n\t\t} finally {\n\t\t\tprocessing = false;\n\t\t}\n\t};\n\n\tconst scheduleProcess = () => {\n\t\tif (!running) return;\n\t\tif (scheduled) return;\n\t\tscheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tscheduled = false;\n\t\t\tprocessEvents();\n\t\t});\n\t};\n\n\tconst unsubscribe = (): void => {\n\t\tif (hasUnsubscribed) return;\n\t\t\n\t\tconsole.log(`[HOOK] Unsubscribing from ${subId}`);\n\t\trunning = false; // Stop scheduling new work\n\n\t\tif (hasSubscribed) {\n\t\t\t// Remove the exact same listener function that was added\n\t\t\tmanager.removeEventListener(`subscription:${subId}`, scheduleProcess);\n\t\t\tmanager.unsubscribe(subId);\n\t\t\thasUnsubscribed = true;\n\t\t}\n\t\t\n\t\t// Defer buffer cleanup to allow pending microtasks to complete\n\t\tPromise.resolve().then(() => {\n\t\t\tbuffer = null;\n\t\t\tlastReadPos = 4;\n\t\t});\n\t};\n\tbuffer = manager.subscribe(subId, requests, options);\n\thasSubscribed = true;\n\n\t// Add the listener using the exact same function reference for proper removal\n\tmanager.addEventListener(`subscription:${subId}`, scheduleProcess);\n\n\t// setInterval(scheduleProcess, 1000);\n\t// Prime initial drain\n\tscheduleProcess();\n\n\treturn unsubscribe;\n}\n\nexport function usePublish(\n\tpubId: string,\n\tevent: EventTemplate,\n\tcallback: (message: WorkerMessage) => void = () => {},\n\toptions: { trackStatus?: boolean; defaultRelays?: string[] } = {\n\t\ttrackStatus: true,\n\t\tdefaultRelays: []\n\t}\n): () => void {\n\tif (!pubId) {\n\t\tconsole.warn('usePublish: No publish ID provided');\n\t\treturn () => {};\n\t}\n\n\tlet buffer: SharedArrayBuffer | null = null;\n\tlet lastReadPos: number = 4;\n\tlet running = true;\n\n\t// pubId = nipWorker.createShortId(pubId);\n\n\t// const manager = nipWorker.getManager(pubId);\n\n\tconst unsubscribe = (): void => {\n\t\trunning = false;\n\t\tmanager.removeEventListener(`publish:${pubId}`, processEvents);\n\t};\n\n\tbuffer = manager.publish(pubId, event as any, options.defaultRelays);\n\n\tconst processEvents = (): void => {\n\t\tif (!running || !buffer) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = SharedBufferReader.readMessages(buffer, lastReadPos);\n\t\tif (result.hasNewData) {\n\t\t\tresult.messages.forEach((message: WorkerMessage) => {\n\t\t\t\tcallback(message);\n\t\t\t});\n\t\t\tlastReadPos = result.newReadPosition;\n\t\t}\n\t};\n\n\tif (options.trackStatus) {\n\t\tmanager.addEventListener(`publish:${pubId}`, processEvents);\n\t\tqueueMicrotask(processEvents);\n\t}\n\n\treturn unsubscribe;\n}\n\nexport function useSignEvent(template: EventTemplate, callback: (event: Event) => void) {\n\t// const manager = nipWorker.getManager('');\n\n\tmanager.signEvent(template, callback);\n}\n"],"names":["decoder","useRelayStatus","onStatus","ring","ByteRingBuffer","statusRing","stopped","backoffMs","MIN_BACKOFF_MS","MAX_BACKOFF_MS","processed","record","line","sep","status","url","r","useSubscription","subId","requests","callback","options","buffer","lastReadPos","running","hasUnsubscribed","hasSubscribed","manager","scheduled","processing","processEvents","result","SharedBufferReader","message","e","scheduleProcess","unsubscribe","usePublish","pubId","event","useSignEvent","template"],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sources":["../src/hooks.ts"],"sourcesContent":["import { Event, EventTemplate } from 'nostr-tools';\nimport { SharedBufferReader } from 'src/lib/SharedBuffer';\n// import { nipWorker, statusRing } from '.';\nimport { WorkerMessage } from './generated/nostr/fb';\nimport { RequestObject, statusRing, manager, type SubscriptionConfig } from '.';\nimport { ByteRingBuffer } from './ws/ring-buffer'; // existing helper\n\nconst decoder = new TextDecoder();\n\n// Provide a handler from your app (e.g., React setState or Redux dispatch)\nexport type StatusHandler = (status: 'connected' | 'failed' | 'close', url: string) => void;\n\nexport function useRelayStatus(onStatus: StatusHandler) {\n\tconst ring = new ByteRingBuffer(statusRing);\n\n\tlet stopped = false;\n\tlet backoffMs = 10;\n\tconst MIN_BACKOFF_MS = 10;\n\tconst MAX_BACKOFF_MS = 100;\n\n\tconst loop = async () => {\n\t\twhile (!stopped) {\n\t\t\tlet processed = 0;\n\n\t\t\twhile (true) {\n\t\t\t\tconst record = ring.read();\n\t\t\t\tif (!record) break;\n\n\t\t\t\tprocessed++;\n\t\t\t\tconst line = decoder.decode(record);\n\t\t\t\tconst sep = line.indexOf('|');\n\t\t\t\tif (sep > 0) {\n\t\t\t\t\tconst status = line.slice(0, sep) as 'connected' | 'failed' | 'close';\n\t\t\t\t\tconst url = line.slice(sep + 1);\n\t\t\t\t\tif (status === 'connected' || status === 'failed' || status === 'close') {\n\t\t\t\t\t\tonStatus(status, url);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbackoffMs = processed > 0 ? MIN_BACKOFF_MS : Math.min(backoffMs * 2, MAX_BACKOFF_MS);\n\t\t\tawait new Promise((r) => setTimeout(r, backoffMs));\n\t\t}\n\t};\n\n\t// Fire-and-forget\n\tloop();\n\n\t// Return a stop handle\n\treturn () => {\n\t\tstopped = true;\n\t};\n}\n\nexport function useSubscription(\n\tsubId: string,\n\trequests: RequestObject[],\n\tcallback: (message: WorkerMessage) => void = () => {},\n\toptions: SubscriptionConfig = { closeOnEose: false }\n): () => void {\n\tif (!subId) {\n\t\treturn () => {};\n\t}\n\n\tlet buffer: SharedArrayBuffer | null = null;\n\tlet lastReadPos = 4;\n\tlet running = true;\n\tlet hasUnsubscribed = false;\n\tlet hasSubscribed = false;\n\tlet originId = subId;\n\tsubId = manager.createShortId(subId);\n\t// const manager = nipWorker.getManager(subId);\n\n\t// Reentrancy/coalescing flags\n\tlet scheduled = false;\n\tlet processing = false;\n\n\tconst processEvents = (): void => {\n\t\tif (!running || !buffer) {\n\t\t\tprocessing = false;\n\t\t\treturn;\n\t\t}\n\t\tif (processing) return; // Avoid overlapping runs\n\t\tprocessing = true;\n\t\ttry {\n\t\t\tlet result = SharedBufferReader.readMessages(buffer, lastReadPos);\n\t\t\twhile (result.hasNewData && buffer) {\n\t\t\t\tfor (const message of result.messages) {\n\t\t\t\t\tcallback(message);\n\t\t\t\t}\n\t\t\t\tlastReadPos = result.newReadPosition;\n\t\t\t\tresult = SharedBufferReader.readMessages(buffer, lastReadPos);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Guard against null buffer in race conditions\n\t\t} finally {\n\t\t\tprocessing = false;\n\t\t}\n\t};\n\n\tconst scheduleProcess = () => {\n\t\tif (!running) return;\n\t\tif (scheduled) return;\n\t\tscheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tscheduled = false;\n\t\t\tprocessEvents();\n\t\t});\n\t};\n\n\tconst unsubscribe = (): void => {\n\t\tif (hasUnsubscribed) return;\n\n\t\trunning = false; // Stop scheduling new work\n\n\t\tif (hasSubscribed) {\n\t\t\t// Remove the exact same listener function that was added\n\t\t\tmanager.removeEventListener(`subscription:${subId}`, scheduleProcess);\n\t\t\tmanager.unsubscribe(subId);\n\t\t\thasUnsubscribed = true;\n\t\t}\n\n\t\t// Defer buffer cleanup to allow pending microtasks to complete\n\t\tPromise.resolve().then(() => {\n\t\t\tbuffer = null;\n\t\t\tlastReadPos = 4;\n\t\t});\n\t};\n\tbuffer = manager.subscribe(subId, requests, options);\n\thasSubscribed = true;\n\n\t// Add the listener using the exact same function reference for proper removal\n\tmanager.addEventListener(`subscription:${subId}`, scheduleProcess);\n\n\t// setInterval(scheduleProcess, 1000);\n\t// Prime initial drain\n\tscheduleProcess();\n\n\treturn unsubscribe;\n}\n\nexport function usePublish(\n\tpubId: string,\n\tevent: EventTemplate,\n\tcallback: (message: WorkerMessage) => void = () => {},\n\toptions: { trackStatus?: boolean; defaultRelays?: string[] } = {\n\t\ttrackStatus: true,\n\t\tdefaultRelays: []\n\t}\n): () => void {\n\tif (!pubId) {\n\t\treturn () => {};\n\t}\n\n\tlet buffer: SharedArrayBuffer | null = null;\n\tlet lastReadPos: number = 4;\n\tlet running = true;\n\n\t// pubId = nipWorker.createShortId(pubId);\n\n\t// const manager = nipWorker.getManager(pubId);\n\n\tconst unsubscribe = (): void => {\n\t\trunning = false;\n\t\tmanager.removeEventListener(`publish:${pubId}`, processEvents);\n\t};\n\n\tbuffer = manager.publish(pubId, event as any, options.defaultRelays);\n\n\tconst processEvents = (): void => {\n\t\tif (!running || !buffer) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = SharedBufferReader.readMessages(buffer, lastReadPos);\n\t\tif (result.hasNewData) {\n\t\t\tresult.messages.forEach((message: WorkerMessage) => {\n\t\t\t\tcallback(message);\n\t\t\t});\n\t\t\tlastReadPos = result.newReadPosition;\n\t\t}\n\t};\n\n\tif (options.trackStatus) {\n\t\tmanager.addEventListener(`publish:${pubId}`, processEvents);\n\t\tqueueMicrotask(processEvents);\n\t}\n\n\treturn unsubscribe;\n}\n\nexport function useSignEvent(template: EventTemplate, callback: (event: Event) => void) {\n\t// const manager = nipWorker.getManager('');\n\n\tmanager.signEvent(template, callback);\n}\n"],"names":["decoder","useRelayStatus","onStatus","ring","ByteRingBuffer","statusRing","stopped","backoffMs","MIN_BACKOFF_MS","MAX_BACKOFF_MS","processed","record","line","sep","status","url","r","useSubscription","subId","requests","callback","options","buffer","lastReadPos","running","hasUnsubscribed","hasSubscribed","manager","scheduled","processing","processEvents","result","SharedBufferReader","message","scheduleProcess","unsubscribe","usePublish","pubId","event","useSignEvent","template"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI7D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAkB9D,cAAc,kBAAkB,CAAC;AAGjC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CA4BpE;AAED,eAAO,MAAM,UAAU,mBAAmC,CAAC;AAE3D;;GAEG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAOjB;IACJ,OAAO,CAAC,SAAS,CAAoD;IAGrE,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,eAAe,CAA+C;IAEtE,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAqB;IAEjC,uBAAuB,WAAoC;;IA0ElE,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,mBAAmB;IA6FpB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAYpC,gBAAgB,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,CAAC,EAAE,uBAAuB,GAC/B,IAAI;IAIA,mBAAmB,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,CAAC,EAAE,oBAAoB,GAC5B,IAAI;IAIP,OAAO,CAAC,QAAQ;IAIhB,SAAS,CACR,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,kBAAkB,GACzB,iBAAiB;IA2DpB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IASvD,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAQzC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG,iBAAiB;IAwB/F,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAwBvF,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI;IAK/D,YAAY;IAOZ,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIvC,UAAU,CAAC,eAAe,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAOhE,QAAQ,IAAI,IAAI;IAIT,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,oBAAoB,IAAI,MAAM;IAI9B,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC;IAS7D,aAAa,CAAC,MAAM,EAAE,MAAM;IAQnC,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,cAAc;IAOf,MAAM;IAMb,OAAO,IAAI,IAAI;CAoCf;AAED,eAAO,MAAM,OAAO,cAAqB,CAAC;AAC1C,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI7D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAkB9D,cAAc,kBAAkB,CAAC;AAGjC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CA4BpE;AAED,eAAO,MAAM,UAAU,mBAAmC,CAAC;AAE3D;;GAEG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAOjB;IACJ,OAAO,CAAC,SAAS,CAAoD;IAGrE,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,eAAe,CAA+C;IAEtE,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAqB;IAEjC,uBAAuB,WAAoC;;IA0ElE,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,mBAAmB;IA+FpB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAYpC,gBAAgB,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,CAAC,EAAE,uBAAuB,GAC/B,IAAI;IAIA,mBAAmB,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,CAAC,EAAE,oBAAoB,GAC5B,IAAI;IAIP,OAAO,CAAC,QAAQ;IAIhB,SAAS,CACR,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,kBAAkB,GACzB,iBAAiB;IA2DpB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IASvD,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAQzC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG,iBAAiB;IAmB/F,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAuBvF,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI;IAK/D,YAAY;IAOZ,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIvC,UAAU,CAAC,eAAe,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAOhE,QAAQ,IAAI,IAAI;IAIT,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,oBAAoB,IAAI,MAAM;IAI9B,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC;IAS7D,aAAa,CAAC,MAAM,EAAE,MAAM;IAQnC,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,cAAc;IAOf,MAAM;IAMb,OAAO,IAAI,IAAI;CA0Bf;AAED,eAAO,MAAM,OAAO,cAAqB,CAAC;AAC1C,cAAc,SAAS,CAAC"}