@canton-network/wallet-gateway-remote 0.9.2 → 0.11.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/README.md +1 -1
- package/dist/config/Config.test.js +3 -3
- package/dist/dapp-api/controller.d.ts +1 -1
- package/dist/dapp-api/controller.d.ts.map +1 -1
- package/dist/dapp-api/controller.js +39 -19
- package/dist/dapp-api/rpc-gen/typings.d.ts +68 -25
- package/dist/dapp-api/rpc-gen/typings.d.ts.map +1 -1
- package/dist/dapp-api/server.d.ts.map +1 -1
- package/dist/dapp-api/server.js +36 -33
- package/dist/dapp-api/server.test.js +10 -18
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +7 -23
- package/dist/ledger/party-allocation-service.d.ts +7 -0
- package/dist/ledger/party-allocation-service.d.ts.map +1 -1
- package/dist/ledger/party-allocation-service.js +37 -1
- package/dist/ledger/party-allocation-service.test.js +3 -1
- package/dist/ledger/wallet-sync-service.d.ts +11 -1
- package/dist/ledger/wallet-sync-service.d.ts.map +1 -1
- package/dist/ledger/wallet-sync-service.js +121 -10
- package/dist/ledger/wallet-sync-service.test.d.ts +2 -0
- package/dist/ledger/wallet-sync-service.test.d.ts.map +1 -0
- package/dist/ledger/wallet-sync-service.test.js +163 -0
- package/dist/middleware/jsonRpcHandler.d.ts.map +1 -1
- package/dist/middleware/jsonRpcHandler.js +8 -0
- package/dist/middleware/sessionHandler.d.ts +13 -0
- package/dist/middleware/sessionHandler.d.ts.map +1 -0
- package/dist/middleware/sessionHandler.js +37 -0
- package/dist/notification/NotificationService.d.ts +8 -1
- package/dist/notification/NotificationService.d.ts.map +1 -1
- package/dist/notification/NotificationService.js +22 -1
- package/dist/user-api/controller.d.ts.map +1 -1
- package/dist/user-api/controller.js +40 -9
- package/dist/user-api/rpc-gen/typings.d.ts +10 -0
- package/dist/user-api/rpc-gen/typings.d.ts.map +1 -1
- package/dist/user-api/server.test.js +5 -9
- package/dist/web/frontend/404/index.html +2 -2
- package/dist/web/frontend/approve/index.html +3 -3
- package/dist/web/frontend/assets/{404-Dget2-k2.js → 404-m2H-YHg-.js} +1 -1
- package/dist/web/frontend/assets/{approve-ChuS996j.js → approve-D-yQkaxd.js} +13 -11
- package/dist/web/frontend/assets/callback-Da6RLMl5.js +1 -0
- package/dist/web/frontend/assets/index-DWw9PrWk.js +1011 -0
- package/dist/web/frontend/assets/login-DeTFkeYw.js +186 -0
- package/dist/web/frontend/assets/{settings-DTCtvDW7.js → settings-DdQ6zt_Y.js} +1 -1
- package/dist/web/frontend/assets/{state-Ck_F88ae.js → state-Wv0NKnXW.js} +1 -1
- package/dist/web/frontend/assets/{wallets-DcuGVzJf.js → wallets-ySaBy7V_.js} +1 -1
- package/dist/web/frontend/callback/index.html +2 -2
- package/dist/web/frontend/index.html +1 -1
- package/dist/web/frontend/login/index.html +3 -3
- package/dist/web/frontend/settings/index.html +3 -3
- package/dist/web/frontend/wallets/index.html +3 -3
- package/package.json +17 -17
- package/dist/web/frontend/assets/callback-2I6lJV7y.js +0 -1
- package/dist/web/frontend/assets/index-DyLgNi-5.js +0 -1011
- package/dist/web/frontend/assets/login-DvWCqhsk.js +0 -186
package/README.md
CHANGED
|
@@ -50,4 +50,4 @@ The JSON-RPC API specs from `api-specs/` are generated into strongly-typed metho
|
|
|
50
50
|
|
|
51
51
|
2. Place the `fireblocks_secret.key` file at the path `/splice-wallet-kernel/wallet-gateway/remote`
|
|
52
52
|
|
|
53
|
-
3. Create a file named `fireblocks_api.key` at the path `/splice-wallet-kernel/wallet-gateway/remote` and insert your Fireblocks API key into it
|
|
53
|
+
3. Create a file named `fireblocks_api.key` at the path `/splice-wallet-kernel/wallet-gateway/remote` and insert your Fireblocks API key into it (get it from `API User (ID)` column in fireblocks api users table). Make sure file doesn't end with new line character.
|
|
@@ -9,8 +9,8 @@ test('config from json file', async () => {
|
|
|
9
9
|
expect(resp.store.networks[0].auth.clientId).toBe('operator');
|
|
10
10
|
expect(resp.store.networks[0].auth.scope).toBe('openid daml_ledger_api offline_access');
|
|
11
11
|
expect(resp.store.networks[0].auth.method).toBe('authorization_code');
|
|
12
|
-
expect(resp.store.networks[
|
|
13
|
-
if (resp.store.networks[
|
|
14
|
-
expect(resp.store.networks[
|
|
12
|
+
expect(resp.store.networks[2].auth.method).toBe('client_credentials');
|
|
13
|
+
if (resp.store.networks[2].auth.method === 'client_credentials') {
|
|
14
|
+
expect(resp.store.networks[2].auth.audience).toBe('https://daml.com/jwt/aud/participant/participant1::1220d44fc1c3ba0b5bdf7b956ee71bc94ebe2d23258dc268fdf0824fbaeff2c61424');
|
|
15
15
|
}
|
|
16
16
|
});
|
|
@@ -3,7 +3,7 @@ import { Store } from '@canton-network/core-wallet-store';
|
|
|
3
3
|
import { NotificationService } from '../notification/NotificationService.js';
|
|
4
4
|
import { KernelInfo as KernelInfoConfig } from '../config/Config.js';
|
|
5
5
|
import { Logger } from 'pino';
|
|
6
|
-
export declare const dappController: (kernelInfo: KernelInfoConfig, dappUrl: string, userUrl: string, store: Store, notificationService: NotificationService, _logger: Logger, context?: AuthContext) => {
|
|
6
|
+
export declare const dappController: (kernelInfo: KernelInfoConfig, dappUrl: string, userUrl: string, store: Store, notificationService: NotificationService, _logger: Logger, origin: string | null, context?: AuthContext) => {
|
|
7
7
|
status: import("./rpc-gen/typings.js").Status;
|
|
8
8
|
connect: import("./rpc-gen/typings.js").Connect;
|
|
9
9
|
disconnect: import("./rpc-gen/typings.js").Disconnect;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/dapp-api/controller.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,WAAW,EAAE,MAAM,kCAAkC,CAAA;
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/dapp-api/controller.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAS/E,OAAO,EAAE,KAAK,EAAe,MAAM,mCAAmC,CAAA;AAQtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAC5E,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAG7B,eAAO,MAAM,cAAc,GACvB,YAAY,gBAAgB,EAC5B,SAAS,MAAM,EACf,SAAS,MAAM,EACf,OAAO,KAAK,EACZ,qBAAqB,mBAAmB,EACxC,SAAS,MAAM,EACf,QAAQ,MAAM,GAAG,IAAI,EACrB,UAAU,WAAW;;;;;;;;;;;;;CAuOxB,CAAA"}
|
|
@@ -6,22 +6,20 @@ import buildController from './rpc-gen/index.js';
|
|
|
6
6
|
import { LedgerClient, } from '@canton-network/core-ledger-client';
|
|
7
7
|
import { v4 } from 'uuid';
|
|
8
8
|
import { networkStatus, ledgerPrepareParams } from '../utils.js';
|
|
9
|
-
export const dappController = (kernelInfo, dappUrl, userUrl, store, notificationService, _logger, context) => {
|
|
9
|
+
export const dappController = (kernelInfo, dappUrl, userUrl, store, notificationService, _logger, origin, context) => {
|
|
10
10
|
const logger = _logger.child({ component: 'dapp-controller' });
|
|
11
11
|
return buildController({
|
|
12
12
|
connect: async () => {
|
|
13
13
|
if (!context || !(await store.getSession())) {
|
|
14
14
|
return {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
networkReason: 'Unauthenticated',
|
|
21
|
-
userUrl: `${userUrl}/login/`,
|
|
22
|
-
},
|
|
15
|
+
kernel: kernelInfo,
|
|
16
|
+
isConnected: false,
|
|
17
|
+
isNetworkConnected: false,
|
|
18
|
+
networkReason: 'Unauthenticated',
|
|
19
|
+
userUrl: `${userUrl}/login/`,
|
|
23
20
|
};
|
|
24
21
|
}
|
|
22
|
+
const session = await store.getSession();
|
|
25
23
|
const network = await store.getCurrentNetwork();
|
|
26
24
|
const ledgerClient = new LedgerClient({
|
|
27
25
|
baseUrl: new URL(network.ledgerApi.baseUrl),
|
|
@@ -31,14 +29,22 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
|
|
|
31
29
|
});
|
|
32
30
|
const status = await networkStatus(ledgerClient);
|
|
33
31
|
return {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
kernel: kernelInfo,
|
|
33
|
+
isConnected: true,
|
|
34
|
+
isNetworkConnected: status.isConnected,
|
|
35
|
+
networkReason: status.reason ? status.reason : 'OK',
|
|
36
|
+
network: {
|
|
37
|
+
networkId: network.id,
|
|
38
|
+
ledgerApi: {
|
|
39
|
+
baseUrl: network.ledgerApi.baseUrl,
|
|
40
|
+
},
|
|
41
41
|
},
|
|
42
|
+
session: {
|
|
43
|
+
id: session?.id,
|
|
44
|
+
accessToken: context.accessToken,
|
|
45
|
+
userId: context.userId,
|
|
46
|
+
},
|
|
47
|
+
userUrl: `${userUrl}/login/`,
|
|
42
48
|
};
|
|
43
49
|
},
|
|
44
50
|
disconnect: async () => {
|
|
@@ -107,14 +113,16 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
|
|
|
107
113
|
const synchronizerId = network.synchronizerId ??
|
|
108
114
|
(await ledgerClient.getSynchronizerId());
|
|
109
115
|
const { preparedTransactionHash, preparedTransaction = '' } = await prepareSubmission(context.userId, wallet.partyId, synchronizerId, params, ledgerClient);
|
|
110
|
-
|
|
116
|
+
const transaction = {
|
|
111
117
|
commandId,
|
|
112
118
|
status: 'pending',
|
|
113
119
|
preparedTransaction,
|
|
114
120
|
preparedTransactionHash,
|
|
115
121
|
payload: params,
|
|
122
|
+
origin: origin || null,
|
|
116
123
|
createdAt: new Date(),
|
|
117
|
-
}
|
|
124
|
+
};
|
|
125
|
+
store.setTransaction(transaction);
|
|
118
126
|
return {
|
|
119
127
|
userUrl: `${userUrl}/approve/index.html?commandId=${commandId}`,
|
|
120
128
|
};
|
|
@@ -145,6 +153,7 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
|
|
|
145
153
|
networkReason: 'Unauthenticated',
|
|
146
154
|
};
|
|
147
155
|
}
|
|
156
|
+
const session = await store.getSession();
|
|
148
157
|
const network = await store.getCurrentNetwork();
|
|
149
158
|
const ledgerClient = new LedgerClient({
|
|
150
159
|
baseUrl: new URL(network.ledgerApi.baseUrl),
|
|
@@ -158,7 +167,18 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
|
|
|
158
167
|
isConnected: true,
|
|
159
168
|
isNetworkConnected: status.isConnected,
|
|
160
169
|
networkReason: status.reason ? status.reason : 'OK',
|
|
161
|
-
|
|
170
|
+
network: {
|
|
171
|
+
networkId: network.id,
|
|
172
|
+
ledgerApi: {
|
|
173
|
+
baseUrl: network.ledgerApi.baseUrl,
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
session: {
|
|
177
|
+
id: session?.id,
|
|
178
|
+
accessToken: context.accessToken,
|
|
179
|
+
userId: context.userId,
|
|
180
|
+
},
|
|
181
|
+
userUrl: `${userUrl}/login/`,
|
|
162
182
|
};
|
|
163
183
|
},
|
|
164
184
|
onConnected: async () => {
|
|
@@ -100,6 +100,12 @@ export type ClientType = 'browser' | 'desktop' | 'mobile' | 'remote';
|
|
|
100
100
|
*
|
|
101
101
|
*/
|
|
102
102
|
export type Url = string;
|
|
103
|
+
/**
|
|
104
|
+
*
|
|
105
|
+
* A URL that points to a user interface.
|
|
106
|
+
*
|
|
107
|
+
*/
|
|
108
|
+
export type UserUrl = string;
|
|
103
109
|
/**
|
|
104
110
|
*
|
|
105
111
|
* Represents a Wallet Gateway.
|
|
@@ -109,6 +115,7 @@ export interface KernelInfo {
|
|
|
109
115
|
id: Id;
|
|
110
116
|
clientType: ClientType;
|
|
111
117
|
url?: Url;
|
|
118
|
+
userUrl?: UserUrl;
|
|
112
119
|
[k: string]: any;
|
|
113
120
|
}
|
|
114
121
|
/**
|
|
@@ -135,20 +142,66 @@ export type NetworkReason = string;
|
|
|
135
142
|
*
|
|
136
143
|
*/
|
|
137
144
|
export type NetworkId = string;
|
|
145
|
+
/**
|
|
146
|
+
*
|
|
147
|
+
* The base URL of the ledger API.
|
|
148
|
+
*
|
|
149
|
+
*/
|
|
150
|
+
export type BaseUrl = string;
|
|
151
|
+
/**
|
|
152
|
+
*
|
|
153
|
+
* Ledger API configuration.
|
|
154
|
+
*
|
|
155
|
+
*/
|
|
156
|
+
export interface LedgerApiConfig {
|
|
157
|
+
baseUrl: BaseUrl;
|
|
158
|
+
[k: string]: any;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
*
|
|
162
|
+
* Network information, if connected to a network.
|
|
163
|
+
*
|
|
164
|
+
*/
|
|
165
|
+
export interface Network {
|
|
166
|
+
networkId: NetworkId;
|
|
167
|
+
ledgerApi?: LedgerApiConfig;
|
|
168
|
+
[k: string]: any;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
*
|
|
172
|
+
* JWT authentication token.
|
|
173
|
+
*
|
|
174
|
+
*/
|
|
175
|
+
export type AccessToken = string;
|
|
176
|
+
/**
|
|
177
|
+
*
|
|
178
|
+
* The user identifier.
|
|
179
|
+
*
|
|
180
|
+
*/
|
|
181
|
+
export type UserId = string;
|
|
182
|
+
/**
|
|
183
|
+
*
|
|
184
|
+
* Session information, if authenticated.
|
|
185
|
+
*
|
|
186
|
+
*/
|
|
187
|
+
export interface Session {
|
|
188
|
+
accessToken: AccessToken;
|
|
189
|
+
userId: UserId;
|
|
190
|
+
[k: string]: any;
|
|
191
|
+
}
|
|
138
192
|
export interface StatusEvent {
|
|
139
193
|
kernel: KernelInfo;
|
|
140
194
|
isConnected: IsConnected;
|
|
141
195
|
isNetworkConnected: IsNetworkConnected;
|
|
142
196
|
networkReason?: NetworkReason;
|
|
143
|
-
|
|
197
|
+
network?: Network;
|
|
198
|
+
session?: Session;
|
|
199
|
+
[k: string]: any;
|
|
200
|
+
}
|
|
201
|
+
export interface ObjectOfUserUrlMkZ1IR2Z {
|
|
202
|
+
userUrl: UserUrl;
|
|
144
203
|
[k: string]: any;
|
|
145
204
|
}
|
|
146
|
-
/**
|
|
147
|
-
*
|
|
148
|
-
* JWT authentication token (if applicable).
|
|
149
|
-
*
|
|
150
|
-
*/
|
|
151
|
-
export type SessionToken = string;
|
|
152
205
|
export type Dar = string;
|
|
153
206
|
export type Dars = Dar[];
|
|
154
207
|
/**
|
|
@@ -173,12 +226,6 @@ export interface JsPrepareSubmissionResponse {
|
|
|
173
226
|
preparedTransactionHash?: PreparedTransactionHash;
|
|
174
227
|
[k: string]: any;
|
|
175
228
|
}
|
|
176
|
-
/**
|
|
177
|
-
*
|
|
178
|
-
* A URL that points to a user interface.
|
|
179
|
-
*
|
|
180
|
-
*/
|
|
181
|
-
export type UserUrl = string;
|
|
182
229
|
export type Response = string;
|
|
183
230
|
/**
|
|
184
231
|
*
|
|
@@ -382,17 +429,18 @@ export interface PrepareExecuteParams {
|
|
|
382
429
|
packageIdSelectionPreference?: PackageIdSelectionPreference;
|
|
383
430
|
[k: string]: any;
|
|
384
431
|
}
|
|
432
|
+
/**
|
|
433
|
+
*
|
|
434
|
+
* Ledger API request structure
|
|
435
|
+
*
|
|
436
|
+
*/
|
|
385
437
|
export interface LedgerApiParams {
|
|
386
438
|
requestMethod: RequestMethod;
|
|
387
439
|
resource: Resource;
|
|
388
440
|
body?: Body;
|
|
389
441
|
[k: string]: any;
|
|
390
442
|
}
|
|
391
|
-
export
|
|
392
|
-
status: StatusEvent;
|
|
393
|
-
sessionToken: SessionToken;
|
|
394
|
-
[k: string]: any;
|
|
395
|
-
}
|
|
443
|
+
export type StatusEventAsync = StatusEvent & ObjectOfUserUrlMkZ1IR2Z;
|
|
396
444
|
/**
|
|
397
445
|
*
|
|
398
446
|
* Represents a null value, used in responses where no data is returned.
|
|
@@ -417,11 +465,6 @@ export interface LedgerApiResult {
|
|
|
417
465
|
response: Response;
|
|
418
466
|
[k: string]: any;
|
|
419
467
|
}
|
|
420
|
-
export interface OnConnectedEvent {
|
|
421
|
-
status: StatusEvent;
|
|
422
|
-
sessionToken?: SessionToken;
|
|
423
|
-
[k: string]: any;
|
|
424
|
-
}
|
|
425
468
|
/**
|
|
426
469
|
*
|
|
427
470
|
* Event emitted when the user's accounts change.
|
|
@@ -446,13 +489,13 @@ export type TxChangedEvent = TxChangedPendingEvent | TxChangedSignedEvent | TxCh
|
|
|
446
489
|
*
|
|
447
490
|
*/
|
|
448
491
|
export type Status = () => Promise<StatusEvent>;
|
|
449
|
-
export type Connect = () => Promise<
|
|
492
|
+
export type Connect = () => Promise<StatusEventAsync>;
|
|
450
493
|
export type Disconnect = () => Promise<Null>;
|
|
451
494
|
export type DarsAvailable = () => Promise<DarsAvailableResult>;
|
|
452
495
|
export type PrepareReturn = (params: PrepareReturnParams) => Promise<PrepareReturnResult>;
|
|
453
496
|
export type PrepareExecute = (params: PrepareExecuteParams) => Promise<PrepareExecuteResult>;
|
|
454
497
|
export type LedgerApi = (params: LedgerApiParams) => Promise<LedgerApiResult>;
|
|
455
|
-
export type OnConnected = () => Promise<
|
|
498
|
+
export type OnConnected = () => Promise<StatusEvent>;
|
|
456
499
|
export type OnStatusChanged = () => Promise<StatusEvent>;
|
|
457
500
|
export type OnAccountsChanged = () => Promise<AccountsChangedEvent>;
|
|
458
501
|
export type RequestAccounts = () => Promise<RequestAccountsResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/typings.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAC9B;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACrB;AACD;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAA;AAC1B;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,KAAK,EAAE,CAAA;AAC3B;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,KAAK,EAAE,CAAA;AAC5B;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA;AAC/B;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA;AAC/B;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAA;AACrC;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAA;AACnC;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AACD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,EAAE,CAAA;AACpD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAC9B;;;;GAIG;AACH,MAAM,MAAM,4BAA4B,GAAG,SAAS,EAAE,CAAA;AACtD,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;AAC7D,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAA;AAC7B,MAAM,MAAM,IAAI,GAAG,MAAM,CAAA;AACzB;;;;GAIG;AACH,MAAM,MAAM,EAAE,GAAG,MAAM,CAAA;AACvB;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AACpE;;;;GAIG;AACH,MAAM,MAAM,GAAG,GAAG,MAAM,CAAA;AACxB;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,EAAE,CAAA;IACN,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AACD;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAA;AACjC;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAA;AACxC;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAClC;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAC9B,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,UAAU,CAAA;IAClB,WAAW,EAAE,WAAW,CAAA;IACxB,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,
|
|
1
|
+
{"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/typings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dapp-api/server.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,MAAM,SAAS,CAAA;AAG7B,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAG7B,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,OAAO,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dapp-api/server.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,MAAM,SAAS,CAAA;AAG7B,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAG7B,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAE9D,eAAO,MAAM,IAAI,GACb,OAAO,MAAM,EACb,KAAK,OAAO,CAAC,OAAO,EACpB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,YAAY,UAAU,EACtB,SAAS,MAAM,EACf,SAAS,MAAM,EACf,cAAc,YAAY,EAC1B,qBAAqB,mBAAmB,EACxC,aAAa,WAAW,EACxB,OAAO,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,wFAsFlC,CAAA"}
|
package/dist/dapp-api/server.js
CHANGED
|
@@ -8,53 +8,56 @@ export const dapp = (route, app, logger, server, kernelInfo, dappUrl, userUrl, s
|
|
|
8
8
|
app.use(cors({
|
|
9
9
|
origin: serverConfig.allowedOrigins,
|
|
10
10
|
}));
|
|
11
|
-
app.use(route, (req, res, next) =>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
app.use(route, (req, res, next) => {
|
|
12
|
+
const origin = req.headers.origin ?? null;
|
|
13
|
+
jsonRpcHandler({
|
|
14
|
+
controller: dappController(kernelInfo, dappUrl, userUrl, store.withAuthContext(req.authContext), notificationService, logger, origin, req.authContext),
|
|
15
|
+
logger,
|
|
16
|
+
})(req, res, next);
|
|
17
|
+
});
|
|
15
18
|
const io = new SocketIoServer(server, {
|
|
16
19
|
cors: {
|
|
17
20
|
origin: serverConfig.allowedOrigins,
|
|
18
21
|
methods: ['GET', 'POST'],
|
|
19
22
|
},
|
|
20
23
|
});
|
|
21
|
-
io.on('connection', (socket) => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
24
|
+
io.on('connection', async (socket) => {
|
|
25
|
+
let sessionId = undefined;
|
|
26
|
+
const context = await authService.verifyToken(socket.handshake.auth.token);
|
|
27
|
+
if (context !== undefined) {
|
|
28
|
+
const newStore = store.withAuthContext(context);
|
|
29
|
+
const session = await newStore.getSession();
|
|
30
|
+
sessionId = session?.id;
|
|
31
|
+
}
|
|
32
|
+
if (context && sessionId) {
|
|
33
|
+
socket.join(sessionId);
|
|
34
|
+
logger.debug(`Socket.io connected for user: ${context.userId} with session ID: ${sessionId}`);
|
|
35
|
+
const notifier = notificationService.getNotifier(context.userId);
|
|
36
|
+
const onAccountsChanged = (...event) => {
|
|
37
|
+
io.to(sessionId).emit('accountsChanged', ...event);
|
|
38
|
+
};
|
|
39
|
+
const onStatusChanged = (...event) => {
|
|
40
|
+
logger.debug({ sessionId }, 'Emitting statusChanged event via Socket.io');
|
|
41
|
+
io.to(sessionId).emit('statusChanged', ...event);
|
|
42
|
+
};
|
|
43
|
+
const onConnected = (...event) => {
|
|
44
|
+
io.to(sessionId).emit('onConnected', ...event);
|
|
45
|
+
};
|
|
46
|
+
const onTxChanged = (...event) => {
|
|
47
|
+
io.to(sessionId).emit('txChanged', ...event);
|
|
48
|
+
};
|
|
44
49
|
notifier.on('accountsChanged', onAccountsChanged);
|
|
45
50
|
notifier.on('onConnected', onConnected);
|
|
46
51
|
notifier.on('statusChanged', onStatusChanged);
|
|
47
52
|
notifier.on('txChanged', onTxChanged);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
logger.info('Socket.io client disconnected');
|
|
51
|
-
if (notifier) {
|
|
53
|
+
socket.on('disconnect', () => {
|
|
54
|
+
logger.debug('Socket.io client disconnected');
|
|
52
55
|
notifier.removeListener('accountsChanged', onAccountsChanged);
|
|
53
56
|
notifier.removeListener('onConnected', onConnected);
|
|
54
57
|
notifier.removeListener('statusChanged', onStatusChanged);
|
|
55
58
|
notifier.removeListener('txChanged', onTxChanged);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
58
61
|
});
|
|
59
62
|
return server;
|
|
60
63
|
};
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { expect, test
|
|
3
|
+
import { expect, test } from '@jest/globals';
|
|
4
4
|
import cors from 'cors';
|
|
5
5
|
import request from 'supertest';
|
|
6
6
|
import express from 'express';
|
|
7
7
|
import { dapp } from './server.js';
|
|
8
8
|
import { StoreInternal } from '@canton-network/core-wallet-store-inmemory';
|
|
9
9
|
import { ConfigUtils, deriveKernelUrls } from '../config/ConfigUtils.js';
|
|
10
|
+
import { NotificationService } from '../notification/NotificationService.js';
|
|
10
11
|
import { pino } from 'pino';
|
|
11
12
|
import { sink } from 'pino-test';
|
|
12
13
|
import { createServer } from 'http';
|
|
@@ -18,13 +19,7 @@ const authService = {
|
|
|
18
19
|
const configPath = '../test/config.json';
|
|
19
20
|
const config = ConfigUtils.loadConfigFile(configPath);
|
|
20
21
|
const store = new StoreInternal(config.store, pino(sink()));
|
|
21
|
-
const notificationService =
|
|
22
|
-
getNotifier: jest.fn().mockReturnValue({
|
|
23
|
-
on: jest.fn(),
|
|
24
|
-
emit: jest.fn(),
|
|
25
|
-
removeListener: jest.fn(),
|
|
26
|
-
}),
|
|
27
|
-
};
|
|
22
|
+
const notificationService = new NotificationService(pino(sink()));
|
|
28
23
|
test('call connect rpc', async () => {
|
|
29
24
|
const app = express();
|
|
30
25
|
app.use(cors());
|
|
@@ -40,17 +35,14 @@ test('call connect rpc', async () => {
|
|
|
40
35
|
id: 0,
|
|
41
36
|
jsonrpc: '2.0',
|
|
42
37
|
result: {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
id: 'remote-da',
|
|
47
|
-
clientType: 'remote',
|
|
48
|
-
},
|
|
49
|
-
isConnected: false,
|
|
50
|
-
isNetworkConnected: false,
|
|
51
|
-
networkReason: 'Unauthenticated',
|
|
52
|
-
userUrl: 'http://localhost:3030/login/',
|
|
38
|
+
kernel: {
|
|
39
|
+
id: 'remote-da',
|
|
40
|
+
clientType: 'remote',
|
|
53
41
|
},
|
|
42
|
+
isConnected: false,
|
|
43
|
+
isNetworkConnected: false,
|
|
44
|
+
networkReason: 'Unauthenticated',
|
|
45
|
+
userUrl: 'http://localhost:3030/login/',
|
|
54
46
|
},
|
|
55
47
|
});
|
|
56
48
|
});
|
package/dist/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAoB7B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAmFvC,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAkJhE"}
|
package/dist/init.js
CHANGED
|
@@ -6,7 +6,6 @@ import { web } from './web/server.js';
|
|
|
6
6
|
import { StoreSql, bootstrap, connection, migrator, } from '@canton-network/core-wallet-store-sql';
|
|
7
7
|
import { StoreSql as SigningStoreSql, bootstrap as signingBootstrap, connection as signingConnection, migrator as signingMigrator, } from '@canton-network/core-signing-store-sql';
|
|
8
8
|
import { ConfigUtils } from './config/ConfigUtils.js';
|
|
9
|
-
import EventEmitter from 'events';
|
|
10
9
|
import { SigningProvider } from '@canton-network/core-signing-lib';
|
|
11
10
|
import { ParticipantSigningDriver } from '@canton-network/core-signing-participant';
|
|
12
11
|
import { InternalSigningDriver } from '@canton-network/core-signing-internal';
|
|
@@ -19,28 +18,9 @@ import { deriveKernelUrls } from './config/ConfigUtils.js';
|
|
|
19
18
|
import { existsSync, readFileSync } from 'fs';
|
|
20
19
|
import path from 'path';
|
|
21
20
|
import { GATEWAY_VERSION } from './version.js';
|
|
21
|
+
import { sessionHandler } from './middleware/sessionHandler.js';
|
|
22
|
+
import { NotificationService } from './notification/NotificationService.js';
|
|
22
23
|
let isReady = false;
|
|
23
|
-
class NotificationService {
|
|
24
|
-
constructor(logger) {
|
|
25
|
-
this.logger = logger;
|
|
26
|
-
this.notifiers = new Map();
|
|
27
|
-
}
|
|
28
|
-
getNotifier(notifierId) {
|
|
29
|
-
const logger = this.logger;
|
|
30
|
-
let notifier = this.notifiers.get(notifierId);
|
|
31
|
-
if (!notifier) {
|
|
32
|
-
notifier = new EventEmitter();
|
|
33
|
-
// Wrap all events to log with pino
|
|
34
|
-
const originalEmit = notifier.emit;
|
|
35
|
-
notifier.emit = function (event, ...args) {
|
|
36
|
-
logger.debug({ event, args }, `Notifier emitted event: ${event}`);
|
|
37
|
-
return originalEmit.apply(this, [event, ...args]);
|
|
38
|
-
};
|
|
39
|
-
this.notifiers.set(notifierId, notifier);
|
|
40
|
-
}
|
|
41
|
-
return notifier;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
24
|
async function initializeDatabase(config, logger) {
|
|
45
25
|
logger.info('Checking for database migrations...');
|
|
46
26
|
let exists = true;
|
|
@@ -143,9 +123,13 @@ export async function initialize(opts, logger) {
|
|
|
143
123
|
userApiKeys,
|
|
144
124
|
}),
|
|
145
125
|
};
|
|
126
|
+
const allowedPaths = {
|
|
127
|
+
[config.server.dappPath]: ['*'],
|
|
128
|
+
[config.server.userPath]: ['addSession', 'listNetworks', 'listIdps'],
|
|
129
|
+
};
|
|
146
130
|
app.use('/api/*splat', express.json());
|
|
147
131
|
app.use('/api/*splat', rpcRateLimit);
|
|
148
|
-
app.use('/api/*splat', jwtAuth(authService, logger));
|
|
132
|
+
app.use('/api/*splat', jwtAuth(authService, logger.child({ component: 'JwtHandler' })), sessionHandler(store, allowedPaths, logger.child({ component: 'SessionHandler' })));
|
|
149
133
|
// Override config port with CLI parameter port if provided, then derive URLs
|
|
150
134
|
const serverConfigWithOverride = {
|
|
151
135
|
...config.server,
|
|
@@ -40,6 +40,13 @@ export declare class PartyAllocationService {
|
|
|
40
40
|
* @param publicKey The public key of the user.
|
|
41
41
|
*/
|
|
42
42
|
createFingerprintFromKey(publicKey: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Normalizes a public key to base64 format.
|
|
45
|
+
* Converts hex format (Fireblocks) to base64, or returns base64 as-is.
|
|
46
|
+
* @param publicKey Public key in hex or base64 format
|
|
47
|
+
* @returns Public key in base64 format, or null if conversion fails
|
|
48
|
+
*/
|
|
49
|
+
normalizePublicKeyToBase64(publicKey: string): string | null;
|
|
43
50
|
/**
|
|
44
51
|
* Generate topology transactions
|
|
45
52
|
* @param hint A hint for the party ID.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"party-allocation-service.d.ts","sourceRoot":"","sources":["../../src/ledger/party-allocation-service.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,2BAA2B,EAE9B,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,MAAM,MAAM,cAAc,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAEpD;;GAEG;AACH,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAoB;gBAE9B,EACR,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,MAAM,EACN,WAAW,GACd,EAAE;QACC,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,mBAAmB,EAAE,mBAAmB,CAAA;QACxC,aAAa,EAAE,MAAM,CAAA;QACrB,MAAM,EAAE,MAAM,CAAA;QACd,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB;IAYD;;;;OAIG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAE1E;;;;;;OAMG;IACG,aAAa,CACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,WAAW,GAC7B,OAAO,CAAC,cAAc,CAAC;IAoB1B;;;OAGG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAenD;;;;OAIG;IACG,4BAA4B,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,2BAA2B,CAAC;IAevC;;;;;;OAMG;IACG,+BAA+B,CACjC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;YAgCJ,qBAAqB;
|
|
1
|
+
{"version":3,"file":"party-allocation-service.d.ts","sourceRoot":"","sources":["../../src/ledger/party-allocation-service.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,2BAA2B,EAE9B,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,MAAM,MAAM,cAAc,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAEpD;;GAEG;AACH,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAoB;gBAE9B,EACR,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,MAAM,EACN,WAAW,GACd,EAAE;QACC,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,mBAAmB,EAAE,mBAAmB,CAAA;QACxC,aAAa,EAAE,MAAM,CAAA;QACrB,MAAM,EAAE,MAAM,CAAA;QACd,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB;IAYD;;;;OAIG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAE1E;;;;;;OAMG;IACG,aAAa,CACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,WAAW,GAC7B,OAAO,CAAC,cAAc,CAAC;IAoB1B;;;OAGG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAenD;;;;;OAKG;IACH,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAsB5D;;;;OAIG;IACG,4BAA4B,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,2BAA2B,CAAC;IAevC;;;;;;OAMG;IACG,+BAA+B,CACjC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;YAgCJ,qBAAqB;YAgCrB,qBAAqB;CAsCtC"}
|
|
@@ -37,6 +37,36 @@ export class PartyAllocationService {
|
|
|
37
37
|
const multiprefix = Buffer.from([0x12, 0x20]);
|
|
38
38
|
return Buffer.concat([multiprefix, hash]).toString('hex');
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Normalizes a public key to base64 format.
|
|
42
|
+
* Converts hex format (Fireblocks) to base64, or returns base64 as-is.
|
|
43
|
+
* @param publicKey Public key in hex or base64 format
|
|
44
|
+
* @returns Public key in base64 format, or null if conversion fails
|
|
45
|
+
*/
|
|
46
|
+
normalizePublicKeyToBase64(publicKey) {
|
|
47
|
+
try {
|
|
48
|
+
// Try hex first (Fireblocks format), fallback to base64 (internal format)
|
|
49
|
+
try {
|
|
50
|
+
const hexKey = Buffer.from(publicKey, 'hex');
|
|
51
|
+
// If it's valid hex and produces 32 bytes, convert to base64
|
|
52
|
+
if (hexKey.length === 32) {
|
|
53
|
+
return hexKey.toString('base64');
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Invalid hex length, treat as base64
|
|
57
|
+
return publicKey;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Not valid hex, treat as base64
|
|
62
|
+
return publicKey;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// If any conversion fails, return null
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
40
70
|
async generateTopologyTransactions(hint, publicKey) {
|
|
41
71
|
const synchronizerId = this.synchronizerId ?? (await this.ledgerClient.getSynchronizerId());
|
|
42
72
|
return this.ledgerClient.generateTopology(synchronizerId, publicKey, hint);
|
|
@@ -57,7 +87,13 @@ export class PartyAllocationService {
|
|
|
57
87
|
return res.partyId;
|
|
58
88
|
}
|
|
59
89
|
async allocateInternalParty(userId, hint) {
|
|
60
|
-
const { participantId
|
|
90
|
+
const { participantId } = await this.ledgerClient.getWithRetry('/v2/parties/participant-id');
|
|
91
|
+
// Extract the namespace part from participantId
|
|
92
|
+
// Format is hint::namespace
|
|
93
|
+
const [, namespace] = participantId.split('::');
|
|
94
|
+
if (!namespace) {
|
|
95
|
+
throw new Error(`Invalid participantId format: expected "hint::namespace", got "${participantId}"`);
|
|
96
|
+
}
|
|
61
97
|
const res = await this.ledgerClient.postWithRetry('/v2/parties', {
|
|
62
98
|
partyIdHint: hint,
|
|
63
99
|
identityProviderId: '',
|
|
@@ -77,7 +77,9 @@ describe('PartyAllocationService', () => {
|
|
|
77
77
|
});
|
|
78
78
|
afterEach(() => jest.restoreAllMocks());
|
|
79
79
|
it('allocates an internal party', async () => {
|
|
80
|
-
mockLedgerGet.mockResolvedValueOnce({
|
|
80
|
+
mockLedgerGet.mockResolvedValueOnce({
|
|
81
|
+
participantId: 'participant1::participantid',
|
|
82
|
+
});
|
|
81
83
|
mockLedgerPost.mockResolvedValueOnce({
|
|
82
84
|
partyDetails: { party: 'party1::participantid' },
|
|
83
85
|
});
|