@xyo-network/dapp-kit-browser 0.1.7 → 0.1.8

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.
@@ -48,7 +48,7 @@ var BrowserDappHostInstance = class {
48
48
  throw new AggregateError(
49
49
  [error, stopError],
50
50
  "The browser dApp host rejected a writable session and failed to stop it",
51
- { cause: error }
51
+ { cause: stopError }
52
52
  );
53
53
  }
54
54
  throw error;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/browserDappHost.ts", "../../src/messagePortApplicationPortEndpoint.ts", "../../src/index.ts"],
4
- "sourcesContent": ["import { bindPageLifecycle } from '@ariestools/browser-kit-page'\nimport type { WorkerMessageEndpoint } from '@ariestools/browser-kit-worker'\nimport { bindWorkerShutdown } from '@ariestools/browser-kit-worker'\nimport type {\n DappLaunch,\n DappStatus,\n} from '@xyo-network/dapp-kit'\n\nexport const BrowserDappHostErrorCode = { durableJournalRequired: 'browser-dapp-host.durable-journal-required' } as const\n\nexport type BrowserDappHostErrorCode = typeof BrowserDappHostErrorCode[keyof typeof BrowserDappHostErrorCode]\n\nexport interface BrowserDappHost<TPorts> {\n status(): DappStatus\n stop(): Promise<void>\n whenReady(): Promise<TPorts>\n}\n\ninterface BrowserDappHostOptions<TPorts> {\n readonly launch: DappLaunch<TPorts>\n readonly onStopError: (error: unknown) => void\n}\n\nexport interface CreatePageDappHostOptions<TPorts> extends BrowserDappHostOptions<TPorts> {\n readonly target?: Window\n}\n\nexport interface CreateWorkerDappHostOptions<TPorts> extends BrowserDappHostOptions<TPorts> {\n readonly endpoint: WorkerMessageEndpoint\n}\n\nexport class BrowserDappHostError extends Error {\n readonly code: BrowserDappHostErrorCode\n\n constructor(code: BrowserDappHostErrorCode, message: string) {\n super(message)\n this.name = 'BrowserDappHostError'\n this.code = code\n }\n}\n\nfunction assertReadOnly(status: DappStatus): void {\n if (status.writeState === 'not-applicable' && status.writeCapabilities.length === 0) return\n throw new BrowserDappHostError(\n BrowserDappHostErrorCode.durableJournalRequired,\n 'The initial browser host accepts only dApps with no write-capable application operations',\n )\n}\n\nclass BrowserDappHostInstance<TPorts> {\n private disposeLifecycle?: () => void\n private readonly launch: DappLaunch<TPorts>\n private stopPromise?: Promise<void>\n\n constructor(launch: DappLaunch<TPorts>) {\n this.launch = launch\n void launch.outcome.then((outcome) => {\n if (outcome.outcome !== 'ready') this.disposeLifecycle?.()\n })\n }\n\n bindLifecycle(dispose: () => void): void {\n this.disposeLifecycle = dispose\n }\n\n status(): DappStatus {\n return this.launch.status()\n }\n\n stop(): Promise<void> {\n this.stopPromise ??= this.stopOnce()\n return this.stopPromise\n }\n\n async whenReady(): Promise<TPorts> {\n const session = await this.launch.whenReady()\n try {\n assertReadOnly(session.status())\n } catch (error) {\n try {\n await this.stop()\n } catch (stopError) {\n throw new AggregateError(\n [error, stopError],\n 'The browser dApp host rejected a writable session and failed to stop it',\n { cause: error },\n )\n }\n throw error\n }\n return session.ports\n }\n\n private async stopOnce(): Promise<void> {\n this.disposeLifecycle?.()\n await this.launch.stop()\n }\n}\n\nfunction createFacade<TPorts>(instance: BrowserDappHostInstance<TPorts>): BrowserDappHost<TPorts> {\n return Object.freeze({\n status: () => instance.status(),\n stop: () => instance.stop(),\n whenReady: async () => await instance.whenReady(),\n })\n}\n\nexport function createPageDappHost<TPorts>(options: CreatePageDappHostOptions<TPorts>): BrowserDappHost<TPorts> {\n const instance = new BrowserDappHostInstance(options.launch)\n const host = createFacade(instance)\n instance.bindLifecycle(bindPageLifecycle(host, {\n onStopError: options.onStopError,\n target: options.target,\n }))\n return host\n}\n\nexport function createWorkerDappHost<TPorts>(options: CreateWorkerDappHostOptions<TPorts>): BrowserDappHost<TPorts> {\n const instance = new BrowserDappHostInstance(options.launch)\n const host = createFacade(instance)\n instance.bindLifecycle(bindWorkerShutdown(options.endpoint, host, { onStopError: options.onStopError }))\n return host\n}\n", "import type { ApplicationPortMessageEndpoint } from '@xyo-network/dapp-kit-port'\n\nclass MessagePortApplicationPortEndpoint implements ApplicationPortMessageEndpoint {\n private readonly listeners = new Map<(message: unknown) => void, (event: MessageEvent<unknown>) => void>()\n private readonly port: MessagePort\n\n constructor(port: MessagePort) {\n this.port = port\n }\n\n addMessageListener(listener: (message: unknown) => void): void {\n if (this.listeners.has(listener)) return\n const eventListener = (event: MessageEvent<unknown>) => listener(event.data)\n this.listeners.set(listener, eventListener)\n this.port.addEventListener('message', eventListener)\n }\n\n removeMessageListener(listener: (message: unknown) => void): void {\n const eventListener = this.listeners.get(listener)\n if (eventListener === undefined) return\n this.listeners.delete(listener)\n this.port.removeEventListener('message', eventListener)\n }\n\n send(message: unknown): void {\n this.port.postMessage(message)\n }\n\n start(): void {\n this.port.start()\n }\n}\n\nexport function createMessagePortApplicationPortEndpoint(port: MessagePort): ApplicationPortMessageEndpoint {\n return new MessagePortApplicationPortEndpoint(port)\n}\n", "export * from './browserDappHost.ts'\nexport * from './messagePortApplicationPortEndpoint.ts'\nexport * from '@xyo-network/dapp-kit-port'\n"],
5
- "mappings": ";AAAA,SAAS,yBAAyB;AAElC,SAAS,0BAA0B;AAM5B,IAAM,2BAA2B,EAAE,wBAAwB,6CAA6C;AAuBxG,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACrC;AAAA,EAET,YAAY,MAAgC,SAAiB;AAC3D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEA,SAAS,eAAe,QAA0B;AAChD,MAAI,OAAO,eAAe,oBAAoB,OAAO,kBAAkB,WAAW,EAAG;AACrF,QAAM,IAAI;AAAA,IACR,yBAAyB;AAAA,IACzB;AAAA,EACF;AACF;AAEA,IAAM,0BAAN,MAAsC;AAAA,EAC5B;AAAA,EACS;AAAA,EACT;AAAA,EAER,YAAY,QAA4B;AACtC,SAAK,SAAS;AACd,SAAK,OAAO,QAAQ,KAAK,CAAC,YAAY;AACpC,UAAI,QAAQ,YAAY,QAAS,MAAK,mBAAmB;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,SAA2B;AACvC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,SAAqB;AACnB,WAAO,KAAK,OAAO,OAAO;AAAA,EAC5B;AAAA,EAEA,OAAsB;AACpB,SAAK,gBAAgB,KAAK,SAAS;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,YAA6B;AACjC,UAAM,UAAU,MAAM,KAAK,OAAO,UAAU;AAC5C,QAAI;AACF,qBAAe,QAAQ,OAAO,CAAC;AAAA,IACjC,SAAS,OAAO;AACd,UAAI;AACF,cAAM,KAAK,KAAK;AAAA,MAClB,SAAS,WAAW;AAClB,cAAM,IAAI;AAAA,UACR,CAAC,OAAO,SAAS;AAAA,UACjB;AAAA,UACA,EAAE,OAAO,MAAM;AAAA,QACjB;AAAA,MACF;AACA,YAAM;AAAA,IACR;AACA,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,MAAc,WAA0B;AACtC,SAAK,mBAAmB;AACxB,UAAM,KAAK,OAAO,KAAK;AAAA,EACzB;AACF;AAEA,SAAS,aAAqB,UAAoE;AAChG,SAAO,OAAO,OAAO;AAAA,IACnB,QAAQ,MAAM,SAAS,OAAO;AAAA,IAC9B,MAAM,MAAM,SAAS,KAAK;AAAA,IAC1B,WAAW,YAAY,MAAM,SAAS,UAAU;AAAA,EAClD,CAAC;AACH;AAEO,SAAS,mBAA2B,SAAqE;AAC9G,QAAM,WAAW,IAAI,wBAAwB,QAAQ,MAAM;AAC3D,QAAM,OAAO,aAAa,QAAQ;AAClC,WAAS,cAAc,kBAAkB,MAAM;AAAA,IAC7C,aAAa,QAAQ;AAAA,IACrB,QAAQ,QAAQ;AAAA,EAClB,CAAC,CAAC;AACF,SAAO;AACT;AAEO,SAAS,qBAA6B,SAAuE;AAClH,QAAM,WAAW,IAAI,wBAAwB,QAAQ,MAAM;AAC3D,QAAM,OAAO,aAAa,QAAQ;AAClC,WAAS,cAAc,mBAAmB,QAAQ,UAAU,MAAM,EAAE,aAAa,QAAQ,YAAY,CAAC,CAAC;AACvG,SAAO;AACT;;;ACxHA,IAAM,qCAAN,MAAmF;AAAA,EAChE,YAAY,oBAAI,IAAwE;AAAA,EACxF;AAAA,EAEjB,YAAY,MAAmB;AAC7B,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,mBAAmB,UAA4C;AAC7D,QAAI,KAAK,UAAU,IAAI,QAAQ,EAAG;AAClC,UAAM,gBAAgB,CAAC,UAAiC,SAAS,MAAM,IAAI;AAC3E,SAAK,UAAU,IAAI,UAAU,aAAa;AAC1C,SAAK,KAAK,iBAAiB,WAAW,aAAa;AAAA,EACrD;AAAA,EAEA,sBAAsB,UAA4C;AAChE,UAAM,gBAAgB,KAAK,UAAU,IAAI,QAAQ;AACjD,QAAI,kBAAkB,OAAW;AACjC,SAAK,UAAU,OAAO,QAAQ;AAC9B,SAAK,KAAK,oBAAoB,WAAW,aAAa;AAAA,EACxD;AAAA,EAEA,KAAK,SAAwB;AAC3B,SAAK,KAAK,YAAY,OAAO;AAAA,EAC/B;AAAA,EAEA,QAAc;AACZ,SAAK,KAAK,MAAM;AAAA,EAClB;AACF;AAEO,SAAS,yCAAyC,MAAmD;AAC1G,SAAO,IAAI,mCAAmC,IAAI;AACpD;;;ACjCA,cAAc;",
4
+ "sourcesContent": ["import { bindPageLifecycle } from '@ariestools/browser-kit-page'\nimport type { WorkerMessageEndpoint } from '@ariestools/browser-kit-worker'\nimport { bindWorkerShutdown } from '@ariestools/browser-kit-worker'\nimport type {\n DappLaunch,\n DappStatus,\n} from '@xyo-network/dapp-kit'\n\nexport const BrowserDappHostErrorCode = { durableJournalRequired: 'browser-dapp-host.durable-journal-required' } as const\n\nexport type BrowserDappHostErrorCode = typeof BrowserDappHostErrorCode[keyof typeof BrowserDappHostErrorCode]\n\nexport interface BrowserDappHost<TPorts> {\n status(): DappStatus\n stop(): Promise<void>\n whenReady(): Promise<TPorts>\n}\n\ninterface BrowserDappHostOptions<TPorts> {\n readonly launch: DappLaunch<TPorts>\n readonly onStopError: (error: unknown) => void\n}\n\nexport interface CreatePageDappHostOptions<TPorts> extends BrowserDappHostOptions<TPorts> {\n readonly target?: Window\n}\n\nexport interface CreateWorkerDappHostOptions<TPorts> extends BrowserDappHostOptions<TPorts> {\n readonly endpoint: WorkerMessageEndpoint\n}\n\nexport class BrowserDappHostError extends Error {\n readonly code: BrowserDappHostErrorCode\n\n constructor(code: BrowserDappHostErrorCode, message: string) {\n super(message)\n this.name = 'BrowserDappHostError'\n this.code = code\n }\n}\n\nfunction assertReadOnly(status: DappStatus): void {\n if (status.writeState === 'not-applicable' && status.writeCapabilities.length === 0) return\n throw new BrowserDappHostError(\n BrowserDappHostErrorCode.durableJournalRequired,\n 'The initial browser host accepts only dApps with no write-capable application operations',\n )\n}\n\nclass BrowserDappHostInstance<TPorts> {\n private disposeLifecycle?: () => void\n private readonly launch: DappLaunch<TPorts>\n private stopPromise?: Promise<void>\n\n constructor(launch: DappLaunch<TPorts>) {\n this.launch = launch\n void launch.outcome.then((outcome) => {\n if (outcome.outcome !== 'ready') this.disposeLifecycle?.()\n })\n }\n\n bindLifecycle(dispose: () => void): void {\n this.disposeLifecycle = dispose\n }\n\n status(): DappStatus {\n return this.launch.status()\n }\n\n stop(): Promise<void> {\n this.stopPromise ??= this.stopOnce()\n return this.stopPromise\n }\n\n async whenReady(): Promise<TPorts> {\n const session = await this.launch.whenReady()\n try {\n assertReadOnly(session.status())\n } catch (error) {\n try {\n await this.stop()\n } catch (stopError) {\n throw new AggregateError(\n [error, stopError],\n 'The browser dApp host rejected a writable session and failed to stop it',\n { cause: stopError },\n )\n }\n throw error\n }\n return session.ports\n }\n\n private async stopOnce(): Promise<void> {\n this.disposeLifecycle?.()\n await this.launch.stop()\n }\n}\n\nfunction createFacade<TPorts>(instance: BrowserDappHostInstance<TPorts>): BrowserDappHost<TPorts> {\n return Object.freeze({\n status: () => instance.status(),\n stop: () => instance.stop(),\n whenReady: async () => await instance.whenReady(),\n })\n}\n\nexport function createPageDappHost<TPorts>(options: CreatePageDappHostOptions<TPorts>): BrowserDappHost<TPorts> {\n const instance = new BrowserDappHostInstance(options.launch)\n const host = createFacade(instance)\n instance.bindLifecycle(bindPageLifecycle(host, {\n onStopError: options.onStopError,\n target: options.target,\n }))\n return host\n}\n\nexport function createWorkerDappHost<TPorts>(options: CreateWorkerDappHostOptions<TPorts>): BrowserDappHost<TPorts> {\n const instance = new BrowserDappHostInstance(options.launch)\n const host = createFacade(instance)\n instance.bindLifecycle(bindWorkerShutdown(options.endpoint, host, { onStopError: options.onStopError }))\n return host\n}\n", "import type { ApplicationPortMessageEndpoint } from '@xyo-network/dapp-kit-port'\n\nclass MessagePortApplicationPortEndpoint implements ApplicationPortMessageEndpoint {\n private readonly listeners = new Map<(message: unknown) => void, (event: MessageEvent<unknown>) => void>()\n private readonly port: MessagePort\n\n constructor(port: MessagePort) {\n this.port = port\n }\n\n addMessageListener(listener: (message: unknown) => void): void {\n if (this.listeners.has(listener)) return\n const eventListener = (event: MessageEvent<unknown>) => listener(event.data)\n this.listeners.set(listener, eventListener)\n this.port.addEventListener('message', eventListener)\n }\n\n removeMessageListener(listener: (message: unknown) => void): void {\n const eventListener = this.listeners.get(listener)\n if (eventListener === undefined) return\n this.listeners.delete(listener)\n this.port.removeEventListener('message', eventListener)\n }\n\n send(message: unknown): void {\n this.port.postMessage(message)\n }\n\n start(): void {\n this.port.start()\n }\n}\n\nexport function createMessagePortApplicationPortEndpoint(port: MessagePort): ApplicationPortMessageEndpoint {\n return new MessagePortApplicationPortEndpoint(port)\n}\n", "export * from './browserDappHost.ts'\nexport * from './messagePortApplicationPortEndpoint.ts'\nexport * from '@xyo-network/dapp-kit-port'\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/dapp-kit-browser",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Browser lifecycle owners and application-port transport for headless XL1 dApps",
5
5
  "keywords": [
6
6
  "xyo",
@@ -33,8 +33,8 @@
33
33
  "README.md"
34
34
  ],
35
35
  "dependencies": {
36
- "@xyo-network/dapp-kit": "~0.1.7",
37
- "@xyo-network/dapp-kit-port": "~0.1.7"
36
+ "@xyo-network/dapp-kit-port": "~0.1.8",
37
+ "@xyo-network/dapp-kit": "~0.1.8"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@ariestools/browser-kit-page": "~1.1.0",