@canton-network/core-splice-provider 0.15.0 → 0.16.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/SpliceProviderHttp.d.ts +0 -1
- package/dist/SpliceProviderHttp.d.ts.map +1 -1
- package/dist/index.cjs +26 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -28
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -3,7 +3,6 @@ import { SpliceProviderBase } from './SpliceProvider';
|
|
|
3
3
|
export declare class SpliceProviderHttp extends SpliceProviderBase {
|
|
4
4
|
private url;
|
|
5
5
|
private sessionToken?;
|
|
6
|
-
private socket;
|
|
7
6
|
private transport;
|
|
8
7
|
private openSocket;
|
|
9
8
|
constructor(url: URL, sessionToken?: string);
|
|
@@ -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;
|
|
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;AAcrD,qBAAa,kBAAmB,SAAQ,kBAAkB;IAmClD,OAAO,CAAC,GAAG;IAlCf,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,SAAS,CAAe;IAEhC,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;CAe1E"}
|
package/dist/index.cjs
CHANGED
|
@@ -38,31 +38,26 @@ var SpliceProviderBase = class {
|
|
|
38
38
|
return this;
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
|
+
var connection = null;
|
|
41
42
|
var SpliceProviderHttp = class extends SpliceProviderBase {
|
|
42
43
|
constructor(url, sessionToken) {
|
|
43
44
|
super();
|
|
44
45
|
this.url = url;
|
|
45
46
|
__publicField(this, "sessionToken");
|
|
46
|
-
__publicField(this, "socket");
|
|
47
47
|
__publicField(this, "transport");
|
|
48
|
-
if (sessionToken)
|
|
48
|
+
if (sessionToken) {
|
|
49
|
+
this.sessionToken = sessionToken;
|
|
50
|
+
this.openSocket(url, sessionToken);
|
|
51
|
+
}
|
|
49
52
|
this.transport = new coreTypes.HttpTransport(url, sessionToken);
|
|
50
|
-
this.socket = this.openSocket(url);
|
|
51
|
-
this.socket.toJSON = () => ({});
|
|
52
53
|
window.addEventListener("message", async (event) => {
|
|
53
54
|
if (!coreTypes.isSpliceMessageEvent(event)) return;
|
|
54
55
|
if (event.data.type === coreTypes.WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS) {
|
|
55
56
|
this.sessionToken = event.data.token;
|
|
56
57
|
this.transport = new coreTypes.HttpTransport(url, this.sessionToken);
|
|
57
|
-
|
|
58
|
-
`SpliceProviderHttp: setting sessionToken to ${this.sessionToken}`
|
|
59
|
-
);
|
|
60
|
-
this.openSocket(this.url);
|
|
58
|
+
this.openSocket(this.url, event.data.token);
|
|
61
59
|
this.request({ method: "status" }).then((status) => {
|
|
62
|
-
this.emit("onConnected",
|
|
63
|
-
status,
|
|
64
|
-
sessionToken: this.sessionToken
|
|
65
|
-
});
|
|
60
|
+
this.emit("onConnected", status);
|
|
66
61
|
}).catch((err) => {
|
|
67
62
|
console.error(
|
|
68
63
|
"Error requesting status after auth:",
|
|
@@ -72,23 +67,26 @@ var SpliceProviderHttp = class extends SpliceProviderBase {
|
|
|
72
67
|
}
|
|
73
68
|
});
|
|
74
69
|
}
|
|
75
|
-
openSocket(url) {
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
70
|
+
openSocket(url, token) {
|
|
71
|
+
const socketUri = url.origin;
|
|
72
|
+
if (connection && (token !== connection.token || socketUri !== connection.url)) {
|
|
73
|
+
connection.socket.disconnect();
|
|
74
|
+
connection = null;
|
|
75
|
+
}
|
|
76
|
+
if (!connection) {
|
|
77
|
+
connection = {
|
|
78
|
+
token,
|
|
79
|
+
url: socketUri,
|
|
80
|
+
socket: socket_ioClient.io(socketUri, {
|
|
81
|
+
auth: {
|
|
82
|
+
token: `Bearer ${token}`
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
};
|
|
86
|
+
connection.socket.onAny((event, ...args) => {
|
|
87
|
+
this.emit(event, ...args);
|
|
88
|
+
});
|
|
81
89
|
}
|
|
82
|
-
const socket = socket_ioClient.io(socketUrl.href, {
|
|
83
|
-
forceNew: true,
|
|
84
|
-
auth: this.sessionToken ? {
|
|
85
|
-
token: `Bearer ${this.sessionToken}`
|
|
86
|
-
} : {}
|
|
87
|
-
});
|
|
88
|
-
socket.onAny((event, ...args) => {
|
|
89
|
-
this.emit(event, ...args);
|
|
90
|
-
});
|
|
91
|
-
return socket;
|
|
92
90
|
}
|
|
93
91
|
async request({ method, params }) {
|
|
94
92
|
const response = await this.transport.submit({ method, params });
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +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: this.sessionToken\n ? {\n token: `Bearer ${this.sessionToken}`,\n }\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 // Prevent serialization of the socket\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(this.socket as any).toJSON = () => ({})\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 this.emit('onConnected', {\n status: status,\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"]}
|
|
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\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 transport: HttpTransport\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.transport = new HttpTransport(url, 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.transport = new HttpTransport(url, 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 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 | 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.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,MAAM,CAAC,EAAE,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,CAAA;KACtC;CACJ;AAED,oBAAY,YAAY;IACpB,MAAM,IAAA;IACN,IAAI,IAAA;CACP;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc,CAS7E;AAED,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -36,31 +36,26 @@ var SpliceProviderBase = class {
|
|
|
36
36
|
return this;
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
|
+
var connection = null;
|
|
39
40
|
var SpliceProviderHttp = class extends SpliceProviderBase {
|
|
40
41
|
constructor(url, sessionToken) {
|
|
41
42
|
super();
|
|
42
43
|
this.url = url;
|
|
43
44
|
__publicField(this, "sessionToken");
|
|
44
|
-
__publicField(this, "socket");
|
|
45
45
|
__publicField(this, "transport");
|
|
46
|
-
if (sessionToken)
|
|
46
|
+
if (sessionToken) {
|
|
47
|
+
this.sessionToken = sessionToken;
|
|
48
|
+
this.openSocket(url, sessionToken);
|
|
49
|
+
}
|
|
47
50
|
this.transport = new HttpTransport(url, sessionToken);
|
|
48
|
-
this.socket = this.openSocket(url);
|
|
49
|
-
this.socket.toJSON = () => ({});
|
|
50
51
|
window.addEventListener("message", async (event) => {
|
|
51
52
|
if (!isSpliceMessageEvent(event)) return;
|
|
52
53
|
if (event.data.type === WalletEvent.SPLICE_WALLET_IDP_AUTH_SUCCESS) {
|
|
53
54
|
this.sessionToken = event.data.token;
|
|
54
55
|
this.transport = new HttpTransport(url, this.sessionToken);
|
|
55
|
-
|
|
56
|
-
`SpliceProviderHttp: setting sessionToken to ${this.sessionToken}`
|
|
57
|
-
);
|
|
58
|
-
this.openSocket(this.url);
|
|
56
|
+
this.openSocket(this.url, event.data.token);
|
|
59
57
|
this.request({ method: "status" }).then((status) => {
|
|
60
|
-
this.emit("onConnected",
|
|
61
|
-
status,
|
|
62
|
-
sessionToken: this.sessionToken
|
|
63
|
-
});
|
|
58
|
+
this.emit("onConnected", status);
|
|
64
59
|
}).catch((err) => {
|
|
65
60
|
console.error(
|
|
66
61
|
"Error requesting status after auth:",
|
|
@@ -70,23 +65,26 @@ var SpliceProviderHttp = class extends SpliceProviderBase {
|
|
|
70
65
|
}
|
|
71
66
|
});
|
|
72
67
|
}
|
|
73
|
-
openSocket(url) {
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
68
|
+
openSocket(url, token) {
|
|
69
|
+
const socketUri = url.origin;
|
|
70
|
+
if (connection && (token !== connection.token || socketUri !== connection.url)) {
|
|
71
|
+
connection.socket.disconnect();
|
|
72
|
+
connection = null;
|
|
73
|
+
}
|
|
74
|
+
if (!connection) {
|
|
75
|
+
connection = {
|
|
76
|
+
token,
|
|
77
|
+
url: socketUri,
|
|
78
|
+
socket: io(socketUri, {
|
|
79
|
+
auth: {
|
|
80
|
+
token: `Bearer ${token}`
|
|
81
|
+
}
|
|
82
|
+
})
|
|
83
|
+
};
|
|
84
|
+
connection.socket.onAny((event, ...args) => {
|
|
85
|
+
this.emit(event, ...args);
|
|
86
|
+
});
|
|
79
87
|
}
|
|
80
|
-
const socket = io(socketUrl.href, {
|
|
81
|
-
forceNew: true,
|
|
82
|
-
auth: this.sessionToken ? {
|
|
83
|
-
token: `Bearer ${this.sessionToken}`
|
|
84
|
-
} : {}
|
|
85
|
-
});
|
|
86
|
-
socket.onAny((event, ...args) => {
|
|
87
|
-
this.emit(event, ...args);
|
|
88
|
-
});
|
|
89
|
-
return socket;
|
|
90
88
|
}
|
|
91
89
|
async request({ method, params }) {
|
|
92
90
|
const response = await this.transport.submit({ 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":["ProviderType"],"mappings":"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","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: this.sessionToken\n ? {\n token: `Bearer ${this.sessionToken}`,\n }\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 // Prevent serialization of the socket\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(this.socket as any).toJSON = () => ({})\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 this.emit('onConnected', {\n status: status,\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/SpliceProvider.ts","../src/SpliceProviderHttp.ts","../src/SpliceProviderWindow.ts","../src/index.ts"],"names":["ProviderType"],"mappings":"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","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\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 transport: HttpTransport\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.transport = new HttpTransport(url, 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.transport = new HttpTransport(url, 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 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 | 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.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A JavaScript Splice Provider API (EIP-1193 compliant).",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"typescript": "^5.9.3"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@canton-network/core-types": "^0.13.
|
|
32
|
-
"@canton-network/core-wallet-ui-components": "^0.
|
|
31
|
+
"@canton-network/core-types": "^0.13.4",
|
|
32
|
+
"@canton-network/core-wallet-ui-components": "^0.16.0",
|
|
33
33
|
"socket.io-client": "^4.8.1"
|
|
34
34
|
},
|
|
35
35
|
"files": [
|