@canton-network/core-splice-provider 0.8.0 → 0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"SpliceProviderHttp.d.ts","sourceRoot":"","sources":["../src/SpliceProviderHttp.ts"],"names":[],"mappings":"AAGA,OAAO,EAGH,cAAc,EAEjB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAIrD,qBAAa,kBAAmB,SAAQ,kBAAkB;IA6BlD,OAAO,CAAC,GAAG;IA5Bf,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,SAAS,CAAe;IAEhC,OAAO,CAAC,UAAU;gBAwBN,GAAG,EAAE,GAAG,EAChB,YAAY,CAAC,EAAE,MAAM;IAyCZ,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;CAa1E"}
1
+ {"version":3,"file":"SpliceProviderHttp.d.ts","sourceRoot":"","sources":["../src/SpliceProviderHttp.ts"],"names":[],"mappings":"AAGA,OAAO,EAGH,cAAc,EAEjB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAIrD,qBAAa,kBAAmB,SAAQ,kBAAkB;IA8BlD,OAAO,CAAC,GAAG;IA7Bf,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,SAAS,CAAe;IAEhC,OAAO,CAAC,UAAU;gBAyBN,GAAG,EAAE,GAAG,EAChB,YAAY,CAAC,EAAE,MAAM;IAgDZ,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;CAe1E"}
package/dist/index.cjs ADDED
@@ -0,0 +1,139 @@
1
+ 'use strict';
2
+
3
+ var coreTypes = require('@canton-network/core-types');
4
+ var socket_ioClient = require('socket.io-client');
5
+ var coreWalletUiComponents = require('@canton-network/core-wallet-ui-components');
6
+
7
+ var __defProp = Object.defineProperty;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
10
+
11
+ // src/SpliceProvider.ts
12
+ var SpliceProviderBase = class {
13
+ constructor() {
14
+ __publicField(this, "listeners");
15
+ this.listeners = {};
16
+ }
17
+ // Event handling
18
+ on(event, listener) {
19
+ if (!this.listeners[event]) {
20
+ this.listeners[event] = [];
21
+ }
22
+ const listeners = this.listeners[event];
23
+ listeners.push(listener);
24
+ return this;
25
+ }
26
+ emit(event, ...args) {
27
+ if (this.listeners[event]) {
28
+ this.listeners[event].forEach((listener) => listener(...args));
29
+ return true;
30
+ }
31
+ return false;
32
+ }
33
+ removeListener(event, listenerToRemove) {
34
+ if (!this.listeners[event]) return this;
35
+ this.listeners[event] = this.listeners[event].filter(
36
+ (listener) => listener !== listenerToRemove
37
+ );
38
+ return this;
39
+ }
40
+ };
41
+ var SpliceProviderHttp = class extends SpliceProviderBase {
42
+ constructor(url, sessionToken) {
43
+ super();
44
+ this.url = url;
45
+ __publicField(this, "sessionToken");
46
+ __publicField(this, "socket");
47
+ __publicField(this, "transport");
48
+ if (sessionToken) this.sessionToken = sessionToken;
49
+ this.transport = new coreTypes.HttpTransport(url, sessionToken);
50
+ this.socket = this.openSocket(url);
51
+ window.addEventListener("message", async (event) => {
52
+ if (!coreTypes.isSpliceMessageEvent(event)) return;
53
+ if (event.data.type === coreTypes.WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS) {
54
+ this.sessionToken = event.data.token;
55
+ this.transport = new coreTypes.HttpTransport(url, this.sessionToken);
56
+ console.log(
57
+ `SpliceProviderHttp: setting sessionToken to ${this.sessionToken}`
58
+ );
59
+ this.openSocket(this.url);
60
+ this.request({ method: "status" }).then((status) => {
61
+ const statusResult = status;
62
+ this.emit("onConnected", {
63
+ kernel: statusResult.kernel,
64
+ chainId: statusResult.chainId,
65
+ sessionToken: this.sessionToken
66
+ });
67
+ }).catch((err) => {
68
+ console.error(
69
+ "Error requesting status after auth:",
70
+ err
71
+ );
72
+ });
73
+ }
74
+ });
75
+ }
76
+ openSocket(url) {
77
+ const socketUrl = new URL(url.href);
78
+ socketUrl.pathname = "";
79
+ if (this.socket) {
80
+ console.debug("SpliceProviderHttp: closing existing socket");
81
+ this.socket.disconnect();
82
+ }
83
+ const socket = socket_ioClient.io(socketUrl.href, {
84
+ forceNew: true,
85
+ auth: {
86
+ token: `Bearer ${this.sessionToken}`
87
+ }
88
+ });
89
+ socket.onAny((event, ...args) => {
90
+ this.emit(event, ...args);
91
+ });
92
+ return socket;
93
+ }
94
+ async request({ method, params }) {
95
+ const response = await this.transport.submit({ method, params });
96
+ if ("error" in response) throw new Error(response.error.message);
97
+ const result = response.result;
98
+ if (method === "prepareExecute") {
99
+ const { userUrl } = result;
100
+ if (!userUrl) {
101
+ throw new Error("No userUrl provided in response");
102
+ }
103
+ coreWalletUiComponents.popupHref(userUrl);
104
+ }
105
+ return result;
106
+ }
107
+ };
108
+ var SpliceProviderWindow = class extends SpliceProviderBase {
109
+ constructor() {
110
+ super();
111
+ __publicField(this, "transport");
112
+ this.transport = new coreTypes.WindowTransport(window);
113
+ }
114
+ async request({ method, params }) {
115
+ const response = await this.transport.submit({ method, params });
116
+ return response.result;
117
+ }
118
+ };
119
+
120
+ // src/index.ts
121
+ var ProviderType = /* @__PURE__ */ ((ProviderType2) => {
122
+ ProviderType2[ProviderType2["WINDOW"] = 0] = "WINDOW";
123
+ ProviderType2[ProviderType2["HTTP"] = 1] = "HTTP";
124
+ return ProviderType2;
125
+ })(ProviderType || {});
126
+ function injectSpliceProvider(provider) {
127
+ if (window.canton !== void 0) return window.canton;
128
+ window.canton = provider;
129
+ console.log("Splice provider injected successfully.");
130
+ return window.canton;
131
+ }
132
+
133
+ exports.ProviderType = ProviderType;
134
+ exports.SpliceProviderBase = SpliceProviderBase;
135
+ exports.SpliceProviderHttp = SpliceProviderHttp;
136
+ exports.SpliceProviderWindow = SpliceProviderWindow;
137
+ exports.injectSpliceProvider = injectSpliceProvider;
138
+ //# sourceMappingURL=index.cjs.map
139
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/SpliceProvider.ts","../src/SpliceProviderHttp.ts","../src/SpliceProviderWindow.ts","../src/index.ts"],"names":["HttpTransport","isSpliceMessageEvent","WalletEvent","io","popupHref","WindowTransport","ProviderType"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025 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 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n HttpTransport,\n isSpliceMessageEvent,\n RequestPayload,\n WalletEvent,\n} from '@canton-network/core-types'\nimport { SpliceProviderBase } from './SpliceProvider'\nimport { io, Socket } from 'socket.io-client'\nimport { popupHref } from '@canton-network/core-wallet-ui-components'\n\nexport class SpliceProviderHttp extends SpliceProviderBase {\n private sessionToken?: string\n private socket: Socket\n private transport: HttpTransport\n\n private openSocket(url: URL): Socket {\n // Assumes the RPC URL is on /rpc, and the socket URL is the same but without the /rpc path.\n const socketUrl = new URL(url.href)\n socketUrl.pathname = ''\n\n if (this.socket) {\n console.debug('SpliceProviderHttp: closing existing socket')\n this.socket.disconnect()\n }\n\n const socket = io(socketUrl.href, {\n forceNew: true,\n auth: {\n token: `Bearer ${this.sessionToken}`,\n },\n })\n\n socket.onAny((event, ...args) => {\n this.emit(event, ...args)\n })\n\n return socket\n }\n\n constructor(\n private url: URL,\n sessionToken?: string\n ) {\n super()\n\n if (sessionToken) this.sessionToken = sessionToken\n this.transport = new HttpTransport(url, sessionToken)\n\n this.socket = this.openSocket(url)\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.transport = new HttpTransport(url, this.sessionToken)\n console.log(\n `SpliceProviderHttp: setting sessionToken to ${this.sessionToken}`\n )\n this.openSocket(this.url)\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 const statusResult = status as {\n kernel: unknown\n chainId?: unknown\n }\n this.emit('onConnected', {\n kernel: statusResult.kernel,\n chainId: statusResult.chainId,\n sessionToken: this.sessionToken,\n })\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 const response = await this.transport.submit({ method, params })\n\n if ('error' in response) throw new Error(response.error.message)\n\n const result = response.result as T\n if (method === 'prepareExecute') {\n const { userUrl } = result as { userUrl?: string }\n if (!userUrl) {\n throw new Error('No userUrl provided in response')\n }\n popupHref(userUrl)\n }\n return result\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestPayload, WindowTransport } from '@canton-network/core-types'\nimport { SpliceProviderBase } from './SpliceProvider.js'\n\nexport class SpliceProviderWindow extends SpliceProviderBase {\n private transport: WindowTransport\n\n constructor() {\n super()\n this.transport = new WindowTransport(window)\n }\n\n public async request<T>({ method, params }: RequestPayload): Promise<T> {\n const response = await this.transport.submit({ method, params })\n return response.result as T\n }\n}\n","// Copyright (c) 2025 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\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,19 +1,133 @@
1
- // Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
2
- // SPDX-License-Identifier: Apache-2.0
3
- export var ProviderType;
4
- (function (ProviderType) {
5
- ProviderType[ProviderType["WINDOW"] = 0] = "WINDOW";
6
- ProviderType[ProviderType["HTTP"] = 1] = "HTTP";
7
- })(ProviderType || (ProviderType = {}));
8
- export function injectSpliceProvider(provider) {
9
- // Check if the provider is already injected
10
- if (window.canton !== undefined)
11
- return window.canton;
12
- // Inject the SpliceProvider instance
13
- window.canton = provider;
14
- console.log('Splice provider injected successfully.');
15
- return window.canton;
1
+ import { HttpTransport, isSpliceMessageEvent, WalletEvent, WindowTransport } from '@canton-network/core-types';
2
+ import { io } from 'socket.io-client';
3
+ import { popupHref } from '@canton-network/core-wallet-ui-components';
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
8
+
9
+ // src/SpliceProvider.ts
10
+ var SpliceProviderBase = class {
11
+ constructor() {
12
+ __publicField(this, "listeners");
13
+ this.listeners = {};
14
+ }
15
+ // Event handling
16
+ on(event, listener) {
17
+ if (!this.listeners[event]) {
18
+ this.listeners[event] = [];
19
+ }
20
+ const listeners = this.listeners[event];
21
+ listeners.push(listener);
22
+ return this;
23
+ }
24
+ emit(event, ...args) {
25
+ if (this.listeners[event]) {
26
+ this.listeners[event].forEach((listener) => listener(...args));
27
+ return true;
28
+ }
29
+ return false;
30
+ }
31
+ removeListener(event, listenerToRemove) {
32
+ if (!this.listeners[event]) return this;
33
+ this.listeners[event] = this.listeners[event].filter(
34
+ (listener) => listener !== listenerToRemove
35
+ );
36
+ return this;
37
+ }
38
+ };
39
+ var SpliceProviderHttp = class extends SpliceProviderBase {
40
+ constructor(url, sessionToken) {
41
+ super();
42
+ this.url = url;
43
+ __publicField(this, "sessionToken");
44
+ __publicField(this, "socket");
45
+ __publicField(this, "transport");
46
+ if (sessionToken) this.sessionToken = sessionToken;
47
+ this.transport = new HttpTransport(url, sessionToken);
48
+ this.socket = this.openSocket(url);
49
+ window.addEventListener("message", async (event) => {
50
+ if (!isSpliceMessageEvent(event)) return;
51
+ if (event.data.type === WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS) {
52
+ this.sessionToken = event.data.token;
53
+ this.transport = new HttpTransport(url, this.sessionToken);
54
+ console.log(
55
+ `SpliceProviderHttp: setting sessionToken to ${this.sessionToken}`
56
+ );
57
+ this.openSocket(this.url);
58
+ this.request({ method: "status" }).then((status) => {
59
+ const statusResult = status;
60
+ this.emit("onConnected", {
61
+ kernel: statusResult.kernel,
62
+ chainId: statusResult.chainId,
63
+ sessionToken: this.sessionToken
64
+ });
65
+ }).catch((err) => {
66
+ console.error(
67
+ "Error requesting status after auth:",
68
+ err
69
+ );
70
+ });
71
+ }
72
+ });
73
+ }
74
+ openSocket(url) {
75
+ const socketUrl = new URL(url.href);
76
+ socketUrl.pathname = "";
77
+ if (this.socket) {
78
+ console.debug("SpliceProviderHttp: closing existing socket");
79
+ this.socket.disconnect();
80
+ }
81
+ const socket = io(socketUrl.href, {
82
+ forceNew: true,
83
+ auth: {
84
+ token: `Bearer ${this.sessionToken}`
85
+ }
86
+ });
87
+ socket.onAny((event, ...args) => {
88
+ this.emit(event, ...args);
89
+ });
90
+ return socket;
91
+ }
92
+ async request({ method, params }) {
93
+ const response = await this.transport.submit({ method, params });
94
+ if ("error" in response) throw new Error(response.error.message);
95
+ const result = response.result;
96
+ if (method === "prepareExecute") {
97
+ const { userUrl } = result;
98
+ if (!userUrl) {
99
+ throw new Error("No userUrl provided in response");
100
+ }
101
+ popupHref(userUrl);
102
+ }
103
+ return result;
104
+ }
105
+ };
106
+ var SpliceProviderWindow = class extends SpliceProviderBase {
107
+ constructor() {
108
+ super();
109
+ __publicField(this, "transport");
110
+ this.transport = new WindowTransport(window);
111
+ }
112
+ async request({ method, params }) {
113
+ const response = await this.transport.submit({ method, params });
114
+ return response.result;
115
+ }
116
+ };
117
+
118
+ // src/index.ts
119
+ var ProviderType = /* @__PURE__ */ ((ProviderType2) => {
120
+ ProviderType2[ProviderType2["WINDOW"] = 0] = "WINDOW";
121
+ ProviderType2[ProviderType2["HTTP"] = 1] = "HTTP";
122
+ return ProviderType2;
123
+ })(ProviderType || {});
124
+ function injectSpliceProvider(provider) {
125
+ if (window.canton !== void 0) return window.canton;
126
+ window.canton = provider;
127
+ console.log("Splice provider injected successfully.");
128
+ return window.canton;
16
129
  }
17
- export * from './SpliceProvider';
18
- export * from './SpliceProviderHttp';
19
- export * from './SpliceProviderWindow';
130
+
131
+ export { ProviderType, SpliceProviderBase, SpliceProviderHttp, SpliceProviderWindow, injectSpliceProvider };
132
+ //# sourceMappingURL=index.js.map
133
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/SpliceProvider.ts","../src/SpliceProviderHttp.ts","../src/SpliceProviderWindow.ts","../src/index.ts"],"names":["ProviderType"],"mappings":";;;;;;;;;AAiBO,IAAe,qBAAf,MAA4D;AAAA,EAG/D,WAAA,GAAc;AAFd,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,CAAA;AAGI,IAAA,IAAA,CAAK,YAAY,EAAC;AAAA,EACtB;AAAA;AAAA,EAKO,EAAA,CAAM,OAAe,QAAA,EAA4C;AACpE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,EAAC;AAAA,IAC7B;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACtC,IAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAEvB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEO,IAAA,CAAQ,UAAkB,IAAA,EAAoB;AACjD,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,GAAG,IAAI,CAAC,CAAA;AAC7D,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEO,cAAA,CACH,OACA,gBAAA,EACc;AACd,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAK,GAAG,OAAO,IAAA;AAEnC,IAAA,IAAA,CAAK,UAAU,KAAK,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,MAAA;AAAA,MAC1C,CAAC,aAAa,QAAA,KAAa;AAAA,KAC/B;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AC5CO,IAAM,kBAAA,GAAN,cAAiC,kBAAA,CAAmB;AAAA,EA6BvD,WAAA,CACY,KACR,YAAA,EACF;AACE,IAAA,KAAA,EAAM;AAHE,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AA7BZ,IAAA,aAAA,CAAA,IAAA,EAAQ,cAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AAgCJ,IAAA,IAAI,YAAA,OAAmB,YAAA,GAAe,YAAA;AACtC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,aAAA,CAAc,GAAA,EAAK,YAAY,CAAA;AAEpD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AAGjC,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,OAAO,KAAA,KAAU;AAChD,MAAA,IAAI,CAAC,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAElC,MAAA,IACI,KAAA,CAAM,IAAA,CAAK,IAAA,KAAS,WAAA,CAAY,8BAAA,EAClC;AACE,QAAA,IAAA,CAAK,YAAA,GAAe,MAAM,IAAA,CAAK,KAAA;AAC/B,QAAA,IAAA,CAAK,SAAA,GAAY,IAAI,aAAA,CAAc,GAAA,EAAK,KAAK,YAAY,CAAA;AACzD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACJ,CAAA,4CAAA,EAA+C,KAAK,YAAY,CAAA;AAAA,SACpE;AACA,QAAA,IAAA,CAAK,UAAA,CAAW,KAAK,GAAG,CAAA;AAKxB,QAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA,CAC5B,IAAA,CAAK,CAAC,MAAA,KAAW;AACd,UAAA,MAAM,YAAA,GAAe,MAAA;AAIrB,UAAA,IAAA,CAAK,KAAK,aAAA,EAAe;AAAA,YACrB,QAAQ,YAAA,CAAa,MAAA;AAAA,YACrB,SAAS,YAAA,CAAa,OAAA;AAAA,YACtB,cAAc,IAAA,CAAK;AAAA,WACtB,CAAA;AAAA,QACL,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACZ,UAAA,OAAA,CAAQ,KAAA;AAAA,YACJ,qCAAA;AAAA,YACA;AAAA,WACJ;AAAA,QACJ,CAAC,CAAA;AAAA,MACT;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAxEQ,WAAW,GAAA,EAAkB;AAEjC,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAClC,IAAA,SAAA,CAAU,QAAA,GAAW,EAAA;AAErB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACb,MAAA,OAAA,CAAQ,MAAM,6CAA6C,CAAA;AAC3D,MAAA,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,IAC3B;AAEA,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,SAAA,CAAU,IAAA,EAAM;AAAA,MAC9B,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM;AAAA,QACF,KAAA,EAAO,CAAA,OAAA,EAAU,IAAA,CAAK,YAAY,CAAA;AAAA;AACtC,KACH,CAAA;AAED,IAAA,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,EAAA,GAAU,IAAA,KAAS;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAoDA,MAAa,OAAA,CAAW,EAAE,MAAA,EAAQ,QAAO,EAA+B;AACpE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAE/D,IAAA,IAAI,WAAW,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,OAAO,CAAA;AAE/D,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,IAAA,IAAI,WAAW,gBAAA,EAAkB;AAC7B,MAAA,MAAM,EAAE,SAAQ,GAAI,MAAA;AACpB,MAAA,IAAI,CAAC,OAAA,EAAS;AACV,QAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,MACrD;AACA,MAAA,SAAA,CAAU,OAAO,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AACJ;ACrGO,IAAM,oBAAA,GAAN,cAAmC,kBAAA,CAAmB;AAAA,EAGzD,WAAA,GAAc;AACV,IAAA,KAAA,EAAM;AAHV,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AAIJ,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,CAAgB,MAAM,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAa,OAAA,CAAW,EAAE,MAAA,EAAQ,QAAO,EAA+B;AACpE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAC/D,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EACpB;AACJ;;;ACPO,IAAK,YAAA,qBAAAA,aAAAA,KAAL;AACH,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AAFQ,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AAKL,SAAS,qBAAqB,QAAA,EAA0C;AAE3E,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,EAAW,OAAO,MAAA,CAAO,MAAA;AAG/C,EAAA,MAAA,CAAO,MAAA,GAAS,QAAA;AAEhB,EAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,EAAA,OAAO,MAAA,CAAO,MAAA;AAClB","file":"index.js","sourcesContent":["// Copyright (c) 2025 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 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n HttpTransport,\n isSpliceMessageEvent,\n RequestPayload,\n WalletEvent,\n} from '@canton-network/core-types'\nimport { SpliceProviderBase } from './SpliceProvider'\nimport { io, Socket } from 'socket.io-client'\nimport { popupHref } from '@canton-network/core-wallet-ui-components'\n\nexport class SpliceProviderHttp extends SpliceProviderBase {\n private sessionToken?: string\n private socket: Socket\n private transport: HttpTransport\n\n private openSocket(url: URL): Socket {\n // Assumes the RPC URL is on /rpc, and the socket URL is the same but without the /rpc path.\n const socketUrl = new URL(url.href)\n socketUrl.pathname = ''\n\n if (this.socket) {\n console.debug('SpliceProviderHttp: closing existing socket')\n this.socket.disconnect()\n }\n\n const socket = io(socketUrl.href, {\n forceNew: true,\n auth: {\n token: `Bearer ${this.sessionToken}`,\n },\n })\n\n socket.onAny((event, ...args) => {\n this.emit(event, ...args)\n })\n\n return socket\n }\n\n constructor(\n private url: URL,\n sessionToken?: string\n ) {\n super()\n\n if (sessionToken) this.sessionToken = sessionToken\n this.transport = new HttpTransport(url, sessionToken)\n\n this.socket = this.openSocket(url)\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.transport = new HttpTransport(url, this.sessionToken)\n console.log(\n `SpliceProviderHttp: setting sessionToken to ${this.sessionToken}`\n )\n this.openSocket(this.url)\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 const statusResult = status as {\n kernel: unknown\n chainId?: unknown\n }\n this.emit('onConnected', {\n kernel: statusResult.kernel,\n chainId: statusResult.chainId,\n sessionToken: this.sessionToken,\n })\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 const response = await this.transport.submit({ method, params })\n\n if ('error' in response) throw new Error(response.error.message)\n\n const result = response.result as T\n if (method === 'prepareExecute') {\n const { userUrl } = result as { userUrl?: string }\n if (!userUrl) {\n throw new Error('No userUrl provided in response')\n }\n popupHref(userUrl)\n }\n return result\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestPayload, WindowTransport } from '@canton-network/core-types'\nimport { SpliceProviderBase } from './SpliceProvider.js'\n\nexport class SpliceProviderWindow extends SpliceProviderBase {\n private transport: WindowTransport\n\n constructor() {\n super()\n this.transport = new WindowTransport(window)\n }\n\n public async request<T>({ method, params }: RequestPayload): Promise<T> {\n const response = await this.transport.submit({ method, params })\n return response.result as T\n }\n}\n","// Copyright (c) 2025 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\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,26 +1,36 @@
1
1
  {
2
2
  "name": "@canton-network/core-splice-provider",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "description": "A JavaScript Splice Provider API (EIP-1193 compliant).",
6
6
  "repository": "github:hyperledger-labs/splice-wallet-kernel",
7
7
  "license": "Apache-2.0",
8
8
  "author": "Marc Juchli <marc.juchli@digitalasset.com>",
9
9
  "packageManager": "yarn@4.9.4",
10
- "main": "./dist/index.js",
10
+ "main": "./dist/index.cjs",
11
+ "module": "./dist/index.js",
11
12
  "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "require": "./dist/index.cjs",
18
+ "default": "./dist/index.js"
19
+ }
20
+ },
12
21
  "scripts": {
13
- "build": "tsc -b",
14
- "dev": "tsc -b --watch",
22
+ "build": "tsup && tsc -p tsconfig.types.json",
23
+ "dev": "tsup --watch --onSuccess \"tsc -p tsconfig.types.json\"",
15
24
  "flatpack": "yarn pack --out \"$FLATPACK_OUTDIR\"",
16
25
  "clean": "tsc -b --clean; rm -rf dist"
17
26
  },
18
27
  "devDependencies": {
28
+ "tsup": "^8.5.0",
19
29
  "typescript": "^5.8.3"
20
30
  },
21
31
  "dependencies": {
22
- "@canton-network/core-types": "",
23
- "@canton-network/core-wallet-ui-components": "",
32
+ "@canton-network/core-types": "^0.10.0",
33
+ "@canton-network/core-wallet-ui-components": "^0.10.0",
24
34
  "socket.io-client": "^4.8.1"
25
35
  },
26
36
  "files": [
@@ -1,30 +0,0 @@
1
- // Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
2
- // SPDX-License-Identifier: Apache-2.0
3
- export class SpliceProviderBase {
4
- listeners;
5
- constructor() {
6
- this.listeners = {}; // Event listeners
7
- }
8
- // Event handling
9
- on(event, listener) {
10
- if (!this.listeners[event]) {
11
- this.listeners[event] = [];
12
- }
13
- const listeners = this.listeners[event];
14
- listeners.push(listener);
15
- return this;
16
- }
17
- emit(event, ...args) {
18
- if (this.listeners[event]) {
19
- this.listeners[event].forEach((listener) => listener(...args));
20
- return true;
21
- }
22
- return false;
23
- }
24
- removeListener(event, listenerToRemove) {
25
- if (!this.listeners[event])
26
- return this;
27
- this.listeners[event] = this.listeners[event].filter((listener) => listener !== listenerToRemove);
28
- return this;
29
- }
30
- }
@@ -1,74 +0,0 @@
1
- // Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
2
- // SPDX-License-Identifier: Apache-2.0
3
- import { HttpTransport, isSpliceMessageEvent, WalletEvent, } from '@canton-network/core-types';
4
- import { SpliceProviderBase } from './SpliceProvider';
5
- import { io } from 'socket.io-client';
6
- import { popupHref } from '@canton-network/core-wallet-ui-components';
7
- export class SpliceProviderHttp extends SpliceProviderBase {
8
- url;
9
- sessionToken;
10
- socket;
11
- transport;
12
- openSocket(url) {
13
- // Assumes the RPC URL is on /rpc, and the socket URL is the same but without the /rpc path.
14
- const socketUrl = new URL(url.href);
15
- socketUrl.pathname = '';
16
- if (this.socket) {
17
- this.socket.disconnect();
18
- }
19
- const socket = io(socketUrl.href, {
20
- forceNew: true,
21
- auth: {
22
- token: `Bearer ${this.sessionToken}`,
23
- },
24
- });
25
- socket.onAny((event, ...args) => {
26
- this.emit(event, ...args);
27
- });
28
- return socket;
29
- }
30
- constructor(url, sessionToken) {
31
- super();
32
- this.url = url;
33
- if (sessionToken)
34
- this.sessionToken = sessionToken;
35
- this.transport = new HttpTransport(url, sessionToken);
36
- this.socket = this.openSocket(url);
37
- // Listen for the auth success event sent from the WK UI popup to the SDK running in the parent window.
38
- window.addEventListener('message', async (event) => {
39
- if (!isSpliceMessageEvent(event))
40
- return;
41
- if (event.data.type === WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS) {
42
- this.sessionToken = event.data.token;
43
- this.transport = new HttpTransport(url, this.sessionToken);
44
- console.log(`SpliceProviderHttp: setting sessionToken to ${this.sessionToken}`);
45
- this.openSocket(this.url);
46
- // We requery the status explicitly here, as it's not guaranteed that the socket will be open & authenticated
47
- // before the `onConnected` event is fired from the `addSession` RPC call. The dappApi.StatusResult and
48
- // dappApi.OnConnectedEvent are mapped manually to avoid dependency.
49
- this.request({ method: 'status' }).then((status) => {
50
- const statusResult = status;
51
- this.emit('onConnected', {
52
- kernel: statusResult.kernel,
53
- chainId: statusResult.chainId,
54
- sessionToken: this.sessionToken,
55
- });
56
- });
57
- }
58
- });
59
- }
60
- async request({ method, params }) {
61
- const response = await this.transport.submit({ method, params });
62
- if ('error' in response)
63
- throw new Error(response.error.message);
64
- const result = response.result;
65
- if (method === 'prepareExecute') {
66
- const { userUrl } = result;
67
- if (!userUrl) {
68
- throw new Error('No userUrl provided in response');
69
- }
70
- popupHref(userUrl);
71
- }
72
- return result;
73
- }
74
- }
@@ -1,15 +0,0 @@
1
- // Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
2
- // SPDX-License-Identifier: Apache-2.0
3
- import { WindowTransport } from '@canton-network/core-types';
4
- import { SpliceProviderBase } from './SpliceProvider.js';
5
- export class SpliceProviderWindow extends SpliceProviderBase {
6
- transport;
7
- constructor() {
8
- super();
9
- this.transport = new WindowTransport(window);
10
- }
11
- async request({ method, params }) {
12
- const response = await this.transport.submit({ method, params });
13
- return response.result;
14
- }
15
- }