@canton-network/core-splice-provider 0.21.0 → 0.23.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.
@@ -5,7 +5,7 @@ export declare class SpliceProviderHttp extends SpliceProviderBase {
5
5
  private sessionToken?;
6
6
  private client;
7
7
  private createClient;
8
- private openSocket;
8
+ private openSSE;
9
9
  constructor(url: URL, sessionToken?: string);
10
10
  request<T>({ method, params }: RequestPayload): Promise<T>;
11
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SpliceProviderHttp.d.ts","sourceRoot":"","sources":["../src/SpliceProviderHttp.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,cAAc,EAEjB,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAarD,qBAAa,kBAAmB,SAAQ,kBAAkB;IAwClD,OAAO,CAAC,GAAG;IAvCf,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,MAAM,CAA4B;IAE1C,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,UAAU;gBA+BN,GAAG,EAAE,GAAG,EAChB,YAAY,CAAC,EAAE,MAAM;IAuCZ,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;CAQ1E"}
1
+ {"version":3,"file":"SpliceProviderHttp.d.ts","sourceRoot":"","sources":["../src/SpliceProviderHttp.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,cAAc,EAEjB,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAqBrD,qBAAa,kBAAmB,SAAQ,kBAAkB;IA2DlD,OAAO,CAAC,GAAG;IA1Df,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,MAAM,CAA4B;IAE1C,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,OAAO;gBAkDH,GAAG,EAAE,GAAG,EAChB,YAAY,CAAC,EAAE,MAAM;IAuCZ,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;CAQ1E"}
package/dist/index.cjs CHANGED
@@ -3,7 +3,6 @@
3
3
  var coreTypes = require('@canton-network/core-types');
4
4
  var coreRpcTransport = require('@canton-network/core-rpc-transport');
5
5
  var SpliceWalletJSONRPCDAppAPI = require('@canton-network/core-wallet-dapp-rpc-client');
6
- var socket_ioClient = require('socket.io-client');
7
6
 
8
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
8
 
@@ -44,6 +43,14 @@ var SpliceProviderBase = class {
44
43
  }
45
44
  };
46
45
  var connection = null;
46
+ function parseSSEData(data) {
47
+ try {
48
+ const parsed = JSON.parse(data);
49
+ return Array.isArray(parsed) ? parsed : [parsed];
50
+ } catch {
51
+ return [data];
52
+ }
53
+ }
47
54
  var SpliceProviderHttp = class extends SpliceProviderBase {
48
55
  constructor(url, sessionToken) {
49
56
  super();
@@ -52,7 +59,7 @@ var SpliceProviderHttp = class extends SpliceProviderBase {
52
59
  __publicField(this, "client");
53
60
  if (sessionToken) {
54
61
  this.sessionToken = sessionToken;
55
- this.openSocket(url, sessionToken);
62
+ this.openSSE(url, sessionToken);
56
63
  }
57
64
  this.client = this.createClient(sessionToken);
58
65
  window.addEventListener("message", async (event) => {
@@ -60,9 +67,9 @@ var SpliceProviderHttp = class extends SpliceProviderBase {
60
67
  if (event.data.type === coreTypes.WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS) {
61
68
  this.sessionToken = event.data.token;
62
69
  this.client = this.createClient(this.sessionToken);
63
- this.openSocket(this.url, event.data.token);
70
+ this.openSSE(this.url, event.data.token);
64
71
  this.request({ method: "status" }).then((status) => {
65
- this.emit("onConnected", status);
72
+ this.emit("statusChanged", status);
66
73
  }).catch((err) => {
67
74
  console.error(
68
75
  "Error requesting status after auth:",
@@ -76,25 +83,39 @@ var SpliceProviderHttp = class extends SpliceProviderBase {
76
83
  const transport = new coreRpcTransport.HttpTransport(this.url, sessionToken);
77
84
  return new SpliceWalletJSONRPCDAppAPI__default.default(transport);
78
85
  }
79
- openSocket(url, token) {
80
- const socketUri = url.origin;
81
- if (connection && (token !== connection.token || socketUri !== connection.url)) {
82
- connection.socket.disconnect();
86
+ openSSE(url, token) {
87
+ const sseUrl = new URL("events", url.toString().replace(/\/?$/, "/"));
88
+ sseUrl.searchParams.set("token", token);
89
+ const sseUrlString = sseUrl.toString();
90
+ if (connection && (token !== connection.token || sseUrlString !== connection.url)) {
91
+ connection.eventSource.close();
83
92
  connection = null;
84
93
  }
85
94
  if (!connection) {
95
+ const eventSource = new EventSource(sseUrlString);
96
+ eventSource.onmessage = (event) => this.emit("message", ...parseSSEData(event.data));
97
+ const emitEvent = (name) => (event) => this.emit(name, ...parseSSEData(event.data));
98
+ eventSource.addEventListener(
99
+ "accountsChanged",
100
+ emitEvent("accountsChanged")
101
+ );
102
+ eventSource.addEventListener(
103
+ "statusChanged",
104
+ emitEvent("statusChanged")
105
+ );
106
+ eventSource.addEventListener("connected", emitEvent("connected"));
107
+ eventSource.addEventListener("txChanged", emitEvent("txChanged"));
108
+ eventSource.onerror = () => {
109
+ if (connection?.url === sseUrlString) {
110
+ connection.eventSource.close();
111
+ connection = null;
112
+ }
113
+ };
86
114
  connection = {
87
- token,
88
- url: socketUri,
89
- socket: socket_ioClient.io(socketUri, {
90
- auth: {
91
- token: `Bearer ${token}`
92
- }
93
- })
115
+ eventSource,
116
+ url: sseUrlString,
117
+ token
94
118
  };
95
- connection.socket.onAny((event, ...args) => {
96
- this.emit(event, ...args);
97
- });
98
119
  }
99
120
  }
100
121
  async request({ method, params }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/SpliceProvider.ts","../src/SpliceProviderHttp.ts","../src/SpliceProviderWindow.ts","../src/index.ts"],"names":["isSpliceMessageEvent","WalletEvent","HttpTransport","SpliceWalletJSONRPCDAppAPI","io","WindowTransport","ProviderType"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestPayload } from '@canton-network/core-types'\n\nexport type EventListener<T> = (...args: T[]) => void\n\nexport interface SpliceProvider {\n request<T>(args: RequestPayload): Promise<T>\n on<T>(event: string, listener: EventListener<T>): SpliceProvider\n emit<T>(event: string, ...args: T[]): boolean\n removeListener<T>(\n event: string,\n listenerToRemove: EventListener<T>\n ): SpliceProvider\n}\n\nexport abstract class SpliceProviderBase implements SpliceProvider {\n listeners: { [event: string]: EventListener<unknown>[] }\n\n constructor() {\n this.listeners = {} // Event listeners\n }\n\n abstract request<T>(args: RequestPayload): Promise<T>\n\n // Event handling\n public on<T>(event: string, listener: EventListener<T>): SpliceProvider {\n if (!this.listeners[event]) {\n this.listeners[event] = []\n }\n const listeners = this.listeners[event] as EventListener<T>[]\n listeners.push(listener)\n\n return this\n }\n\n public emit<T>(event: string, ...args: T[]): boolean {\n if (this.listeners[event]) {\n this.listeners[event].forEach((listener) => listener(...args))\n return true\n }\n return false\n }\n\n public removeListener<T>(\n event: string,\n listenerToRemove: EventListener<T>\n ): SpliceProvider {\n if (!this.listeners[event]) return this\n\n this.listeners[event] = this.listeners[event].filter(\n (listener) => listener !== listenerToRemove\n )\n\n return this\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n isSpliceMessageEvent,\n RequestPayload,\n WalletEvent,\n} from '@canton-network/core-types'\nimport { HttpTransport } from '@canton-network/core-rpc-transport'\nimport SpliceWalletJSONRPCDAppAPI from '@canton-network/core-wallet-dapp-rpc-client'\nimport { SpliceProviderBase } from './SpliceProvider'\nimport { io, Socket } from 'socket.io-client'\n\n// Maintain a global socket instance in-memory to avoid multiple connections\n// per SpliceProviderHttp instance.\ntype GatewaySocket = {\n socket: Socket\n url: string\n token: string\n} | null\n\nlet connection: GatewaySocket = null\n\nexport class SpliceProviderHttp extends SpliceProviderBase {\n private sessionToken?: string\n private client: SpliceWalletJSONRPCDAppAPI\n\n private createClient(sessionToken?: string): SpliceWalletJSONRPCDAppAPI {\n const transport = new HttpTransport(this.url, sessionToken)\n return new SpliceWalletJSONRPCDAppAPI(transport)\n }\n\n private openSocket(url: URL, token: string): void {\n // Assumes the socket URI is accessed directly on the host w/o the API path.\n const socketUri = url.origin\n\n // Reconnect if the URL or token has changed\n if (\n connection &&\n (token !== connection.token || socketUri !== connection.url)\n ) {\n connection.socket.disconnect()\n connection = null\n }\n\n if (!connection) {\n connection = {\n token,\n url: socketUri,\n socket: io(socketUri, {\n auth: {\n token: `Bearer ${token}`,\n },\n }),\n }\n\n connection.socket.onAny((event, ...args) => {\n this.emit(event, ...args)\n })\n }\n }\n\n constructor(\n private url: URL,\n sessionToken?: string\n ) {\n super()\n\n if (sessionToken) {\n this.sessionToken = sessionToken\n this.openSocket(url, sessionToken)\n }\n\n this.client = this.createClient(sessionToken)\n\n // Listen for the auth success event sent from the WK UI popup to the SDK running in the parent window.\n window.addEventListener('message', async (event) => {\n if (!isSpliceMessageEvent(event)) return\n\n if (\n event.data.type === WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS\n ) {\n this.sessionToken = event.data.token\n this.client = this.createClient(this.sessionToken)\n this.openSocket(this.url, event.data.token)\n\n // We requery the status explicitly here, as it's not guaranteed that the socket will be open & authenticated\n // before the `onConnected` event is fired from the `addSession` RPC call. The dappApi.StatusResult and\n // dappApi.OnConnectedEvent are mapped manually to avoid dependency.\n this.request({ method: 'status' })\n .then((status) => {\n this.emit('onConnected', status)\n })\n .catch((err) => {\n console.error(\n 'Error requesting status after auth:',\n err\n )\n })\n }\n })\n }\n\n public async request<T>({ method, params }: RequestPayload): Promise<T> {\n return (await (\n this.client.request as (\n method: string,\n params?: RequestPayload['params']\n ) => Promise<unknown>\n )(method, params)) as T\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestPayload } from '@canton-network/core-types'\nimport { WindowTransport } from '@canton-network/core-rpc-transport'\nimport SpliceWalletJSONRPCDAppAPI from '@canton-network/core-wallet-dapp-rpc-client'\nimport { SpliceProviderBase } from './SpliceProvider.js'\n\nexport class SpliceProviderWindow extends SpliceProviderBase {\n private client: SpliceWalletJSONRPCDAppAPI\n\n constructor() {\n super()\n const transport = new WindowTransport(window)\n this.client = new SpliceWalletJSONRPCDAppAPI(transport)\n }\n\n public async request<T>({ method, params }: RequestPayload): Promise<T> {\n return (await (\n this.client.request as (\n method: string,\n params?: RequestPayload['params']\n ) => Promise<unknown>\n )(method, params)) as T\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { SpliceProvider } from './SpliceProvider'\n\ndeclare global {\n interface Window {\n canton?: SpliceProvider | undefined\n }\n}\n\nexport enum ProviderType {\n WINDOW,\n HTTP,\n}\n\nexport function injectSpliceProvider(provider: SpliceProvider): SpliceProvider {\n // Check if the provider is already injected\n if (window.canton !== undefined) return window.canton\n\n // Inject the SpliceProvider instance\n window.canton = provider\n\n console.log('Splice provider injected successfully.')\n return window.canton\n}\n\nexport * from './SpliceProvider'\nexport * from './SpliceProviderHttp'\nexport * from './SpliceProviderWindow'\n"]}
1
+ {"version":3,"sources":["../src/SpliceProvider.ts","../src/SpliceProviderHttp.ts","../src/SpliceProviderWindow.ts","../src/index.ts"],"names":["isSpliceMessageEvent","WalletEvent","HttpTransport","SpliceWalletJSONRPCDAppAPI","WindowTransport","ProviderType"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestPayload } from '@canton-network/core-types'\n\nexport type EventListener<T> = (...args: T[]) => void\n\nexport interface SpliceProvider {\n request<T>(args: RequestPayload): Promise<T>\n on<T>(event: string, listener: EventListener<T>): SpliceProvider\n emit<T>(event: string, ...args: T[]): boolean\n removeListener<T>(\n event: string,\n listenerToRemove: EventListener<T>\n ): SpliceProvider\n}\n\nexport abstract class SpliceProviderBase implements SpliceProvider {\n listeners: { [event: string]: EventListener<unknown>[] }\n\n constructor() {\n this.listeners = {} // Event listeners\n }\n\n abstract request<T>(args: RequestPayload): Promise<T>\n\n // Event handling\n public on<T>(event: string, listener: EventListener<T>): SpliceProvider {\n if (!this.listeners[event]) {\n this.listeners[event] = []\n }\n const listeners = this.listeners[event] as EventListener<T>[]\n listeners.push(listener)\n\n return this\n }\n\n public emit<T>(event: string, ...args: T[]): boolean {\n if (this.listeners[event]) {\n this.listeners[event].forEach((listener) => listener(...args))\n return true\n }\n return false\n }\n\n public removeListener<T>(\n event: string,\n listenerToRemove: EventListener<T>\n ): SpliceProvider {\n if (!this.listeners[event]) return this\n\n this.listeners[event] = this.listeners[event].filter(\n (listener) => listener !== listenerToRemove\n )\n\n return this\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n isSpliceMessageEvent,\n RequestPayload,\n WalletEvent,\n} from '@canton-network/core-types'\nimport { HttpTransport } from '@canton-network/core-rpc-transport'\nimport SpliceWalletJSONRPCDAppAPI from '@canton-network/core-wallet-dapp-rpc-client'\nimport { SpliceProviderBase } from './SpliceProvider'\n\n// Maintain a global SSE connection in-memory to avoid multiple connections\n// per SpliceProviderHttp instance.\ntype GatewaySSE = {\n url: string\n token: string\n eventSource: EventSource\n} | null\n\nlet connection: GatewaySSE = null\n\nfunction parseSSEData(data: string): unknown[] {\n try {\n const parsed = JSON.parse(data)\n return Array.isArray(parsed) ? parsed : [parsed]\n } catch {\n return [data]\n }\n}\n\nexport class SpliceProviderHttp extends SpliceProviderBase {\n private sessionToken?: string\n private client: SpliceWalletJSONRPCDAppAPI\n\n private createClient(sessionToken?: string): SpliceWalletJSONRPCDAppAPI {\n const transport = new HttpTransport(this.url, sessionToken)\n return new SpliceWalletJSONRPCDAppAPI(transport)\n }\n\n private openSSE(url: URL, token: string): void {\n const sseUrl = new URL('events', url.toString().replace(/\\/?$/, '/'))\n sseUrl.searchParams.set('token', token)\n const sseUrlString = sseUrl.toString()\n\n // Reconnect if the URL or token has changed\n if (\n connection &&\n (token !== connection.token || sseUrlString !== connection.url)\n ) {\n connection.eventSource.close()\n connection = null\n }\n\n if (!connection) {\n const eventSource = new EventSource(sseUrlString)\n\n eventSource.onmessage = (event) =>\n this.emit('message', ...parseSSEData(event.data))\n\n const emitEvent = (name: string) => (event: MessageEvent) =>\n this.emit(name, ...parseSSEData(event.data))\n\n eventSource.addEventListener(\n 'accountsChanged',\n emitEvent('accountsChanged')\n )\n eventSource.addEventListener(\n 'statusChanged',\n emitEvent('statusChanged')\n )\n eventSource.addEventListener('connected', emitEvent('connected'))\n eventSource.addEventListener('txChanged', emitEvent('txChanged'))\n\n eventSource.onerror = () => {\n if (connection?.url === sseUrlString) {\n connection.eventSource.close()\n connection = null\n }\n }\n\n connection = {\n eventSource,\n url: sseUrlString,\n token,\n }\n }\n }\n\n constructor(\n private url: URL,\n sessionToken?: string\n ) {\n super()\n\n if (sessionToken) {\n this.sessionToken = sessionToken\n this.openSSE(url, sessionToken)\n }\n\n this.client = this.createClient(sessionToken)\n\n // Listen for the auth success event sent from the WK UI popup to the SDK running in the parent window.\n window.addEventListener('message', async (event) => {\n if (!isSpliceMessageEvent(event)) return\n\n if (\n event.data.type === WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS\n ) {\n this.sessionToken = event.data.token\n this.client = this.createClient(this.sessionToken)\n this.openSSE(this.url, event.data.token)\n\n // We requery the status explicitly here, as it's not guaranteed that the socket will be open & authenticated\n // before the `statusChanged` event is fired from the `addSession` RPC call. The dappApi.StatusResult and\n // dappApi.StatusEvent are mapped manually to avoid dependency.\n this.request({ method: 'status' })\n .then((status) => {\n this.emit('statusChanged', status)\n })\n .catch((err) => {\n console.error(\n 'Error requesting status after auth:',\n err\n )\n })\n }\n })\n }\n\n public async request<T>({ method, params }: RequestPayload): Promise<T> {\n return (await (\n this.client.request as (\n method: string,\n params?: RequestPayload['params']\n ) => Promise<unknown>\n )(method, params)) as T\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestPayload } from '@canton-network/core-types'\nimport { WindowTransport } from '@canton-network/core-rpc-transport'\nimport SpliceWalletJSONRPCDAppAPI from '@canton-network/core-wallet-dapp-rpc-client'\nimport { SpliceProviderBase } from './SpliceProvider.js'\n\nexport class SpliceProviderWindow extends SpliceProviderBase {\n private client: SpliceWalletJSONRPCDAppAPI\n\n constructor() {\n super()\n const transport = new WindowTransport(window)\n this.client = new SpliceWalletJSONRPCDAppAPI(transport)\n }\n\n public async request<T>({ method, params }: RequestPayload): Promise<T> {\n return (await (\n this.client.request as (\n method: string,\n params?: RequestPayload['params']\n ) => Promise<unknown>\n )(method, params)) as T\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { SpliceProvider } from './SpliceProvider'\n\ndeclare global {\n interface Window {\n canton?: SpliceProvider | undefined\n }\n}\n\nexport enum ProviderType {\n WINDOW,\n HTTP,\n}\n\nexport function injectSpliceProvider(provider: SpliceProvider): SpliceProvider {\n // Check if the provider is already injected\n if (window.canton !== undefined) return window.canton\n\n // Inject the SpliceProvider instance\n window.canton = provider\n\n console.log('Splice provider injected successfully.')\n return window.canton\n}\n\nexport * from './SpliceProvider'\nexport * from './SpliceProviderHttp'\nexport * from './SpliceProviderWindow'\n"]}
package/dist/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import { isSpliceMessageEvent, WalletEvent } from '@canton-network/core-types';
2
2
  import { HttpTransport, WindowTransport } from '@canton-network/core-rpc-transport';
3
3
  import SpliceWalletJSONRPCDAppAPI from '@canton-network/core-wallet-dapp-rpc-client';
4
- import { io } from 'socket.io-client';
5
4
 
6
5
  var __defProp = Object.defineProperty;
7
6
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -38,6 +37,14 @@ var SpliceProviderBase = class {
38
37
  }
39
38
  };
40
39
  var connection = null;
40
+ function parseSSEData(data) {
41
+ try {
42
+ const parsed = JSON.parse(data);
43
+ return Array.isArray(parsed) ? parsed : [parsed];
44
+ } catch {
45
+ return [data];
46
+ }
47
+ }
41
48
  var SpliceProviderHttp = class extends SpliceProviderBase {
42
49
  constructor(url, sessionToken) {
43
50
  super();
@@ -46,7 +53,7 @@ var SpliceProviderHttp = class extends SpliceProviderBase {
46
53
  __publicField(this, "client");
47
54
  if (sessionToken) {
48
55
  this.sessionToken = sessionToken;
49
- this.openSocket(url, sessionToken);
56
+ this.openSSE(url, sessionToken);
50
57
  }
51
58
  this.client = this.createClient(sessionToken);
52
59
  window.addEventListener("message", async (event) => {
@@ -54,9 +61,9 @@ var SpliceProviderHttp = class extends SpliceProviderBase {
54
61
  if (event.data.type === WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS) {
55
62
  this.sessionToken = event.data.token;
56
63
  this.client = this.createClient(this.sessionToken);
57
- this.openSocket(this.url, event.data.token);
64
+ this.openSSE(this.url, event.data.token);
58
65
  this.request({ method: "status" }).then((status) => {
59
- this.emit("onConnected", status);
66
+ this.emit("statusChanged", status);
60
67
  }).catch((err) => {
61
68
  console.error(
62
69
  "Error requesting status after auth:",
@@ -70,25 +77,39 @@ var SpliceProviderHttp = class extends SpliceProviderBase {
70
77
  const transport = new HttpTransport(this.url, sessionToken);
71
78
  return new SpliceWalletJSONRPCDAppAPI(transport);
72
79
  }
73
- openSocket(url, token) {
74
- const socketUri = url.origin;
75
- if (connection && (token !== connection.token || socketUri !== connection.url)) {
76
- connection.socket.disconnect();
80
+ openSSE(url, token) {
81
+ const sseUrl = new URL("events", url.toString().replace(/\/?$/, "/"));
82
+ sseUrl.searchParams.set("token", token);
83
+ const sseUrlString = sseUrl.toString();
84
+ if (connection && (token !== connection.token || sseUrlString !== connection.url)) {
85
+ connection.eventSource.close();
77
86
  connection = null;
78
87
  }
79
88
  if (!connection) {
89
+ const eventSource = new EventSource(sseUrlString);
90
+ eventSource.onmessage = (event) => this.emit("message", ...parseSSEData(event.data));
91
+ const emitEvent = (name) => (event) => this.emit(name, ...parseSSEData(event.data));
92
+ eventSource.addEventListener(
93
+ "accountsChanged",
94
+ emitEvent("accountsChanged")
95
+ );
96
+ eventSource.addEventListener(
97
+ "statusChanged",
98
+ emitEvent("statusChanged")
99
+ );
100
+ eventSource.addEventListener("connected", emitEvent("connected"));
101
+ eventSource.addEventListener("txChanged", emitEvent("txChanged"));
102
+ eventSource.onerror = () => {
103
+ if (connection?.url === sseUrlString) {
104
+ connection.eventSource.close();
105
+ connection = null;
106
+ }
107
+ };
80
108
  connection = {
81
- token,
82
- url: socketUri,
83
- socket: io(socketUri, {
84
- auth: {
85
- token: `Bearer ${token}`
86
- }
87
- })
109
+ eventSource,
110
+ url: sseUrlString,
111
+ token
88
112
  };
89
- connection.socket.onAny((event, ...args) => {
90
- this.emit(event, ...args);
91
- });
92
113
  }
93
114
  }
94
115
  async request({ method, params }) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/SpliceProvider.ts","../src/SpliceProviderHttp.ts","../src/SpliceProviderWindow.ts","../src/index.ts"],"names":["SpliceWalletJSONRPCDAppAPI","ProviderType"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestPayload } from '@canton-network/core-types'\n\nexport type EventListener<T> = (...args: T[]) => void\n\nexport interface SpliceProvider {\n request<T>(args: RequestPayload): Promise<T>\n on<T>(event: string, listener: EventListener<T>): SpliceProvider\n emit<T>(event: string, ...args: T[]): boolean\n removeListener<T>(\n event: string,\n listenerToRemove: EventListener<T>\n ): SpliceProvider\n}\n\nexport abstract class SpliceProviderBase implements SpliceProvider {\n listeners: { [event: string]: EventListener<unknown>[] }\n\n constructor() {\n this.listeners = {} // Event listeners\n }\n\n abstract request<T>(args: RequestPayload): Promise<T>\n\n // Event handling\n public on<T>(event: string, listener: EventListener<T>): SpliceProvider {\n if (!this.listeners[event]) {\n this.listeners[event] = []\n }\n const listeners = this.listeners[event] as EventListener<T>[]\n listeners.push(listener)\n\n return this\n }\n\n public emit<T>(event: string, ...args: T[]): boolean {\n if (this.listeners[event]) {\n this.listeners[event].forEach((listener) => listener(...args))\n return true\n }\n return false\n }\n\n public removeListener<T>(\n event: string,\n listenerToRemove: EventListener<T>\n ): SpliceProvider {\n if (!this.listeners[event]) return this\n\n this.listeners[event] = this.listeners[event].filter(\n (listener) => listener !== listenerToRemove\n )\n\n return this\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n isSpliceMessageEvent,\n RequestPayload,\n WalletEvent,\n} from '@canton-network/core-types'\nimport { HttpTransport } from '@canton-network/core-rpc-transport'\nimport SpliceWalletJSONRPCDAppAPI from '@canton-network/core-wallet-dapp-rpc-client'\nimport { SpliceProviderBase } from './SpliceProvider'\nimport { io, Socket } from 'socket.io-client'\n\n// Maintain a global socket instance in-memory to avoid multiple connections\n// per SpliceProviderHttp instance.\ntype GatewaySocket = {\n socket: Socket\n url: string\n token: string\n} | null\n\nlet connection: GatewaySocket = null\n\nexport class SpliceProviderHttp extends SpliceProviderBase {\n private sessionToken?: string\n private client: SpliceWalletJSONRPCDAppAPI\n\n private createClient(sessionToken?: string): SpliceWalletJSONRPCDAppAPI {\n const transport = new HttpTransport(this.url, sessionToken)\n return new SpliceWalletJSONRPCDAppAPI(transport)\n }\n\n private openSocket(url: URL, token: string): void {\n // Assumes the socket URI is accessed directly on the host w/o the API path.\n const socketUri = url.origin\n\n // Reconnect if the URL or token has changed\n if (\n connection &&\n (token !== connection.token || socketUri !== connection.url)\n ) {\n connection.socket.disconnect()\n connection = null\n }\n\n if (!connection) {\n connection = {\n token,\n url: socketUri,\n socket: io(socketUri, {\n auth: {\n token: `Bearer ${token}`,\n },\n }),\n }\n\n connection.socket.onAny((event, ...args) => {\n this.emit(event, ...args)\n })\n }\n }\n\n constructor(\n private url: URL,\n sessionToken?: string\n ) {\n super()\n\n if (sessionToken) {\n this.sessionToken = sessionToken\n this.openSocket(url, sessionToken)\n }\n\n this.client = this.createClient(sessionToken)\n\n // Listen for the auth success event sent from the WK UI popup to the SDK running in the parent window.\n window.addEventListener('message', async (event) => {\n if (!isSpliceMessageEvent(event)) return\n\n if (\n event.data.type === WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS\n ) {\n this.sessionToken = event.data.token\n this.client = this.createClient(this.sessionToken)\n this.openSocket(this.url, event.data.token)\n\n // We requery the status explicitly here, as it's not guaranteed that the socket will be open & authenticated\n // before the `onConnected` event is fired from the `addSession` RPC call. The dappApi.StatusResult and\n // dappApi.OnConnectedEvent are mapped manually to avoid dependency.\n this.request({ method: 'status' })\n .then((status) => {\n this.emit('onConnected', status)\n })\n .catch((err) => {\n console.error(\n 'Error requesting status after auth:',\n err\n )\n })\n }\n })\n }\n\n public async request<T>({ method, params }: RequestPayload): Promise<T> {\n return (await (\n this.client.request as (\n method: string,\n params?: RequestPayload['params']\n ) => Promise<unknown>\n )(method, params)) as T\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestPayload } from '@canton-network/core-types'\nimport { WindowTransport } from '@canton-network/core-rpc-transport'\nimport SpliceWalletJSONRPCDAppAPI from '@canton-network/core-wallet-dapp-rpc-client'\nimport { SpliceProviderBase } from './SpliceProvider.js'\n\nexport class SpliceProviderWindow extends SpliceProviderBase {\n private client: SpliceWalletJSONRPCDAppAPI\n\n constructor() {\n super()\n const transport = new WindowTransport(window)\n this.client = new SpliceWalletJSONRPCDAppAPI(transport)\n }\n\n public async request<T>({ method, params }: RequestPayload): Promise<T> {\n return (await (\n this.client.request as (\n method: string,\n params?: RequestPayload['params']\n ) => Promise<unknown>\n )(method, params)) as T\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { SpliceProvider } from './SpliceProvider'\n\ndeclare global {\n interface Window {\n canton?: SpliceProvider | undefined\n }\n}\n\nexport enum ProviderType {\n WINDOW,\n HTTP,\n}\n\nexport function injectSpliceProvider(provider: SpliceProvider): SpliceProvider {\n // Check if the provider is already injected\n if (window.canton !== undefined) return window.canton\n\n // Inject the SpliceProvider instance\n window.canton = provider\n\n console.log('Splice provider injected successfully.')\n return window.canton\n}\n\nexport * from './SpliceProvider'\nexport * from './SpliceProviderHttp'\nexport * from './SpliceProviderWindow'\n"]}
1
+ {"version":3,"sources":["../src/SpliceProvider.ts","../src/SpliceProviderHttp.ts","../src/SpliceProviderWindow.ts","../src/index.ts"],"names":["SpliceWalletJSONRPCDAppAPI","ProviderType"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestPayload } from '@canton-network/core-types'\n\nexport type EventListener<T> = (...args: T[]) => void\n\nexport interface SpliceProvider {\n request<T>(args: RequestPayload): Promise<T>\n on<T>(event: string, listener: EventListener<T>): SpliceProvider\n emit<T>(event: string, ...args: T[]): boolean\n removeListener<T>(\n event: string,\n listenerToRemove: EventListener<T>\n ): SpliceProvider\n}\n\nexport abstract class SpliceProviderBase implements SpliceProvider {\n listeners: { [event: string]: EventListener<unknown>[] }\n\n constructor() {\n this.listeners = {} // Event listeners\n }\n\n abstract request<T>(args: RequestPayload): Promise<T>\n\n // Event handling\n public on<T>(event: string, listener: EventListener<T>): SpliceProvider {\n if (!this.listeners[event]) {\n this.listeners[event] = []\n }\n const listeners = this.listeners[event] as EventListener<T>[]\n listeners.push(listener)\n\n return this\n }\n\n public emit<T>(event: string, ...args: T[]): boolean {\n if (this.listeners[event]) {\n this.listeners[event].forEach((listener) => listener(...args))\n return true\n }\n return false\n }\n\n public removeListener<T>(\n event: string,\n listenerToRemove: EventListener<T>\n ): SpliceProvider {\n if (!this.listeners[event]) return this\n\n this.listeners[event] = this.listeners[event].filter(\n (listener) => listener !== listenerToRemove\n )\n\n return this\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n isSpliceMessageEvent,\n RequestPayload,\n WalletEvent,\n} from '@canton-network/core-types'\nimport { HttpTransport } from '@canton-network/core-rpc-transport'\nimport SpliceWalletJSONRPCDAppAPI from '@canton-network/core-wallet-dapp-rpc-client'\nimport { SpliceProviderBase } from './SpliceProvider'\n\n// Maintain a global SSE connection in-memory to avoid multiple connections\n// per SpliceProviderHttp instance.\ntype GatewaySSE = {\n url: string\n token: string\n eventSource: EventSource\n} | null\n\nlet connection: GatewaySSE = null\n\nfunction parseSSEData(data: string): unknown[] {\n try {\n const parsed = JSON.parse(data)\n return Array.isArray(parsed) ? parsed : [parsed]\n } catch {\n return [data]\n }\n}\n\nexport class SpliceProviderHttp extends SpliceProviderBase {\n private sessionToken?: string\n private client: SpliceWalletJSONRPCDAppAPI\n\n private createClient(sessionToken?: string): SpliceWalletJSONRPCDAppAPI {\n const transport = new HttpTransport(this.url, sessionToken)\n return new SpliceWalletJSONRPCDAppAPI(transport)\n }\n\n private openSSE(url: URL, token: string): void {\n const sseUrl = new URL('events', url.toString().replace(/\\/?$/, '/'))\n sseUrl.searchParams.set('token', token)\n const sseUrlString = sseUrl.toString()\n\n // Reconnect if the URL or token has changed\n if (\n connection &&\n (token !== connection.token || sseUrlString !== connection.url)\n ) {\n connection.eventSource.close()\n connection = null\n }\n\n if (!connection) {\n const eventSource = new EventSource(sseUrlString)\n\n eventSource.onmessage = (event) =>\n this.emit('message', ...parseSSEData(event.data))\n\n const emitEvent = (name: string) => (event: MessageEvent) =>\n this.emit(name, ...parseSSEData(event.data))\n\n eventSource.addEventListener(\n 'accountsChanged',\n emitEvent('accountsChanged')\n )\n eventSource.addEventListener(\n 'statusChanged',\n emitEvent('statusChanged')\n )\n eventSource.addEventListener('connected', emitEvent('connected'))\n eventSource.addEventListener('txChanged', emitEvent('txChanged'))\n\n eventSource.onerror = () => {\n if (connection?.url === sseUrlString) {\n connection.eventSource.close()\n connection = null\n }\n }\n\n connection = {\n eventSource,\n url: sseUrlString,\n token,\n }\n }\n }\n\n constructor(\n private url: URL,\n sessionToken?: string\n ) {\n super()\n\n if (sessionToken) {\n this.sessionToken = sessionToken\n this.openSSE(url, sessionToken)\n }\n\n this.client = this.createClient(sessionToken)\n\n // Listen for the auth success event sent from the WK UI popup to the SDK running in the parent window.\n window.addEventListener('message', async (event) => {\n if (!isSpliceMessageEvent(event)) return\n\n if (\n event.data.type === WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS\n ) {\n this.sessionToken = event.data.token\n this.client = this.createClient(this.sessionToken)\n this.openSSE(this.url, event.data.token)\n\n // We requery the status explicitly here, as it's not guaranteed that the socket will be open & authenticated\n // before the `statusChanged` event is fired from the `addSession` RPC call. The dappApi.StatusResult and\n // dappApi.StatusEvent are mapped manually to avoid dependency.\n this.request({ method: 'status' })\n .then((status) => {\n this.emit('statusChanged', status)\n })\n .catch((err) => {\n console.error(\n 'Error requesting status after auth:',\n err\n )\n })\n }\n })\n }\n\n public async request<T>({ method, params }: RequestPayload): Promise<T> {\n return (await (\n this.client.request as (\n method: string,\n params?: RequestPayload['params']\n ) => Promise<unknown>\n )(method, params)) as T\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestPayload } from '@canton-network/core-types'\nimport { WindowTransport } from '@canton-network/core-rpc-transport'\nimport SpliceWalletJSONRPCDAppAPI from '@canton-network/core-wallet-dapp-rpc-client'\nimport { SpliceProviderBase } from './SpliceProvider.js'\n\nexport class SpliceProviderWindow extends SpliceProviderBase {\n private client: SpliceWalletJSONRPCDAppAPI\n\n constructor() {\n super()\n const transport = new WindowTransport(window)\n this.client = new SpliceWalletJSONRPCDAppAPI(transport)\n }\n\n public async request<T>({ method, params }: RequestPayload): Promise<T> {\n return (await (\n this.client.request as (\n method: string,\n params?: RequestPayload['params']\n ) => Promise<unknown>\n )(method, params)) as T\n }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { SpliceProvider } from './SpliceProvider'\n\ndeclare global {\n interface Window {\n canton?: SpliceProvider | undefined\n }\n}\n\nexport enum ProviderType {\n WINDOW,\n HTTP,\n}\n\nexport function injectSpliceProvider(provider: SpliceProvider): SpliceProvider {\n // Check if the provider is already injected\n if (window.canton !== undefined) return window.canton\n\n // Inject the SpliceProvider instance\n window.canton = provider\n\n console.log('Splice provider injected successfully.')\n return window.canton\n}\n\nexport * from './SpliceProvider'\nexport * from './SpliceProviderHttp'\nexport * from './SpliceProviderWindow'\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canton-network/core-splice-provider",
3
- "version": "0.21.0",
3
+ "version": "0.23.0",
4
4
  "type": "module",
5
5
  "description": "A JavaScript Splice Provider API (EIP-1193 compliant).",
6
6
  "license": "Apache-2.0",
@@ -28,11 +28,10 @@
28
28
  "typescript": "^5.9.3"
29
29
  },
30
30
  "dependencies": {
31
- "@canton-network/core-rpc-transport": "^0.2.4",
32
- "@canton-network/core-types": "^0.16.3",
33
- "@canton-network/core-wallet-dapp-rpc-client": "^0.20.2",
34
- "@canton-network/core-wallet-ui-components": "^0.21.0",
35
- "socket.io-client": "^4.8.3"
31
+ "@canton-network/core-rpc-transport": "^0.4.0",
32
+ "@canton-network/core-types": "^0.18.0",
33
+ "@canton-network/core-wallet-dapp-rpc-client": "^0.22.0",
34
+ "@canton-network/core-wallet-ui-components": "^0.23.0"
36
35
  },
37
36
  "files": [
38
37
  "dist/**"