@vielzeug/mesh 3.1.0 → 26.10.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/_base45.cjs +1 -1
- package/dist/_base45.cjs.map +1 -1
- package/dist/_base45.js +1 -37
- package/dist/_base45.js.map +1 -1
- package/dist/_defaults.cjs +2 -0
- package/dist/_defaults.cjs.map +1 -0
- package/dist/_defaults.d.ts +6 -0
- package/dist/_defaults.d.ts.map +1 -0
- package/dist/_defaults.js +2 -0
- package/dist/_defaults.js.map +1 -0
- package/dist/_node.cjs +1 -1
- package/dist/_node.cjs.map +1 -1
- package/dist/_node.d.ts +4 -11
- package/dist/_node.d.ts.map +1 -1
- package/dist/_node.js +1 -194
- package/dist/_node.js.map +1 -1
- package/dist/_proof.cjs +1 -1
- package/dist/_proof.cjs.map +1 -1
- package/dist/_proof.d.ts +8 -5
- package/dist/_proof.d.ts.map +1 -1
- package/dist/_proof.js +1 -21
- package/dist/_proof.js.map +1 -1
- package/dist/_random.cjs +1 -1
- package/dist/_random.cjs.map +1 -1
- package/dist/_random.d.ts.map +1 -1
- package/dist/_random.js +1 -15
- package/dist/_random.js.map +1 -1
- package/dist/_rtc.cjs +2 -2
- package/dist/_rtc.cjs.map +1 -1
- package/dist/_rtc.d.ts +7 -6
- package/dist/_rtc.d.ts.map +1 -1
- package/dist/_rtc.js +3 -41
- package/dist/_rtc.js.map +1 -1
- package/dist/_sdp.cjs +2 -2
- package/dist/_sdp.cjs.map +1 -1
- package/dist/_sdp.js +2 -54
- package/dist/_sdp.js.map +1 -1
- package/dist/_wire.cjs +1 -1
- package/dist/_wire.cjs.map +1 -1
- package/dist/_wire.js +1 -20
- package/dist/_wire.js.map +1 -1
- package/dist/codec.cjs +1 -1
- package/dist/codec.cjs.map +1 -1
- package/dist/codec.d.ts +14 -9
- package/dist/codec.d.ts.map +1 -1
- package/dist/codec.js +1 -34
- package/dist/codec.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +1 -18
- package/dist/errors.js.map +1 -1
- package/dist/guest.cjs +1 -1
- package/dist/guest.cjs.map +1 -1
- package/dist/guest.d.ts.map +1 -1
- package/dist/guest.js +1 -164
- package/dist/guest.js.map +1 -1
- package/dist/host.cjs +1 -1
- package/dist/host.cjs.map +1 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +1 -240
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -6
- package/dist/mesh.cjs +3 -3
- package/dist/mesh.cjs.map +1 -1
- package/dist/mesh.iife.js +3 -3
- package/dist/mesh.iife.js.map +1 -1
- package/dist/mesh.js +3 -3
- package/dist/mesh.js.map +1 -1
- package/dist/qr-codec.cjs +1 -1
- package/dist/qr-codec.cjs.map +1 -1
- package/dist/qr-codec.d.ts +3 -3
- package/dist/qr-codec.d.ts.map +1 -1
- package/dist/qr-codec.js +1 -67
- package/dist/qr-codec.js.map +1 -1
- package/dist/testing/fake-rtc.cjs +2 -0
- package/dist/testing/fake-rtc.cjs.map +1 -0
- package/dist/testing/fake-rtc.d.ts +32 -0
- package/dist/testing/fake-rtc.d.ts.map +1 -0
- package/dist/testing/fake-rtc.js +2 -0
- package/dist/testing/fake-rtc.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing.cjs +1 -0
- package/dist/testing.js +1 -0
- package/dist/types.d.ts +19 -37
- package/dist/types.d.ts.map +1 -1
- package/package.json +17 -5
- package/dist/_base64.cjs +0 -2
- package/dist/_base64.cjs.map +0 -1
- package/dist/_base64.d.ts +0 -9
- package/dist/_base64.d.ts.map +0 -1
- package/dist/_base64.js +0 -33
- package/dist/_base64.js.map +0 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { MeshRtcFactory } from '../types';
|
|
2
|
+
export interface FakeRtc {
|
|
3
|
+
/** Close both ends of the link created at `index` (0-based, pairing order). */
|
|
4
|
+
closeChannel(index: number): void;
|
|
5
|
+
/** Silently drop the next `n` channel sends. */
|
|
6
|
+
dropNext(n: number): void;
|
|
7
|
+
/** Make the next pairing fail at the ICE stage. */
|
|
8
|
+
failIce(): void;
|
|
9
|
+
/** Make the next completed link connect at ICE level but never open the channel. */
|
|
10
|
+
hangOpen(): void;
|
|
11
|
+
/** Delivery delay for messages and channel-open in milliseconds. Default: 0 (microtask). */
|
|
12
|
+
latencyMs: number;
|
|
13
|
+
/** Number of links initiated (one per created offer). */
|
|
14
|
+
readonly linkCount: number;
|
|
15
|
+
/** Every SDP handed to `setRemoteDescription`, in call order. */
|
|
16
|
+
readonly remoteSdps: readonly string[];
|
|
17
|
+
readonly rtc: MeshRtcFactory;
|
|
18
|
+
/** Make the next `setLocalDescription` never finish ICE gathering. */
|
|
19
|
+
stallIce(): void;
|
|
20
|
+
/** Drain all latency-queued deliveries immediately. */
|
|
21
|
+
tick(): void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* In-memory WebRTC stand-in for testing mesh nodes without a browser.
|
|
25
|
+
* Peer connections created from the same fixture wire together through fake
|
|
26
|
+
* SDP tokens — no network, no real ICE. Pass `fixture.rtc` as the `rtc`
|
|
27
|
+
* option to `createMeshHost`/`createMeshGuest`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createFakeRtc(options?: {
|
|
30
|
+
latencyMs?: number;
|
|
31
|
+
}): FakeRtc;
|
|
32
|
+
//# sourceMappingURL=fake-rtc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-rtc.d.ts","sourceRoot":"","sources":["../../src/testing/fake-rtc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EAIf,MAAM,UAAU,CAAC;AAkClB,MAAM,WAAW,OAAO;IACtB,+EAA+E;IAC/E,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,gDAAgD;IAChD,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mDAAmD;IACnD,OAAO,IAAI,IAAI,CAAC;IAChB,oFAAoF;IACpF,QAAQ,IAAI,IAAI,CAAC;IACjB,4FAA4F;IAC5F,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,sEAAsE;IACtE,QAAQ,IAAI,IAAI,CAAC;IACjB,uDAAuD;IACvD,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAiP3E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var ListenerBag=class{listeners=new Map;add(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}remove(e,t){this.listeners.get(e)?.delete(t)}emit(e,t={}){for(let n of this.listeners.get(e)??[])n(t)}addEventListener(e,t){this.add(e,t)}removeEventListener(e,t){this.remove(e,t)}};function createFakeRtc(e={}){let t=[],n=new Map,r=[],i=0,a=0,o=!1,s=!1,c=!1,l={closeChannel(e){let t=[...n.values()][e];t?.hostChannel?.close(),t?.guestChannel?.close(),t&&(t.hostPc.iceConnectionState=`disconnected`,t.hostPc.emit(`iceconnectionstatechange`),t.guestPc&&(t.guestPc.iceConnectionState=`disconnected`,t.guestPc.emit(`iceconnectionstatechange`)))},dropNext(e){a+=e},failIce(){o=!0},hangOpen(){c=!0},latencyMs:e.latencyMs??0,get linkCount(){return n.size},get remoteSdps(){return r},rtc:{createPeerConnection:()=>new FakePeerConnection(`pc${++i}`)},stallIce(){s=!0},tick(){for(;t.length;)t.shift()?.()}};function schedule(e){l.latencyMs>0?(t.push(e),setTimeout(l.tick,l.latencyMs)):queueMicrotask(e)}class FakeDataChannel extends ListenerBag{readyState=`connecting`;remote=null;send(e){if(this.readyState!==`open`)throw Error(`Channel is ${this.readyState}`);if(a>0){a--;return}let t=this.remote;t&&t.readyState===`open`&&schedule(()=>t.emit(`message`,{data:e}))}open(){this.readyState===`connecting`&&(this.readyState=`open`,this.emit(`open`))}close(){if(this.readyState===`closed`)return;this.readyState=`closed`,this.emit(`close`);let e=this.remote;e&&e.readyState!==`closed`&&(e.readyState=`closed`,e.emit(`close`))}}class FakePeerConnection extends ListenerBag{connectionState=`new`;iceConnectionState=`new`;iceGatheringState=`new`;localDescription=null;remoteDescription=null;pendingChannel=null;closed=!1;token;constructor(e){super(),this.token=e}createDataChannel(){return this.pendingChannel=new FakeDataChannel,this.pendingChannel}createOffer(){return n.set(this.token,{completed:!1,guestChannel:null,guestPc:null,hostChannel:null,hostPc:this,hostToken:this.token}),Promise.resolve({sdp:`fake-offer:${this.token}`,type:`offer`})}createAnswer(){let e=this.linkFor();return Promise.resolve({sdp:`fake-answer:${e?.hostToken??`none`}:guest:${this.token}`,type:`answer`})}setLocalDescription(e){return this.localDescription=e,s?(s=!1,this.iceGatheringState=`gathering`):this.iceGatheringState=`complete`,this.emit(`icegatheringstatechange`),Promise.resolve()}setRemoteDescription(e){if(this.remoteDescription=e,r.push(e.sdp??``),e.type===`offer`){let t=/fake-offer:(\w+)/.exec(e.sdp??``)?.[1],r=t?n.get(t):void 0;return r?(r.guestPc=this,Promise.resolve()):Promise.reject(Error(`Unknown offer`))}let t=/fake-answer:(\w+):guest:(\w+)/.exec(e.sdp??``),i=t?.[1]?n.get(t[1]):void 0;return!i||i.guestPc?.token!==t?.[2]?Promise.reject(Error(`Unknown answer`)):(this.completeLink(i),Promise.resolve())}close(){if(this.closed)return;this.closed=!0,this.connectionState=`closed`,this.iceConnectionState=`closed`,this.emit(`iceconnectionstatechange`),this.emit(`connectionstatechange`),this.pendingChannel?.close();let e=this.linkFor();if(e){e.guestChannel?.close(),e.hostChannel?.close();let t=e.guestPc===this?e.hostPc:e.guestPc;t&&!t.closed&&(t.iceConnectionState=`disconnected`,t.emit(`iceconnectionstatechange`))}}linkFor(){return[...n.values()].find(e=>e.hostPc===this||e.guestPc===this)}completeLink(e){if(e.completed)return;if(e.completed=!0,o){o=!1;for(let t of[e.hostPc,e.guestPc])t&&(t.iceConnectionState=`failed`,t.emit(`iceconnectionstatechange`));return}let t=e.hostPc.pendingChannel??new FakeDataChannel,n=new FakeDataChannel;t.remote=n,n.remote=t,e.hostChannel=t,e.guestChannel=n,e.guestPc?.emit(`datachannel`,{channel:n}),schedule(()=>{for(let t of[e.hostPc,e.guestPc])t&&!t.closed&&(t.iceConnectionState=`connected`,t.connectionState=`connected`,t.emit(`iceconnectionstatechange`),t.emit(`connectionstatechange`));if(c){c=!1;return}t.open(),n.open()})}}return l}export{createFakeRtc};
|
|
2
|
+
//# sourceMappingURL=fake-rtc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-rtc.js","names":[],"sources":["../../src/testing/fake-rtc.ts"],"sourcesContent":["import type {\n MeshRtcEvent,\n MeshRtcFactory,\n RTCDataChannelLike,\n RTCPeerConnectionLike,\n RTCSessionDescriptionLike,\n} from '../types';\n\ntype Listener = (event: MeshRtcEvent) => void;\n\nclass ListenerBag {\n private readonly listeners = new Map<string, Set<Listener>>();\n\n add(type: string, listener: Listener): void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener);\n }\n\n remove(type: string, listener: Listener): void {\n this.listeners.get(type)?.delete(listener);\n }\n\n emit(type: string, event: MeshRtcEvent = {}): void {\n for (const listener of this.listeners.get(type) ?? []) listener(event);\n }\n\n // `never` accepts every listener shape declared by the `*Like` overloads.\n addEventListener(type: string, listener: (event: never) => void): void {\n this.add(type, listener as Listener);\n }\n\n removeEventListener(type: string, listener: (event: never) => void): void {\n this.remove(type, listener as Listener);\n }\n}\n\nexport interface FakeRtc {\n /** Close both ends of the link created at `index` (0-based, pairing order). */\n closeChannel(index: number): void;\n /** Silently drop the next `n` channel sends. */\n dropNext(n: number): void;\n /** Make the next pairing fail at the ICE stage. */\n failIce(): void;\n /** Make the next completed link connect at ICE level but never open the channel. */\n hangOpen(): void;\n /** Delivery delay for messages and channel-open in milliseconds. Default: 0 (microtask). */\n latencyMs: number;\n /** Number of links initiated (one per created offer). */\n readonly linkCount: number;\n /** Every SDP handed to `setRemoteDescription`, in call order. */\n readonly remoteSdps: readonly string[];\n readonly rtc: MeshRtcFactory;\n /** Make the next `setLocalDescription` never finish ICE gathering. */\n stallIce(): void;\n /** Drain all latency-queued deliveries immediately. */\n tick(): void;\n}\n\n/**\n * In-memory WebRTC stand-in for testing mesh nodes without a browser.\n * Peer connections created from the same fixture wire together through fake\n * SDP tokens — no network, no real ICE. Pass `fixture.rtc` as the `rtc`\n * option to `createMeshHost`/`createMeshGuest`.\n */\nexport function createFakeRtc(options: { latencyMs?: number } = {}): FakeRtc {\n interface FakeLink {\n completed: boolean;\n guestChannel: FakeDataChannel | null;\n guestPc: FakePeerConnection | null;\n hostChannel: FakeDataChannel | null;\n hostPc: FakePeerConnection;\n readonly hostToken: string;\n }\n\n const pendingDeliveries: Array<() => void> = [];\n const links = new Map<string, FakeLink>();\n const remoteSdps: string[] = [];\n let pcCounter = 0;\n let dropCount = 0;\n let failNextIce = false;\n let stallNextGathering = false;\n let hangNextOpen = false;\n\n const fixture: FakeRtc = {\n closeChannel(index) {\n const link = [...links.values()][index];\n link?.hostChannel?.close();\n link?.guestChannel?.close();\n if (link) {\n link.hostPc.iceConnectionState = 'disconnected';\n link.hostPc.emit('iceconnectionstatechange');\n if (link.guestPc) {\n link.guestPc.iceConnectionState = 'disconnected';\n link.guestPc.emit('iceconnectionstatechange');\n }\n }\n },\n dropNext(n) {\n dropCount += n;\n },\n failIce() {\n failNextIce = true;\n },\n hangOpen() {\n hangNextOpen = true;\n },\n latencyMs: options.latencyMs ?? 0,\n get linkCount() {\n return links.size;\n },\n get remoteSdps() {\n return remoteSdps;\n },\n rtc: {\n createPeerConnection: () => new FakePeerConnection(`pc${++pcCounter}`),\n },\n stallIce() {\n stallNextGathering = true;\n },\n tick() {\n while (pendingDeliveries.length) pendingDeliveries.shift()?.();\n },\n };\n\n function schedule(delivery: () => void): void {\n if (fixture.latencyMs > 0) {\n pendingDeliveries.push(delivery);\n setTimeout(fixture.tick, fixture.latencyMs);\n } else {\n queueMicrotask(delivery);\n }\n }\n\n class FakeDataChannel extends ListenerBag implements RTCDataChannelLike {\n readyState = 'connecting';\n remote: FakeDataChannel | null = null;\n\n send(data: string): void {\n if (this.readyState !== 'open') throw new Error(`Channel is ${this.readyState}`);\n if (dropCount > 0) {\n dropCount--;\n return;\n }\n const remote = this.remote;\n if (!remote || remote.readyState !== 'open') return;\n schedule(() => remote.emit('message', { data }));\n }\n\n open(): void {\n if (this.readyState !== 'connecting') return;\n this.readyState = 'open';\n this.emit('open');\n }\n\n close(): void {\n if (this.readyState === 'closed') return;\n this.readyState = 'closed';\n this.emit('close');\n const remote = this.remote;\n if (remote && remote.readyState !== 'closed') {\n remote.readyState = 'closed';\n remote.emit('close');\n }\n }\n }\n\n class FakePeerConnection extends ListenerBag implements RTCPeerConnectionLike {\n connectionState = 'new';\n iceConnectionState = 'new';\n iceGatheringState = 'new';\n localDescription: RTCSessionDescriptionLike | null = null;\n /** Last description received through `setRemoteDescription`, for assertions. */\n remoteDescription: RTCSessionDescriptionLike | null = null;\n pendingChannel: FakeDataChannel | null = null;\n closed = false;\n\n readonly token: string;\n\n constructor(token: string) {\n super();\n this.token = token;\n }\n\n createDataChannel(): RTCDataChannelLike {\n this.pendingChannel = new FakeDataChannel();\n return this.pendingChannel;\n }\n\n createOffer(): Promise<RTCSessionDescriptionLike> {\n links.set(this.token, {\n completed: false,\n guestChannel: null,\n guestPc: null,\n hostChannel: null,\n hostPc: this,\n hostToken: this.token,\n });\n return Promise.resolve({ sdp: `fake-offer:${this.token}`, type: 'offer' });\n }\n\n createAnswer(): Promise<RTCSessionDescriptionLike> {\n const link = this.linkFor();\n return Promise.resolve({\n sdp: `fake-answer:${link?.hostToken ?? 'none'}:guest:${this.token}`,\n type: 'answer',\n });\n }\n\n setLocalDescription(description: RTCSessionDescriptionLike): Promise<void> {\n this.localDescription = description;\n if (stallNextGathering) {\n stallNextGathering = false;\n this.iceGatheringState = 'gathering';\n } else {\n this.iceGatheringState = 'complete';\n }\n this.emit('icegatheringstatechange');\n return Promise.resolve();\n }\n\n setRemoteDescription(description: RTCSessionDescriptionLike): Promise<void> {\n this.remoteDescription = description;\n remoteSdps.push(description.sdp ?? '');\n if (description.type === 'offer') {\n const hostToken = /fake-offer:(\\w+)/.exec(description.sdp ?? '')?.[1];\n const link = hostToken ? links.get(hostToken) : undefined;\n if (!link) return Promise.reject(new Error('Unknown offer'));\n link.guestPc = this;\n return Promise.resolve();\n }\n\n const match = /fake-answer:(\\w+):guest:(\\w+)/.exec(description.sdp ?? '');\n const link = match?.[1] ? links.get(match[1]) : undefined;\n if (!link || link.guestPc?.token !== match?.[2]) {\n return Promise.reject(new Error('Unknown answer'));\n }\n this.completeLink(link);\n return Promise.resolve();\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.connectionState = 'closed';\n this.iceConnectionState = 'closed';\n this.emit('iceconnectionstatechange');\n this.emit('connectionstatechange');\n this.pendingChannel?.close();\n const link = this.linkFor();\n if (link) {\n link.guestChannel?.close();\n link.hostChannel?.close();\n const remote = link.guestPc === this ? link.hostPc : link.guestPc;\n if (remote && !remote.closed) {\n remote.iceConnectionState = 'disconnected';\n remote.emit('iceconnectionstatechange');\n }\n }\n }\n\n private linkFor(): FakeLink | undefined {\n return [...links.values()].find((link) => link.hostPc === this || link.guestPc === this);\n }\n\n private completeLink(link: FakeLink): void {\n if (link.completed) return;\n link.completed = true;\n\n if (failNextIce) {\n failNextIce = false;\n for (const pc of [link.hostPc, link.guestPc]) {\n if (!pc) continue;\n pc.iceConnectionState = 'failed';\n pc.emit('iceconnectionstatechange');\n }\n return;\n }\n\n const hostChannel = link.hostPc.pendingChannel ?? new FakeDataChannel();\n const guestChannel = new FakeDataChannel();\n hostChannel.remote = guestChannel;\n guestChannel.remote = hostChannel;\n link.hostChannel = hostChannel;\n link.guestChannel = guestChannel;\n link.guestPc?.emit('datachannel', { channel: guestChannel });\n\n schedule(() => {\n for (const pc of [link.hostPc, link.guestPc]) {\n if (!pc || pc.closed) continue;\n pc.iceConnectionState = 'connected';\n pc.connectionState = 'connected';\n pc.emit('iceconnectionstatechange');\n pc.emit('connectionstatechange');\n }\n if (hangNextOpen) {\n hangNextOpen = false;\n return;\n }\n hostChannel.open();\n guestChannel.open();\n });\n }\n }\n\n return fixture;\n}\n"],"mappings":"AAUA,IAAM,YAAN,KAAkB,CAChB,UAA6B,IAAI,IAEjC,IAAI,EAAc,EAA0B,CAC1C,IAAI,EAAM,KAAK,UAAU,IAAI,CAAI,EAC5B,IACH,EAAM,IAAI,IACV,KAAK,UAAU,IAAI,EAAM,CAAG,GAE9B,EAAI,IAAI,CAAQ,CAClB,CAEA,OAAO,EAAc,EAA0B,CAC7C,KAAK,UAAU,IAAI,CAAI,CAAC,EAAE,OAAO,CAAQ,CAC3C,CAEA,KAAK,EAAc,EAAsB,CAAC,EAAS,CACjD,IAAK,IAAM,KAAY,KAAK,UAAU,IAAI,CAAI,GAAK,CAAC,EAAG,EAAS,CAAK,CACvE,CAGA,iBAAiB,EAAc,EAAwC,CACrE,KAAK,IAAI,EAAM,CAAoB,CACrC,CAEA,oBAAoB,EAAc,EAAwC,CACxE,KAAK,OAAO,EAAM,CAAoB,CACxC,CACF,EA8BA,SAAgB,cAAc,EAAkC,CAAC,EAAY,CAU3E,IAAM,EAAuC,CAAC,EACxC,EAAQ,IAAI,IACZ,EAAuB,CAAC,EAC1B,EAAY,EACZ,EAAY,EACZ,EAAc,GACd,EAAqB,GACrB,EAAe,GAEb,EAAmB,CACvB,aAAa,EAAO,CAClB,IAAM,EAAO,CAAC,GAAG,EAAM,OAAO,CAAC,CAAC,CAAC,GACjC,GAAM,aAAa,MAAM,EACzB,GAAM,cAAc,MAAM,EACtB,IACF,EAAK,OAAO,mBAAqB,eACjC,EAAK,OAAO,KAAK,0BAA0B,EACvC,EAAK,UACP,EAAK,QAAQ,mBAAqB,eAClC,EAAK,QAAQ,KAAK,0BAA0B,GAGlD,EACA,SAAS,EAAG,CACV,GAAa,CACf,EACA,SAAU,CACR,EAAc,EAChB,EACA,UAAW,CACT,EAAe,EACjB,EACA,UAAW,EAAQ,WAAa,EAChC,IAAI,WAAY,CACd,OAAO,EAAM,IACf,EACA,IAAI,YAAa,CACf,OAAO,CACT,EACA,IAAK,CACH,yBAA4B,IAAI,mBAAmB,KAAK,EAAE,GAAW,CACvE,EACA,UAAW,CACT,EAAqB,EACvB,EACA,MAAO,CACL,KAAO,EAAkB,QAAQ,EAAkB,MAAM,CAAC,GAAG,CAC/D,CACF,EAEA,SAAS,SAAS,EAA4B,CACxC,EAAQ,UAAY,GACtB,EAAkB,KAAK,CAAQ,EAC/B,WAAW,EAAQ,KAAM,EAAQ,SAAS,GAE1C,eAAe,CAAQ,CAE3B,CAEA,MAAM,wBAAwB,WAA0C,CACtE,WAAa,aACb,OAAiC,KAEjC,KAAK,EAAoB,CACvB,GAAI,KAAK,aAAe,OAAQ,MAAU,MAAM,cAAc,KAAK,YAAY,EAC/E,GAAI,EAAY,EAAG,CACjB,IACA,MACF,CACA,IAAM,EAAS,KAAK,OACf,GAAU,EAAO,aAAe,QACrC,aAAe,EAAO,KAAK,UAAW,CAAE,MAAK,CAAC,CAAC,CACjD,CAEA,MAAa,CACP,KAAK,aAAe,eACxB,KAAK,WAAa,OAClB,KAAK,KAAK,MAAM,EAClB,CAEA,OAAc,CACZ,GAAI,KAAK,aAAe,SAAU,OAClC,KAAK,WAAa,SAClB,KAAK,KAAK,OAAO,EACjB,IAAM,EAAS,KAAK,OAChB,GAAU,EAAO,aAAe,WAClC,EAAO,WAAa,SACpB,EAAO,KAAK,OAAO,EAEvB,CACF,CAEA,MAAM,2BAA2B,WAA6C,CAC5E,gBAAkB,MAClB,mBAAqB,MACrB,kBAAoB,MACpB,iBAAqD,KAErD,kBAAsD,KACtD,eAAyC,KACzC,OAAS,GAET,MAEA,YAAY,EAAe,CACzB,MAAM,EACN,KAAK,MAAQ,CACf,CAEA,mBAAwC,CAEtC,MADA,MAAK,eAAiB,IAAI,gBACnB,KAAK,cACd,CAEA,aAAkD,CAShD,OARA,EAAM,IAAI,KAAK,MAAO,CACpB,UAAW,GACX,aAAc,KACd,QAAS,KACT,YAAa,KACb,OAAQ,KACR,UAAW,KAAK,KAClB,CAAC,EACM,QAAQ,QAAQ,CAAE,IAAK,cAAc,KAAK,QAAS,KAAM,OAAQ,CAAC,CAC3E,CAEA,cAAmD,CACjD,IAAM,EAAO,KAAK,QAAQ,EAC1B,OAAO,QAAQ,QAAQ,CACrB,IAAK,eAAe,GAAM,WAAa,OAAO,SAAS,KAAK,QAC5D,KAAM,QACR,CAAC,CACH,CAEA,oBAAoB,EAAuD,CASzE,MARA,MAAK,iBAAmB,EACpB,GACF,EAAqB,GACrB,KAAK,kBAAoB,aAEzB,KAAK,kBAAoB,WAE3B,KAAK,KAAK,yBAAyB,EAC5B,QAAQ,QAAQ,CACzB,CAEA,qBAAqB,EAAuD,CAG1E,GAFA,KAAK,kBAAoB,EACzB,EAAW,KAAK,EAAY,KAAO,EAAE,EACjC,EAAY,OAAS,QAAS,CAChC,IAAM,EAAY,mBAAmB,KAAK,EAAY,KAAO,EAAE,CAAC,GAAG,GAC7D,EAAO,EAAY,EAAM,IAAI,CAAS,EAAI,IAAA,GAGhD,OAFK,GACL,EAAK,QAAU,KACR,QAAQ,QAAQ,GAFL,QAAQ,OAAW,MAAM,eAAe,CAAC,CAG7D,CAEA,IAAM,EAAQ,gCAAgC,KAAK,EAAY,KAAO,EAAE,EAClE,EAAO,IAAQ,GAAK,EAAM,IAAI,EAAM,EAAE,EAAI,IAAA,GAKhD,MAJI,CAAC,GAAQ,EAAK,SAAS,QAAU,IAAQ,GACpC,QAAQ,OAAW,MAAM,gBAAgB,CAAC,GAEnD,KAAK,aAAa,CAAI,EACf,QAAQ,QAAQ,EACzB,CAEA,OAAc,CACZ,GAAI,KAAK,OAAQ,OACjB,KAAK,OAAS,GACd,KAAK,gBAAkB,SACvB,KAAK,mBAAqB,SAC1B,KAAK,KAAK,0BAA0B,EACpC,KAAK,KAAK,uBAAuB,EACjC,KAAK,gBAAgB,MAAM,EAC3B,IAAM,EAAO,KAAK,QAAQ,EAC1B,GAAI,EAAM,CACR,EAAK,cAAc,MAAM,EACzB,EAAK,aAAa,MAAM,EACxB,IAAM,EAAS,EAAK,UAAY,KAAO,EAAK,OAAS,EAAK,QACtD,GAAU,CAAC,EAAO,SACpB,EAAO,mBAAqB,eAC5B,EAAO,KAAK,0BAA0B,EAE1C,CACF,CAEA,SAAwC,CACtC,MAAO,CAAC,GAAG,EAAM,OAAO,CAAC,CAAC,CAAC,KAAM,GAAS,EAAK,SAAW,MAAQ,EAAK,UAAY,IAAI,CACzF,CAEA,aAAqB,EAAsB,CACzC,GAAI,EAAK,UAAW,OAGpB,GAFA,EAAK,UAAY,GAEb,EAAa,CACf,EAAc,GACd,IAAK,IAAM,IAAM,CAAC,EAAK,OAAQ,EAAK,OAAO,EACpC,IACL,EAAG,mBAAqB,SACxB,EAAG,KAAK,0BAA0B,GAEpC,MACF,CAEA,IAAM,EAAc,EAAK,OAAO,gBAAkB,IAAI,gBAChD,EAAe,IAAI,gBACzB,EAAY,OAAS,EACrB,EAAa,OAAS,EACtB,EAAK,YAAc,EACnB,EAAK,aAAe,EACpB,EAAK,SAAS,KAAK,cAAe,CAAE,QAAS,CAAa,CAAC,EAE3D,aAAe,CACb,IAAK,IAAM,IAAM,CAAC,EAAK,OAAQ,EAAK,OAAO,EACpC,GAAM,GAAG,SACd,EAAG,mBAAqB,YACxB,EAAG,gBAAkB,YACrB,EAAG,KAAK,0BAA0B,EAClC,EAAG,KAAK,uBAAuB,GAEjC,GAAI,EAAc,CAChB,EAAe,GACf,MACF,CACA,EAAY,KAAK,EACjB,EAAa,KAAK,CACpB,CAAC,CACH,CACF,CAEA,OAAO,CACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/testing.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./testing/fake-rtc.cjs");exports.createFakeRtc=e.createFakeRtc;
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createFakeRtc as e}from"./testing/fake-rtc.js";export{e as createFakeRtc};
|
package/dist/types.d.ts
CHANGED
|
@@ -64,6 +64,8 @@ export interface MeshRtcFactory {
|
|
|
64
64
|
export interface MeshInvitation {
|
|
65
65
|
/** Expiry instant in epoch milliseconds. */
|
|
66
66
|
readonly expiresAt: number;
|
|
67
|
+
/** Host-supplied display name; the guest shows it as its host peer's name. */
|
|
68
|
+
readonly hostName?: string;
|
|
67
69
|
/** Host offer SDP with ICE candidates inlined (non-trickle). */
|
|
68
70
|
readonly sdp: string;
|
|
69
71
|
/** Random 256-bit secret, base64url-encoded. Proves possession of the invitation. */
|
|
@@ -86,15 +88,6 @@ export interface MeshAnswer {
|
|
|
86
88
|
readonly sessionId: string;
|
|
87
89
|
readonly v: 1;
|
|
88
90
|
}
|
|
89
|
-
/**
|
|
90
|
-
* Encodes/decodes pairing payloads for out-of-band transport (copy/paste,
|
|
91
|
-
* `navigator.share`, QR). Kept separate from the transport so new encodings
|
|
92
|
-
* can be added without touching connection logic.
|
|
93
|
-
*/
|
|
94
|
-
export interface MeshCodec {
|
|
95
|
-
decode(text: string): MeshInvitation | MeshAnswer;
|
|
96
|
-
encode(payload: MeshInvitation | MeshAnswer): string;
|
|
97
|
-
}
|
|
98
91
|
/** Data-channel configuration, mapped to `RTCDataChannelInit`. */
|
|
99
92
|
export interface MeshChannelOptions {
|
|
100
93
|
readonly label?: string;
|
|
@@ -113,8 +106,6 @@ export interface MeshOptions {
|
|
|
113
106
|
readonly channelOpenTimeoutMs?: number;
|
|
114
107
|
/** Clock for TTLs and message timestamps. Default: `Date.now`. */
|
|
115
108
|
readonly clock?: () => number;
|
|
116
|
-
/** Message deserializer. Default: `JSON.parse`. */
|
|
117
|
-
readonly deserialize?: (text: string) => unknown;
|
|
118
109
|
/**
|
|
119
110
|
* How long to wait for ICE gathering to complete before proceeding with
|
|
120
111
|
* whatever candidates were gathered. Default: `5_000`.
|
|
@@ -137,8 +128,6 @@ export interface MeshOptions {
|
|
|
137
128
|
readonly random?: RandomSource;
|
|
138
129
|
/** WebRTC factory — the injection point for tests and non-browser runtimes. */
|
|
139
130
|
readonly rtc?: MeshRtcFactory;
|
|
140
|
-
/** Message serializer. Default: `JSON.stringify`. */
|
|
141
|
-
readonly serialize?: (value: unknown) => string;
|
|
142
131
|
/** Disposes the node when aborted. */
|
|
143
132
|
readonly signal?: AbortSignal;
|
|
144
133
|
}
|
|
@@ -158,25 +147,15 @@ export interface MeshHostOptions extends MeshOptions {
|
|
|
158
147
|
}
|
|
159
148
|
/** Options for {@link createMeshGuest}. */
|
|
160
149
|
export type MeshGuestOptions = MeshOptions;
|
|
161
|
-
/** Lifecycle state of a mesh node
|
|
150
|
+
/** Lifecycle state of a mesh node. */
|
|
162
151
|
export type MeshStatus = 'idle' | 'pairing' | 'connecting' | 'connected' | 'disconnected' | 'failed' | 'disposed';
|
|
152
|
+
/** Lifecycle state of a single remote peer. */
|
|
153
|
+
export type MeshPeerStatus = 'connecting' | 'connected' | 'disconnected' | 'failed';
|
|
163
154
|
/** A remote peer as observed by this node. */
|
|
164
155
|
export interface MeshPeer extends MeshPeerInfo {
|
|
165
156
|
readonly role: 'host' | 'guest';
|
|
166
|
-
readonly status:
|
|
157
|
+
readonly status: MeshPeerStatus;
|
|
167
158
|
}
|
|
168
|
-
/** Peer lifecycle event delivered to `MeshHost.onPeer` handlers. */
|
|
169
|
-
export type MeshPeerEvent = {
|
|
170
|
-
readonly type: 'joined';
|
|
171
|
-
readonly peer: MeshPeer;
|
|
172
|
-
} | {
|
|
173
|
-
readonly type: 'left';
|
|
174
|
-
readonly peer: MeshPeer;
|
|
175
|
-
readonly reason?: string;
|
|
176
|
-
} | {
|
|
177
|
-
readonly type: 'status-change';
|
|
178
|
-
readonly peer: MeshPeer;
|
|
179
|
-
};
|
|
180
159
|
/** A deserialized inbound message with transport metadata. */
|
|
181
160
|
export interface MeshInbound<T> {
|
|
182
161
|
readonly messageId: string;
|
|
@@ -192,14 +171,23 @@ export type Unsubscribe = () => void;
|
|
|
192
171
|
*/
|
|
193
172
|
export type MeshEvent = {
|
|
194
173
|
readonly type: 'status-change';
|
|
195
|
-
readonly peerId: string | null;
|
|
196
174
|
readonly status: MeshStatus;
|
|
175
|
+
} | {
|
|
176
|
+
readonly type: 'peer-status-change';
|
|
177
|
+
readonly peerId: string;
|
|
178
|
+
readonly status: MeshPeerStatus;
|
|
197
179
|
} | {
|
|
198
180
|
readonly type: 'invitation-created' | 'invitation-expired';
|
|
199
181
|
readonly sessionId: string;
|
|
200
182
|
} | {
|
|
201
|
-
readonly type: 'peer-approved' | 'peer-rejected'
|
|
183
|
+
readonly type: 'peer-approved' | 'peer-rejected';
|
|
202
184
|
readonly peerId: string;
|
|
185
|
+
} | {
|
|
186
|
+
readonly type: 'peer-joined';
|
|
187
|
+
readonly peer: MeshPeer;
|
|
188
|
+
} | {
|
|
189
|
+
readonly type: 'peer-left';
|
|
190
|
+
readonly peer: MeshPeer;
|
|
203
191
|
readonly reason?: string;
|
|
204
192
|
} | {
|
|
205
193
|
readonly type: 'message-sent' | 'message-received';
|
|
@@ -214,9 +202,6 @@ export type MeshEvent = {
|
|
|
214
202
|
readonly type: 'ice-state';
|
|
215
203
|
readonly peerId: string;
|
|
216
204
|
readonly state: string;
|
|
217
|
-
} | {
|
|
218
|
-
readonly type: 'security-downgrade';
|
|
219
|
-
readonly reason: string;
|
|
220
205
|
} | {
|
|
221
206
|
readonly type: 'error';
|
|
222
207
|
readonly error: MeshError;
|
|
@@ -231,8 +216,6 @@ export interface MeshNode {
|
|
|
231
216
|
dispose(): void;
|
|
232
217
|
/** Whether the node has been permanently disposed. */
|
|
233
218
|
readonly disposed: boolean;
|
|
234
|
-
/** This node's peer id. */
|
|
235
|
-
readonly id: string;
|
|
236
219
|
/** Current node status. */
|
|
237
220
|
readonly status: MeshStatus;
|
|
238
221
|
/**
|
|
@@ -264,7 +247,8 @@ export interface MeshHost<P extends MeshProtocol> extends MeshNode {
|
|
|
264
247
|
/**
|
|
265
248
|
* Create a single-use invitation for one prospective guest. Deliver the
|
|
266
249
|
* encoded invitation out-of-band (copy/paste, `navigator.share`, QR).
|
|
267
|
-
* May be called repeatedly — one invitation per guest.
|
|
250
|
+
* May be called repeatedly — one invitation per guest. `meta.name` is
|
|
251
|
+
* shown to the guest as this host's peer name.
|
|
268
252
|
*/
|
|
269
253
|
createInvitation(meta?: {
|
|
270
254
|
readonly name?: string;
|
|
@@ -273,8 +257,6 @@ export interface MeshHost<P extends MeshProtocol> extends MeshNode {
|
|
|
273
257
|
kick(peerId: string, reason?: string): void;
|
|
274
258
|
/** Subscribe to a typed inbound message from any guest. */
|
|
275
259
|
on<K extends keyof P['toHost'] & string>(type: K, handler: (message: MeshInbound<P['toHost'][K]>) => void): Unsubscribe;
|
|
276
|
-
/** Subscribe to peer lifecycle events. */
|
|
277
|
-
onPeer(handler: (event: MeshPeerEvent) => void): Unsubscribe;
|
|
278
260
|
/** Live peers keyed by peer id. */
|
|
279
261
|
readonly peers: ReadonlyMap<string, MeshPeer>;
|
|
280
262
|
/** Send a typed message to one peer. Throws `MeshConnectionError` if unconnected. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vielzeug/mesh",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "26.10.0",
|
|
4
4
|
"description": "Backendless peer-to-peer session transport over WebRTC data channels with manual pairing and host-authoritative star topology",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -22,6 +22,18 @@
|
|
|
22
22
|
"import": "./dist/index.js",
|
|
23
23
|
"require": "./dist/index.cjs",
|
|
24
24
|
"types": "./dist/index.d.ts"
|
|
25
|
+
},
|
|
26
|
+
"./testing": {
|
|
27
|
+
"import": "./dist/testing.js",
|
|
28
|
+
"require": "./dist/testing.cjs",
|
|
29
|
+
"types": "./dist/testing/index.d.ts"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"typesVersions": {
|
|
33
|
+
"*": {
|
|
34
|
+
"testing": [
|
|
35
|
+
"dist/testing/index.d.ts"
|
|
36
|
+
]
|
|
25
37
|
}
|
|
26
38
|
},
|
|
27
39
|
"sideEffects": false,
|
|
@@ -39,12 +51,12 @@
|
|
|
39
51
|
"test": "vitest"
|
|
40
52
|
},
|
|
41
53
|
"dependencies": {
|
|
42
|
-
"@vielzeug/arsenal": "
|
|
54
|
+
"@vielzeug/arsenal": "26.10.0"
|
|
43
55
|
},
|
|
44
56
|
"devDependencies": {
|
|
45
|
-
"@types/node": "^26.
|
|
57
|
+
"@types/node": "^26.6.2",
|
|
46
58
|
"typescript": "^6.0.3",
|
|
47
|
-
"vite": "^8.
|
|
48
|
-
"vitest": "^5.0.
|
|
59
|
+
"vite": "^8.3.0",
|
|
60
|
+
"vitest": "^5.0.1"
|
|
49
61
|
}
|
|
50
62
|
}
|
package/dist/_base64.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var e=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,t=new Map([...e].map((e,t)=>[e,t]));function n(t){let n=``;for(let r=0;r<t.length;r+=3){let i=t[r],a=t[r+1],o=t[r+2];n+=e[i>>2],n+=e[(i&3)<<4|(a??0)>>4],a!==void 0&&(n+=e[(a&15)<<2|(o??0)>>6]),o!==void 0&&(n+=e[o&63])}return n}function r(e){let n=[],r=0,i=0;for(let a of e){let e=t.get(a);if(e===void 0)throw Error(`Invalid base64url character "${a}"`);r=r<<6|e,i+=6,i>=8&&(i-=8,n.push(r>>i&255))}return new Uint8Array(n)}var i=new TextEncoder,a=new TextDecoder;function o(e){return n(i.encode(e))}function s(e){return a.decode(r(e))}function c(e){return i.encode(e).length}exports.base64UrlToBytes=r,exports.base64UrlToText=s,exports.bytesToBase64Url=n,exports.textToBase64Url=o,exports.utf8Bytes=c;
|
|
2
|
-
//# sourceMappingURL=_base64.cjs.map
|
package/dist/_base64.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_base64.cjs","names":[],"sources":["../src/_base64.ts"],"sourcesContent":["const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\nconst LOOKUP = new Map([...ALPHABET].map((char, index) => [char, index]));\n\n/** Environment-independent base64url encoding (no `btoa`/`Buffer` dependency). */\nexport function bytesToBase64Url(bytes: Uint8Array): string {\n let output = '';\n for (let index = 0; index < bytes.length; index += 3) {\n const a = bytes[index]!;\n const b = bytes[index + 1];\n const c = bytes[index + 2];\n output += ALPHABET[a >> 2]!;\n output += ALPHABET[((a & 0b11) << 4) | ((b ?? 0) >> 4)]!;\n if (b !== undefined) output += ALPHABET[((b & 0b1111) << 2) | ((c ?? 0) >> 6)]!;\n if (c !== undefined) output += ALPHABET[c & 0b111111]!;\n }\n return output;\n}\n\n/** Decodes base64url text. Throws on characters outside the base64url alphabet. */\nexport function base64UrlToBytes(text: string): Uint8Array {\n const bytes: number[] = [];\n let buffer = 0;\n let bits = 0;\n for (const char of text) {\n const value = LOOKUP.get(char);\n if (value === undefined) throw new Error(`Invalid base64url character \"${char}\"`);\n buffer = (buffer << 6) | value;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n bytes.push((buffer >> bits) & 0xff);\n }\n }\n return new Uint8Array(bytes);\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport function textToBase64Url(text: string): string {\n return bytesToBase64Url(encoder.encode(text));\n}\n\nexport function base64UrlToText(text: string): string {\n return decoder.decode(base64UrlToBytes(text));\n}\n\n/** Byte length of a UTF-8 string — used for `maxMessageBytes` checks. */\nexport function utf8Bytes(text: string): number {\n return encoder.encode(text).length;\n}\n"],"mappings":"AAAA,IAAM,EAAW,mEACX,EAAS,IAAI,IAAI,CAAC,GAAG,CAAQ,CAAC,CAAC,KAAK,EAAM,IAAU,CAAC,EAAM,CAAK,CAAC,CAAC,EAGxE,SAAgB,EAAiB,EAA2B,CAC1D,IAAI,EAAS,GACb,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAM,OAAQ,GAAS,EAAG,CACpD,IAAM,EAAI,EAAM,GACV,EAAI,EAAM,EAAQ,GAClB,EAAI,EAAM,EAAQ,GACxB,GAAU,EAAS,GAAK,GACxB,GAAU,GAAW,EAAI,IAAS,GAAO,GAAK,IAAM,GAChD,IAAM,IAAA,KAAW,GAAU,GAAW,EAAI,KAAW,GAAO,GAAK,IAAM,IACvE,IAAM,IAAA,KAAW,GAAU,EAAS,EAAI,IAC9C,CACA,OAAO,CACT,CAGA,SAAgB,EAAiB,EAA0B,CACzD,IAAM,EAAkB,CAAC,EACrB,EAAS,EACT,EAAO,EACX,IAAK,IAAM,KAAQ,EAAM,CACvB,IAAM,EAAQ,EAAO,IAAI,CAAI,EAC7B,GAAI,IAAU,IAAA,GAAW,MAAU,MAAM,gCAAgC,EAAK,EAAE,EAChF,EAAU,GAAU,EAAK,EACzB,GAAQ,EACJ,GAAQ,IACV,GAAQ,EACR,EAAM,KAAM,GAAU,EAAQ,GAAI,EAEtC,CACA,OAAO,IAAI,WAAW,CAAK,CAC7B,CAEA,IAAM,EAAU,IAAI,YACd,EAAU,IAAI,YAEpB,SAAgB,EAAgB,EAAsB,CACpD,OAAO,EAAiB,EAAQ,OAAO,CAAI,CAAC,CAC9C,CAEA,SAAgB,EAAgB,EAAsB,CACpD,OAAO,EAAQ,OAAO,EAAiB,CAAI,CAAC,CAC9C,CAGA,SAAgB,EAAU,EAAsB,CAC9C,OAAO,EAAQ,OAAO,CAAI,CAAC,CAAC,MAC9B"}
|
package/dist/_base64.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/** Environment-independent base64url encoding (no `btoa`/`Buffer` dependency). */
|
|
2
|
-
export declare function bytesToBase64Url(bytes: Uint8Array): string;
|
|
3
|
-
/** Decodes base64url text. Throws on characters outside the base64url alphabet. */
|
|
4
|
-
export declare function base64UrlToBytes(text: string): Uint8Array;
|
|
5
|
-
export declare function textToBase64Url(text: string): string;
|
|
6
|
-
export declare function base64UrlToText(text: string): string;
|
|
7
|
-
/** Byte length of a UTF-8 string — used for `maxMessageBytes` checks. */
|
|
8
|
-
export declare function utf8Bytes(text: string): number;
|
|
9
|
-
//# sourceMappingURL=_base64.d.ts.map
|
package/dist/_base64.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_base64.d.ts","sourceRoot":"","sources":["../src/_base64.ts"],"names":[],"mappings":"AAGA,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAY1D;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAezD;AAKD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
package/dist/_base64.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
//#region src/_base64.ts
|
|
2
|
-
var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", t = new Map([...e].map((e, t) => [e, t]));
|
|
3
|
-
function n(t) {
|
|
4
|
-
let n = "";
|
|
5
|
-
for (let r = 0; r < t.length; r += 3) {
|
|
6
|
-
let i = t[r], a = t[r + 1], o = t[r + 2];
|
|
7
|
-
n += e[i >> 2], n += e[(i & 3) << 4 | (a ?? 0) >> 4], a !== void 0 && (n += e[(a & 15) << 2 | (o ?? 0) >> 6]), o !== void 0 && (n += e[o & 63]);
|
|
8
|
-
}
|
|
9
|
-
return n;
|
|
10
|
-
}
|
|
11
|
-
function r(e) {
|
|
12
|
-
let n = [], r = 0, i = 0;
|
|
13
|
-
for (let a of e) {
|
|
14
|
-
let e = t.get(a);
|
|
15
|
-
if (e === void 0) throw Error(`Invalid base64url character "${a}"`);
|
|
16
|
-
r = r << 6 | e, i += 6, i >= 8 && (i -= 8, n.push(r >> i & 255));
|
|
17
|
-
}
|
|
18
|
-
return new Uint8Array(n);
|
|
19
|
-
}
|
|
20
|
-
var i = new TextEncoder(), a = new TextDecoder();
|
|
21
|
-
function o(e) {
|
|
22
|
-
return n(i.encode(e));
|
|
23
|
-
}
|
|
24
|
-
function s(e) {
|
|
25
|
-
return a.decode(r(e));
|
|
26
|
-
}
|
|
27
|
-
function c(e) {
|
|
28
|
-
return i.encode(e).length;
|
|
29
|
-
}
|
|
30
|
-
//#endregion
|
|
31
|
-
export { r as base64UrlToBytes, s as base64UrlToText, n as bytesToBase64Url, o as textToBase64Url, c as utf8Bytes };
|
|
32
|
-
|
|
33
|
-
//# sourceMappingURL=_base64.js.map
|
package/dist/_base64.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_base64.js","names":[],"sources":["../src/_base64.ts"],"sourcesContent":["const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\nconst LOOKUP = new Map([...ALPHABET].map((char, index) => [char, index]));\n\n/** Environment-independent base64url encoding (no `btoa`/`Buffer` dependency). */\nexport function bytesToBase64Url(bytes: Uint8Array): string {\n let output = '';\n for (let index = 0; index < bytes.length; index += 3) {\n const a = bytes[index]!;\n const b = bytes[index + 1];\n const c = bytes[index + 2];\n output += ALPHABET[a >> 2]!;\n output += ALPHABET[((a & 0b11) << 4) | ((b ?? 0) >> 4)]!;\n if (b !== undefined) output += ALPHABET[((b & 0b1111) << 2) | ((c ?? 0) >> 6)]!;\n if (c !== undefined) output += ALPHABET[c & 0b111111]!;\n }\n return output;\n}\n\n/** Decodes base64url text. Throws on characters outside the base64url alphabet. */\nexport function base64UrlToBytes(text: string): Uint8Array {\n const bytes: number[] = [];\n let buffer = 0;\n let bits = 0;\n for (const char of text) {\n const value = LOOKUP.get(char);\n if (value === undefined) throw new Error(`Invalid base64url character \"${char}\"`);\n buffer = (buffer << 6) | value;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n bytes.push((buffer >> bits) & 0xff);\n }\n }\n return new Uint8Array(bytes);\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport function textToBase64Url(text: string): string {\n return bytesToBase64Url(encoder.encode(text));\n}\n\nexport function base64UrlToText(text: string): string {\n return decoder.decode(base64UrlToBytes(text));\n}\n\n/** Byte length of a UTF-8 string — used for `maxMessageBytes` checks. */\nexport function utf8Bytes(text: string): number {\n return encoder.encode(text).length;\n}\n"],"mappings":";AAAA,IAAM,IAAW,oEACX,IAAS,IAAI,IAAI,CAAC,GAAG,CAAQ,CAAC,CAAC,KAAK,GAAM,MAAU,CAAC,GAAM,CAAK,CAAC,CAAC;AAGxE,SAAgB,EAAiB,GAA2B;CAC1D,IAAI,IAAS;CACb,KAAK,IAAI,IAAQ,GAAG,IAAQ,EAAM,QAAQ,KAAS,GAAG;EACpD,IAAM,IAAI,EAAM,IACV,IAAI,EAAM,IAAQ,IAClB,IAAI,EAAM,IAAQ;EAIxB,AAHA,KAAU,EAAS,KAAK,IACxB,KAAU,GAAW,IAAI,MAAS,KAAO,KAAK,MAAM,IAChD,MAAM,KAAA,MAAW,KAAU,GAAW,IAAI,OAAW,KAAO,KAAK,MAAM,KACvE,MAAM,KAAA,MAAW,KAAU,EAAS,IAAI;CAC9C;CACA,OAAO;AACT;AAGA,SAAgB,EAAiB,GAA0B;CACzD,IAAM,IAAkB,CAAC,GACrB,IAAS,GACT,IAAO;CACX,KAAK,IAAM,KAAQ,GAAM;EACvB,IAAM,IAAQ,EAAO,IAAI,CAAI;EAC7B,IAAI,MAAU,KAAA,GAAW,MAAU,MAAM,gCAAgC,EAAK,EAAE;EAGhF,AAFA,IAAU,KAAU,IAAK,GACzB,KAAQ,GACJ,KAAQ,MACV,KAAQ,GACR,EAAM,KAAM,KAAU,IAAQ,GAAI;CAEtC;CACA,OAAO,IAAI,WAAW,CAAK;AAC7B;AAEA,IAAM,IAAU,IAAI,YAAY,GAC1B,IAAU,IAAI,YAAY;AAEhC,SAAgB,EAAgB,GAAsB;CACpD,OAAO,EAAiB,EAAQ,OAAO,CAAI,CAAC;AAC9C;AAEA,SAAgB,EAAgB,GAAsB;CACpD,OAAO,EAAQ,OAAO,EAAiB,CAAI,CAAC;AAC9C;AAGA,SAAgB,EAAU,GAAsB;CAC9C,OAAO,EAAQ,OAAO,CAAI,CAAC,CAAC;AAC9B"}
|