@canton-network/wallet-gateway-remote 0.4.0 → 0.5.1

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.
Files changed (66) hide show
  1. package/README.md +0 -12
  2. package/dist/auth/jwt-auth-service.d.ts +1 -1
  3. package/dist/auth/jwt-auth-service.d.ts.map +1 -1
  4. package/dist/auth/jwt-auth-service.js +11 -1
  5. package/dist/auth/jwt-unsafe-auth-service.d.ts +11 -0
  6. package/dist/auth/jwt-unsafe-auth-service.d.ts.map +1 -0
  7. package/dist/auth/jwt-unsafe-auth-service.js +50 -0
  8. package/dist/config/Config.d.ts +151 -37
  9. package/dist/config/Config.d.ts.map +1 -1
  10. package/dist/dapp-api/controller.d.ts +2 -0
  11. package/dist/dapp-api/controller.d.ts.map +1 -1
  12. package/dist/dapp-api/controller.js +28 -7
  13. package/dist/dapp-api/rpc-gen/index.d.ts +6 -0
  14. package/dist/dapp-api/rpc-gen/index.d.ts.map +1 -1
  15. package/dist/dapp-api/rpc-gen/index.js +2 -0
  16. package/dist/dapp-api/rpc-gen/typings.d.ts +26 -20
  17. package/dist/dapp-api/rpc-gen/typings.d.ts.map +1 -1
  18. package/dist/dapp-api/server.d.ts +2 -1
  19. package/dist/dapp-api/server.d.ts.map +1 -1
  20. package/dist/dapp-api/server.js +8 -3
  21. package/dist/dapp-api/server.test.js +11 -8
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +14 -1
  24. package/dist/init.d.ts +2 -1
  25. package/dist/init.d.ts.map +1 -1
  26. package/dist/init.js +46 -23
  27. package/dist/ledger/party-allocation-service.d.ts +2 -1
  28. package/dist/ledger/party-allocation-service.d.ts.map +1 -1
  29. package/dist/ledger/party-allocation-service.js +4 -4
  30. package/dist/ledger/party-allocation-service.test.js +12 -3
  31. package/dist/ledger/wallet-sync-service.d.ts.map +1 -1
  32. package/dist/ledger/wallet-sync-service.js +2 -2
  33. package/dist/user-api/controller.d.ts.map +1 -1
  34. package/dist/user-api/controller.js +64 -33
  35. package/dist/user-api/rpc-gen/typings.d.ts +22 -12
  36. package/dist/user-api/rpc-gen/typings.d.ts.map +1 -1
  37. package/dist/user-api/server.d.ts +6 -5
  38. package/dist/user-api/server.d.ts.map +1 -1
  39. package/dist/user-api/server.js +2 -4
  40. package/dist/user-api/server.test.js +4 -3
  41. package/dist/web/frontend/404/index.html +3 -6
  42. package/dist/web/frontend/approve/index.html +5 -9
  43. package/dist/web/frontend/assets/{404-FxmR286l.js → 404-C4ltj2Y3.js} +3 -3
  44. package/dist/web/frontend/assets/approve-Drc1zW1z.js +157 -0
  45. package/dist/web/frontend/assets/callback-BBgKxZBh.js +1 -0
  46. package/dist/web/frontend/assets/handle-errors-C_r_-A1k.js +1 -0
  47. package/dist/web/frontend/assets/{index-BknZMPaI.css → index-HEe9--Xd.css} +1 -1
  48. package/dist/web/frontend/assets/{index-VtAAU1cN.js → index-_AVK9fEz.js} +67 -54
  49. package/dist/web/frontend/assets/login-x46HxVRr.js +159 -0
  50. package/dist/web/frontend/assets/{networks-CZV8G3N2.js → networks-DSlcKT60.js} +9 -9
  51. package/dist/web/frontend/assets/{state-DKGJ6EmM.js → state-BahUv9dS.js} +2 -2
  52. package/dist/web/frontend/assets/{wallets-DwPVJP85.js → wallets-BXR4V066.js} +6 -6
  53. package/dist/web/frontend/callback/index.html +3 -3
  54. package/dist/web/frontend/index.html +2 -5
  55. package/dist/web/frontend/login/index.html +5 -8
  56. package/dist/web/frontend/networks/index.html +6 -8
  57. package/dist/web/frontend/wallets/index.html +5 -9
  58. package/package.json +17 -17
  59. package/dist/web/frontend/assets/approve-BHHuvE3i.js +0 -157
  60. package/dist/web/frontend/assets/callback-D9y0DRns.js +0 -1
  61. package/dist/web/frontend/assets/handle-errors-BM-xvD4v.js +0 -1
  62. package/dist/web/frontend/assets/index-BPTkodPz.js +0 -1
  63. package/dist/web/frontend/assets/index-TZrNw7dA.css +0 -1
  64. package/dist/web/frontend/assets/login-DJofeRCg.js +0 -159
  65. package/dist/web/frontend/assets/rpc-client-TGo-LOnR.js +0 -1
  66. package/dist/web/frontend/assets/state-manager-BNW0y5PZ.js +0 -23
@@ -24,14 +24,32 @@ export const dappController = (kernelInfo, store, notificationService, _logger,
24
24
  const logger = _logger.child({ component: 'dapp-controller' });
25
25
  return buildController({
26
26
  connect: async () => ({
27
- kernel: kernelInfo,
28
- isConnected: false,
29
- userUrl: 'http://localhost:3030/login/', // TODO: pull user URL from config
27
+ sessionToken: '',
28
+ status: {
29
+ kernel: kernelInfo,
30
+ isConnected: false,
31
+ userUrl: 'http://localhost:3030/login/', // TODO: pull user URL from config
32
+ },
30
33
  }),
34
+ disconnect: async () => {
35
+ if (!context) {
36
+ return null;
37
+ }
38
+ else {
39
+ const notifier = notificationService.getNotifier(context.userId);
40
+ await store.removeSession();
41
+ notifier.emit('statusChanged', {
42
+ kernel: kernelInfo,
43
+ isConnected: false,
44
+ userUrl: 'http://localhost:3030/login/', // TODO: pull user URL from config
45
+ });
46
+ }
47
+ return null;
48
+ },
31
49
  darsAvailable: async () => ({ dars: ['default-dar'] }),
32
50
  ledgerApi: async (params) => {
33
51
  const network = await store.getCurrentNetwork();
34
- const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), assertConnected(context).accessToken, logger);
52
+ const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), logger, false, assertConnected(context).accessToken);
35
53
  let result;
36
54
  switch (params.requestMethod) {
37
55
  case 'GET':
@@ -58,7 +76,7 @@ export const dappController = (kernelInfo, store, notificationService, _logger,
58
76
  if (wallet === undefined) {
59
77
  throw new Error('No primary wallet found');
60
78
  }
61
- const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), context.accessToken, logger);
79
+ const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), logger, false, context.accessToken);
62
80
  const userId = context.userId;
63
81
  const notifier = notificationService.getNotifier(userId);
64
82
  const commandId = v4();
@@ -85,7 +103,7 @@ export const dappController = (kernelInfo, store, notificationService, _logger,
85
103
  if (wallet === undefined) {
86
104
  throw new Error('No primary wallet found');
87
105
  }
88
- const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), context.accessToken, logger);
106
+ const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), logger, false, context.accessToken);
89
107
  return prepareSubmission(context.userId, wallet.partyId, network.synchronizerId, params.commands, ledgerClient);
90
108
  },
91
109
  status: async () => {
@@ -99,13 +117,16 @@ export const dappController = (kernelInfo, store, notificationService, _logger,
99
117
  return {
100
118
  kernel: kernelInfo,
101
119
  isConnected: true,
102
- chainId: (await store.getCurrentNetwork()).chainId,
120
+ networkId: (await store.getCurrentNetwork()).id,
103
121
  };
104
122
  }
105
123
  },
106
124
  onConnected: async () => {
107
125
  throw new Error('Only for events.');
108
126
  },
127
+ onStatusChanged: async () => {
128
+ throw new Error('Only for events.');
129
+ },
109
130
  onAccountsChanged: async () => {
110
131
  throw new Error('Only for events.');
111
132
  },
@@ -1,21 +1,25 @@
1
1
  import { Status } from './typings.js';
2
2
  import { Connect } from './typings.js';
3
+ import { Disconnect } from './typings.js';
3
4
  import { DarsAvailable } from './typings.js';
4
5
  import { PrepareReturn } from './typings.js';
5
6
  import { PrepareExecute } from './typings.js';
6
7
  import { LedgerApi } from './typings.js';
7
8
  import { OnConnected } from './typings.js';
9
+ import { OnStatusChanged } from './typings.js';
8
10
  import { OnAccountsChanged } from './typings.js';
9
11
  import { RequestAccounts } from './typings.js';
10
12
  import { OnTxChanged } from './typings.js';
11
13
  export type Methods = {
12
14
  status: Status;
13
15
  connect: Connect;
16
+ disconnect: Disconnect;
14
17
  darsAvailable: DarsAvailable;
15
18
  prepareReturn: PrepareReturn;
16
19
  prepareExecute: PrepareExecute;
17
20
  ledgerApi: LedgerApi;
18
21
  onConnected: OnConnected;
22
+ onStatusChanged: OnStatusChanged;
19
23
  onAccountsChanged: OnAccountsChanged;
20
24
  requestAccounts: RequestAccounts;
21
25
  onTxChanged: OnTxChanged;
@@ -23,11 +27,13 @@ export type Methods = {
23
27
  declare function buildController(methods: Methods): {
24
28
  status: Status;
25
29
  connect: Connect;
30
+ disconnect: Disconnect;
26
31
  darsAvailable: DarsAvailable;
27
32
  prepareReturn: PrepareReturn;
28
33
  prepareExecute: PrepareExecute;
29
34
  ledgerApi: LedgerApi;
30
35
  onConnected: OnConnected;
36
+ onStatusChanged: OnStatusChanged;
31
37
  onAccountsChanged: OnAccountsChanged;
32
38
  requestAccounts: RequestAccounts;
33
39
  onTxChanged: OnTxChanged;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,MAAM,OAAO,GAAG;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,eAAe,EAAE,eAAe,CAAA;IAChC,WAAW,EAAE,WAAW,CAAA;CAC3B,CAAA;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,OAAO;;;;;;;;;;;EAaxC;AAED,eAAe,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,MAAM,OAAO,GAAG;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,eAAe,EAAE,eAAe,CAAA;IAChC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,eAAe,EAAE,eAAe,CAAA;IAChC,WAAW,EAAE,WAAW,CAAA;CAC3B,CAAA;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,OAAO;;;;;;;;;;;;;EAexC;AAED,eAAe,eAAe,CAAA"}
@@ -4,11 +4,13 @@ function buildController(methods) {
4
4
  return {
5
5
  status: methods.status,
6
6
  connect: methods.connect,
7
+ disconnect: methods.disconnect,
7
8
  darsAvailable: methods.darsAvailable,
8
9
  prepareReturn: methods.prepareReturn,
9
10
  prepareExecute: methods.prepareExecute,
10
11
  ledgerApi: methods.ledgerApi,
11
12
  onConnected: methods.onConnected,
13
+ onStatusChanged: methods.onStatusChanged,
12
14
  onAccountsChanged: methods.onAccountsChanged,
13
15
  requestAccounts: methods.requestAccounts,
14
16
  onTxChanged: methods.onTxChanged,
@@ -40,7 +40,7 @@ export interface KernelInfo {
40
40
  }
41
41
  /**
42
42
  *
43
- * Whether or not a connection to a network is esablished.
43
+ * Whether or not a connection to a network is established.
44
44
  *
45
45
  */
46
46
  export type IsConnected = boolean;
@@ -49,13 +49,19 @@ export type IsConnected = boolean;
49
49
  * The network ID the wallet corresponds to.
50
50
  *
51
51
  */
52
- export type ChainId = string;
52
+ export type NetworkId = string;
53
+ export interface StatusEvent {
54
+ kernel: KernelInfo;
55
+ isConnected: IsConnected;
56
+ networkId?: NetworkId;
57
+ [k: string]: any;
58
+ }
53
59
  /**
54
60
  *
55
- * A URL that points to a user interface.
61
+ * JWT authentication token (if applicable).
56
62
  *
57
63
  */
58
- export type UserUrl = string;
64
+ export type SessionToken = string;
59
65
  export type Dar = string;
60
66
  export type Dars = Dar[];
61
67
  /**
@@ -80,13 +86,13 @@ export interface JsPrepareSubmissionResponse {
80
86
  preparedTransactionHash?: PreparedTransactionHash;
81
87
  [k: string]: any;
82
88
  }
83
- export type Response = string;
84
89
  /**
85
90
  *
86
- * JWT authentication token (if applicable).
91
+ * A URL that points to a user interface.
87
92
  *
88
93
  */
89
- export type SessionToken = string;
94
+ export type UserUrl = string;
95
+ export type Response = string;
90
96
  /**
91
97
  *
92
98
  * Set as primary wallet for dApp usage.
@@ -134,7 +140,7 @@ export interface Wallet {
134
140
  hint: Hint;
135
141
  publicKey: PublicKey;
136
142
  namespace: Namespace;
137
- chainId: ChainId;
143
+ networkId: NetworkId;
138
144
  signingProviderId: SigningProviderId;
139
145
  [k: string]: any;
140
146
  }
@@ -264,19 +270,17 @@ export interface LedgerApiParams {
264
270
  body?: Body;
265
271
  [k: string]: any;
266
272
  }
267
- export interface StatusResult {
268
- kernel: KernelInfo;
269
- isConnected: IsConnected;
270
- chainId?: ChainId;
271
- [k: string]: any;
272
- }
273
273
  export interface ConnectResult {
274
- kernel: KernelInfo;
275
- isConnected: IsConnected;
276
- chainId?: ChainId;
277
- userUrl: UserUrl;
274
+ status: StatusEvent;
275
+ sessionToken: SessionToken;
278
276
  [k: string]: any;
279
277
  }
278
+ /**
279
+ *
280
+ * Represents a null value, used in responses where no data is returned.
281
+ *
282
+ */
283
+ export type Null = null;
280
284
  export interface DarsAvailableResult {
281
285
  dars: Dars;
282
286
  [k: string]: any;
@@ -297,7 +301,7 @@ export interface LedgerApiResult {
297
301
  }
298
302
  export interface OnConnectedEvent {
299
303
  kernel: KernelInfo;
300
- chainId: ChainId;
304
+ networkId: NetworkId;
301
305
  sessionToken?: SessionToken;
302
306
  [k: string]: any;
303
307
  }
@@ -324,13 +328,15 @@ export type TxChangedEvent = TxChangedPendingEvent | TxChangedSignedEvent | TxCh
324
328
  * Generated! Represents an alias to any of the provided schemas
325
329
  *
326
330
  */
327
- export type Status = () => Promise<StatusResult>;
331
+ export type Status = () => Promise<StatusEvent>;
328
332
  export type Connect = () => Promise<ConnectResult>;
333
+ export type Disconnect = () => Promise<Null>;
329
334
  export type DarsAvailable = () => Promise<DarsAvailableResult>;
330
335
  export type PrepareReturn = (params: PrepareReturnParams) => Promise<PrepareReturnResult>;
331
336
  export type PrepareExecute = (params: PrepareExecuteParams) => Promise<PrepareExecuteResult>;
332
337
  export type LedgerApi = (params: LedgerApiParams) => Promise<LedgerApiResult>;
333
338
  export type OnConnected = () => Promise<OnConnectedEvent>;
339
+ export type OnStatusChanged = () => Promise<StatusEvent>;
334
340
  export type OnAccountsChanged = () => Promise<AccountsChangedEvent>;
335
341
  export type RequestAccounts = () => Promise<RequestAccountsResult>;
336
342
  export type OnTxChanged = () => Promise<TxChangedEvent>;
@@ -1 +1 @@
1
- {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/typings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/typings.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import express from 'express';
2
+ import { Logger } from 'pino';
2
3
  import { Store } from '@canton-network/core-wallet-store';
3
4
  import { AuthService, AuthAware } from '@canton-network/core-wallet-auth';
4
5
  import { Server } from 'http';
5
6
  import { NotificationService } from '../notification/NotificationService.js';
6
7
  import { KernelInfo } from '../config/Config.js';
7
- export declare const dapp: (route: string, app: express.Express, server: Server, kernelInfo: KernelInfo, notificationService: NotificationService, authService: AuthService, store: Store & AuthAware<Store>) => Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
8
+ export declare const dapp: (route: string, app: express.Express, logger: Logger, server: Server, kernelInfo: KernelInfo, notificationService: NotificationService, authService: AuthService, store: Store & AuthAware<Store>) => Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
8
9
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dapp-api/server.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,MAAM,SAAS,CAAA;AAK7B,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,EACH,mBAAmB,EAEtB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAIhD,eAAO,MAAM,IAAI,GACb,OAAO,MAAM,EACb,KAAK,OAAO,CAAC,OAAO,EACpB,QAAQ,MAAM,EACd,YAAY,UAAU,EACtB,qBAAqB,mBAAmB,EACxC,aAAa,WAAW,EACxB,OAAO,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,wFAiElC,CAAA"}
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,EACH,mBAAmB,EAEtB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,eAAO,MAAM,IAAI,GACb,OAAO,MAAM,EACb,KAAK,OAAO,CAAC,OAAO,EACpB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,YAAY,UAAU,EACtB,qBAAqB,mBAAmB,EACxC,aAAa,WAAW,EACxB,OAAO,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,wFAuElC,CAAA"}
@@ -1,11 +1,11 @@
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 cors from 'cors';
3
4
  import { dappController } from './controller.js';
4
- import { pino } from 'pino';
5
5
  import { jsonRpcHandler } from '../middleware/jsonRpcHandler.js';
6
6
  import { Server as SocketIoServer } from 'socket.io';
7
- const logger = pino({ name: 'main', level: 'debug' });
8
- export const dapp = (route, app, server, kernelInfo, notificationService, authService, store) => {
7
+ export const dapp = (route, app, logger, server, kernelInfo, notificationService, authService, store) => {
8
+ app.use(cors()); // TODO: read allowedOrigins from config
9
9
  app.use(route, (req, res, next) => jsonRpcHandler({
10
10
  controller: dappController(kernelInfo, store.withAuthContext(req.authContext), notificationService, logger, req.authContext),
11
11
  logger,
@@ -22,6 +22,9 @@ export const dapp = (route, app, server, kernelInfo, notificationService, authSe
22
22
  const onAccountsChanged = (...event) => {
23
23
  io.emit('accountsChanged', ...event);
24
24
  };
25
+ const onStatusChanged = (...event) => {
26
+ io.emit('statusChanged', ...event);
27
+ };
25
28
  const onConnected = (...event) => {
26
29
  io.emit('onConnected', ...event);
27
30
  };
@@ -38,6 +41,7 @@ export const dapp = (route, app, server, kernelInfo, notificationService, authSe
38
41
  notifier = notificationService.getNotifier(userId);
39
42
  notifier.on('accountsChanged', onAccountsChanged);
40
43
  notifier.on('onConnected', onConnected);
44
+ notifier.on('statusChanged', onStatusChanged);
41
45
  notifier.on('txChanged', onTxChanged);
42
46
  });
43
47
  socket.on('disconnect', () => {
@@ -45,6 +49,7 @@ export const dapp = (route, app, server, kernelInfo, notificationService, authSe
45
49
  if (notifier) {
46
50
  notifier.removeListener('accountsChanged', onAccountsChanged);
47
51
  notifier.removeListener('onConnected', onConnected);
52
+ notifier.removeListener('statusChanged', onStatusChanged);
48
53
  notifier.removeListener('txChanged', onTxChanged);
49
54
  }
50
55
  });
@@ -30,7 +30,7 @@ test('call connect rpc', async () => {
30
30
  app.use(cors());
31
31
  app.use(express.json());
32
32
  const server = createServer(app);
33
- const response = await request(dapp('/api/v0/dapp', app, server, config.kernel, notificationService, authService, store))
33
+ const response = await request(dapp('/api/v0/dapp', app, pino(sink()), server, config.kernel, notificationService, authService, store))
34
34
  .post('/api/v0/dapp')
35
35
  .send({ jsonrpc: '2.0', id: 0, method: 'connect', params: [] })
36
36
  .set('Accept', 'application/json');
@@ -39,14 +39,17 @@ test('call connect rpc', async () => {
39
39
  id: 0,
40
40
  jsonrpc: '2.0',
41
41
  result: {
42
- kernel: {
43
- id: 'remote-da',
44
- clientType: 'remote',
45
- url: 'http://localhost:3030/api/v0/dapp',
46
- userUrl: 'http://localhost:3030',
42
+ sessionToken: '',
43
+ status: {
44
+ kernel: {
45
+ id: 'remote-da',
46
+ clientType: 'remote',
47
+ url: 'http://localhost:3030/api/v0/dapp',
48
+ userUrl: 'http://localhost:3030',
49
+ },
50
+ isConnected: false,
51
+ userUrl: 'http://localhost:3030/login/',
47
52
  },
48
- isConnected: false,
49
- userUrl: 'http://localhost:3030/login/',
50
53
  },
51
54
  });
52
55
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AA0CA,QAAA,MAAM,OAAO;;;;;CAAiB,CAAA;AAE9B,MAAM,MAAM,UAAU,GAAG,OAAO,OAAO,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAuDA,QAAA,MAAM,OAAO;;;;;CAAiB,CAAA;AAE9B,MAAM,MAAM,UAAU,GAAG,OAAO,OAAO,CAAA"}
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ import { ConfigUtils } from './config/ConfigUtils.js';
8
8
  import { readFileSync } from 'fs';
9
9
  import { join, dirname } from 'path';
10
10
  import { fileURLToPath } from 'url';
11
+ import pino from 'pino';
11
12
  const __filename = fileURLToPath(import.meta.url);
12
13
  const __dirname = dirname(__filename);
13
14
  const pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));
@@ -24,8 +25,20 @@ const program = new Command()
24
25
  .choices(['sqlite', 'postgres'])
25
26
  .default('sqlite'))
26
27
  .action((opts) => {
28
+ // Define project-global logger
29
+ const logger = pino({
30
+ name: 'main',
31
+ level: 'debug',
32
+ ...(opts.logFormat === 'pretty'
33
+ ? {
34
+ transport: {
35
+ target: 'pino-pretty',
36
+ },
37
+ }
38
+ : {}),
39
+ });
27
40
  // Initialize the database with the provided config
28
- initialize(opts);
41
+ initialize(opts, logger);
29
42
  });
30
43
  // Parse only the options (without executing commands) to get config path
31
44
  program.parseOptions(process.argv);
package/dist/init.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { Logger } from 'pino';
1
2
  import { CliOptions } from './index.js';
2
- export declare function initialize(opts: CliOptions): Promise<void>;
3
+ export declare function initialize(opts: CliOptions, logger: Logger): Promise<void>;
3
4
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AA+BvC,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,iBA2DhD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAe7B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAsEvC,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBA+DhE"}
package/dist/init.js CHANGED
@@ -3,9 +3,7 @@
3
3
  import { dapp } from './dapp-api/server.js';
4
4
  import { user } from './user-api/server.js';
5
5
  import { web } from './web/server.js';
6
- import cors from 'cors';
7
- import { pino } from 'pino';
8
- import { StoreSql, connection } from '@canton-network/core-wallet-store-sql';
6
+ import { StoreSql, bootstrap, connection, migrator, } from '@canton-network/core-wallet-store-sql';
9
7
  import { ConfigUtils } from './config/ConfigUtils.js';
10
8
  import EventEmitter from 'events';
11
9
  import { SigningProvider } from '@canton-network/core-signing-lib';
@@ -15,6 +13,8 @@ import { jwtAuthService } from './auth/jwt-auth-service.js';
15
13
  import express from 'express';
16
14
  import { jwtAuth } from './middleware/jwtAuth.js';
17
15
  import { rpcRateLimit } from './middleware/rateLimit.js';
16
+ import { existsSync } from 'fs';
17
+ let isReady = false;
18
18
  class NotificationService {
19
19
  constructor(logger) {
20
20
  this.logger = logger;
@@ -36,39 +36,62 @@ class NotificationService {
36
36
  return notifier;
37
37
  }
38
38
  }
39
- export async function initialize(opts) {
40
- const logger = pino({
41
- name: 'main',
42
- level: 'debug',
43
- ...(opts.logFormat === 'pretty'
44
- ? {
45
- transport: {
46
- target: 'pino-pretty',
47
- },
48
- }
49
- : {}),
39
+ async function initializeDatabase(config, logger) {
40
+ logger.info('Checking for database migrations...');
41
+ let exists = true;
42
+ if (config.store.connection.type === 'sqlite') {
43
+ exists = existsSync(config.store.connection.database);
44
+ }
45
+ const db = connection(config.store);
46
+ const umzug = migrator(db);
47
+ const pending = await umzug.pending();
48
+ if (pending.length > 0) {
49
+ logger.info({ pendingMigrations: pending.map((m) => m.name) }, 'Applying database migrations...');
50
+ await umzug.up();
51
+ logger.info('Database migrations applied successfully.');
52
+ }
53
+ else {
54
+ logger.info('No pending database migrations found.');
55
+ }
56
+ // bootstrap database from config file if it did not exist before
57
+ if (!exists) {
58
+ logger.info('Bootstrapping database from config...');
59
+ await bootstrap(db, config.store, logger);
60
+ }
61
+ return new StoreSql(db, logger);
62
+ }
63
+ export async function initialize(opts, logger) {
64
+ const port = opts.port ? Number(opts.port) : 3030;
65
+ const app = express();
66
+ const server = app.listen(port, () => {
67
+ logger.info(`Remote Wallet Gateway starting on http://localhost:${port}`);
68
+ });
69
+ app.use('/healthz', rpcRateLimit, (_req, res) => res.status(200).send('OK'));
70
+ app.use('/readyz', rpcRateLimit, (_req, res) => {
71
+ if (isReady) {
72
+ res.status(200).send('OK');
73
+ }
74
+ else {
75
+ res.status(503).send('UNAVAILABLE');
76
+ }
50
77
  });
51
78
  const notificationService = new NotificationService(logger);
52
79
  const config = ConfigUtils.loadConfigFile(opts.config);
53
- const port = opts.port ? Number(opts.port) : 3030;
54
- const store = new StoreSql(connection(config.store), logger);
80
+ const store = await initializeDatabase(config, logger);
55
81
  const authService = jwtAuthService(store, logger);
56
82
  const drivers = {
57
83
  [SigningProvider.PARTICIPANT]: new ParticipantSigningDriver(),
58
84
  [SigningProvider.WALLET_KERNEL]: new InternalSigningDriver(),
59
85
  };
60
- const app = express();
61
- app.use(cors()); // TODO: read allowedOrigins from config
62
86
  app.use('/api/*splat', express.json());
63
87
  app.use('/api/*splat', rpcRateLimit);
64
88
  app.use('/api/*splat', jwtAuth(authService, logger));
65
- const server = app.listen(port, () => {
66
- logger.info(`Remote Wallet Gateway running at http://localhost:${port}`);
67
- });
68
89
  // register dapp API handlers
69
- dapp('/api/v0/dapp', app, server, config.kernel, notificationService, authService, store);
90
+ dapp('/api/v0/dapp', app, logger, server, config.kernel, notificationService, authService, store);
70
91
  // register user API handlers
71
- user('/api/v0/user', app, config.kernel, notificationService, drivers, store);
92
+ user('/api/v0/user', app, logger, config.kernel, notificationService, drivers, store);
72
93
  // register web handler
73
94
  web(app, server);
95
+ isReady = true;
96
+ logger.info('Wallet Gateway initialization complete');
74
97
  }
@@ -1,3 +1,4 @@
1
+ import { AccessTokenProvider } from '@canton-network/core-wallet-auth';
1
2
  import { Logger } from 'pino';
2
3
  export type AllocatedParty = {
3
4
  partyId: string;
@@ -12,7 +13,7 @@ export declare class PartyAllocationService {
12
13
  private synchronizerId;
13
14
  private logger;
14
15
  private ledgerClient;
15
- constructor(synchronizerId: string, adminToken: string, httpLedgerUrl: string, logger: Logger);
16
+ constructor(synchronizerId: string, accessTokenProvider: AccessTokenProvider, httpLedgerUrl: string, logger: Logger, accessToken?: string);
16
17
  /**
17
18
  * Allocates an internal participant party for a user.
18
19
  * @param userId The ID of the user.
@@ -1 +1 @@
1
- {"version":3,"file":"party-allocation-service.d.ts","sourceRoot":"","sources":["../../src/ledger/party-allocation-service.ts"],"names":[],"mappings":"AAOA,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;IAI3B,OAAO,CAAC,cAAc;IAGtB,OAAO,CAAC,MAAM;IANlB,OAAO,CAAC,YAAY,CAAc;gBAGtB,cAAc,EAAE,MAAM,EAC9B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;IAS1B;;;;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;YAoBZ,qBAAqB;YAoBrB,qBAAqB;CAmCtC"}
1
+ {"version":3,"file":"party-allocation-service.d.ts","sourceRoot":"","sources":["../../src/ledger/party-allocation-service.ts"],"names":[],"mappings":"AAOA,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;IAI3B,OAAO,CAAC,cAAc;IAGtB,OAAO,CAAC,MAAM;IANlB,OAAO,CAAC,YAAY,CAAc;gBAGtB,cAAc,EAAE,MAAM,EAC9B,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACtB,WAAW,GAAE,MAAW;IAW5B;;;;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;YAoBZ,qBAAqB;YAuBrB,qBAAqB;CAsCtC"}
@@ -5,10 +5,10 @@ import { LedgerClient, TopologyWriteService, } from '@canton-network/core-ledger
5
5
  * This service provides an abstraction for Canton party allocation that seamlessly handles both internal and external parties.
6
6
  */
7
7
  export class PartyAllocationService {
8
- constructor(synchronizerId, adminToken, httpLedgerUrl, logger) {
8
+ constructor(synchronizerId, accessTokenProvider, httpLedgerUrl, logger, accessToken = '') {
9
9
  this.synchronizerId = synchronizerId;
10
10
  this.logger = logger;
11
- this.ledgerClient = new LedgerClient(new URL(httpLedgerUrl), adminToken, this.logger);
11
+ this.ledgerClient = new LedgerClient(new URL(httpLedgerUrl), this.logger, true, accessToken, accessTokenProvider);
12
12
  }
13
13
  async allocateParty(userId, hint, publicKey, signingCallback) {
14
14
  if (publicKey !== undefined && signingCallback !== undefined) {
@@ -27,7 +27,7 @@ export class PartyAllocationService {
27
27
  if (!res.partyDetails?.party) {
28
28
  throw new Error('Failed to allocate party');
29
29
  }
30
- await this.ledgerClient.grantUserRights(userId, res.partyDetails.party);
30
+ await this.ledgerClient.waitForPartyAndGrantUserRights(userId, res.partyDetails.party);
31
31
  return { hint, namespace, partyId: res.partyDetails.party };
32
32
  }
33
33
  async allocateExternalParty(userId, hint, publicKey, signingCallback) {
@@ -44,7 +44,7 @@ export class PartyAllocationService {
44
44
  signingAlgorithmSpec: 'SIGNING_ALGORITHM_SPEC_ED25519',
45
45
  },
46
46
  ]);
47
- await this.ledgerClient.grantUserRights(userId, res.partyId);
47
+ await this.ledgerClient.waitForPartyAndGrantUserRights(userId, res.partyId);
48
48
  return { hint, partyId: res.partyId, namespace };
49
49
  }
50
50
  }
@@ -22,7 +22,7 @@ jest.unstable_mockModule('@canton-network/core-ledger-client', () => ({
22
22
  return {
23
23
  getWithRetry: mockLedgerGet,
24
24
  postWithRetry: mockLedgerPost,
25
- grantUserRights: mockLedgerGrantUserRights,
25
+ waitForPartyAndGrantUserRights: mockLedgerGrantUserRights,
26
26
  generateTopology: jest.fn().mockResolvedValue({
27
27
  partyId: 'party2::mypublickey',
28
28
  publicKeyFingerprint: 'mypublickey',
@@ -39,7 +39,7 @@ jest.unstable_mockModule('@canton-network/core-ledger-client', () => ({
39
39
  describe('PartyAllocationService', () => {
40
40
  const network = {
41
41
  name: 'test',
42
- chainId: 'chain-id',
42
+ id: 'network-id',
43
43
  synchronizerId: 'sync-id',
44
44
  description: 'desc',
45
45
  ledgerApi: {
@@ -61,7 +61,16 @@ describe('PartyAllocationService', () => {
61
61
  beforeEach(async () => {
62
62
  const mockLogger = pino(sink());
63
63
  const pas = await import('./party-allocation-service.js');
64
- service = new pas.PartyAllocationService(network.synchronizerId, 'admin.jwt', network.ledgerApi.baseUrl, mockLogger);
64
+ // Mock AccessTokenProvider
65
+ const mockAccessTokenProvider = {
66
+ getUserAccessToken: jest
67
+ .fn()
68
+ .mockResolvedValue('user.jwt'),
69
+ getAdminAccessToken: jest
70
+ .fn()
71
+ .mockResolvedValue('admin.jwt'),
72
+ };
73
+ service = new pas.PartyAllocationService(network.synchronizerId, mockAccessTokenProvider, network.ledgerApi.baseUrl, mockLogger);
65
74
  });
66
75
  it('allocates an internal party', async () => {
67
76
  mockLedgerGet.mockResolvedValueOnce({ participantId: 'participantid' });
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-sync-service.d.ts","sourceRoot":"","sources":["../../src/ledger/wallet-sync-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,MAAM,MAAM,gBAAgB,GAAG;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CACpB,CAAA;AACD,qBAAa,iBAAiB;IAEtB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;gBAHN,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM;IAGpB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrC,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;CA8FjD"}
1
+ {"version":3,"file":"wallet-sync-service.d.ts","sourceRoot":"","sources":["../../src/ledger/wallet-sync-service.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,YAAY,EAEf,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,MAAM,MAAM,gBAAgB,GAAG;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CACpB,CAAA;AACD,qBAAa,iBAAiB;IAEtB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;gBAHN,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM;IAGpB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrC,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;CA8FjD"}
@@ -1,6 +1,6 @@
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 { defaultRetryableOptions } from '@canton-network/core-ledger-client/dist/ledger-api-utils.js';
3
+ import { defaultRetryableOptions, } from '@canton-network/core-ledger-client';
4
4
  export class WalletSyncService {
5
5
  constructor(store, ledgerClient, authContext, logger) {
6
6
  this.store = store;
@@ -64,7 +64,7 @@ export class WalletSyncService {
64
64
  hint: hint,
65
65
  publicKey: namespace,
66
66
  namespace: namespace,
67
- chainId: network.chainId,
67
+ networkId: network.id,
68
68
  signingProviderId: 'participant', // todo: determine based on partyDetails.isLocal
69
69
  };
70
70
  }) || [];
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/user-api/controller.ts"],"names":[],"mappings":"AAkBA,OAAO,EACH,KAAK,EAIR,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAC5E,OAAO,EAEH,WAAW,EAEd,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EACH,sBAAsB,EACtB,eAAe,EAClB,MAAM,kCAAkC,CAAA;AAOzC,KAAK,uBAAuB,GAAG,OAAO,CAClC,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAClD,CAAA;AAED,eAAO,MAAM,cAAc,GACvB,YAAY,UAAU,EACtB,OAAO,KAAK,EACZ,qBAAqB,mBAAmB,EACxC,aAAa,WAAW,GAAG,SAAS,EACpC,SAAS,uBAAuB,EAChC,SAAS,MAAM;;;;;;;;;;;;;CAiclB,CAAA"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/user-api/controller.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,EAAwB,MAAM,mCAAmC,CAAA;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAC5E,OAAO,EAIH,WAAW,EAEd,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EACH,sBAAsB,EACtB,eAAe,EAClB,MAAM,kCAAkC,CAAA;AAOzC,KAAK,uBAAuB,GAAG,OAAO,CAClC,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAClD,CAAA;AAED,eAAO,MAAM,cAAc,GACvB,YAAY,UAAU,EACtB,OAAO,KAAK,EACZ,qBAAqB,mBAAmB,EACxC,aAAa,WAAW,GAAG,SAAS,EACpC,SAAS,uBAAuB,EAChC,SAAS,MAAM;;;;;;;;;;;;;CA0dlB,CAAA"}