@canton-network/core-wallet-store-sql 0.11.0 → 0.12.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/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { assertConnected } from '@canton-network/core-wallet-auth';
1
+ import { assertConnected, authSchema } from '@canton-network/core-wallet-auth';
2
2
  import { Kysely, CamelCasePlugin, SqliteDialect } from 'kysely';
3
3
  import Database from 'better-sqlite3';
4
4
  import { Umzug } from 'umzug';
@@ -8,161 +8,70 @@ import { pino } from 'pino';
8
8
  var __defProp = Object.defineProperty;
9
9
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
10
  var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
11
-
12
- // src/schema.ts
13
- var toAuth = (table) => {
11
+ var toIdp = (table) => {
14
12
  switch (table.type) {
15
- case "password":
16
- return {
17
- identityProviderId: table.identityProviderId,
18
- type: table.type,
19
- issuer: table.issuer,
20
- configUrl: table.configUrl,
21
- audience: table.audience,
22
- tokenUrl: table.tokenUrl || "",
23
- grantType: table.grantType || "",
24
- scope: table.scope,
25
- clientId: table.clientId,
26
- admin: {
27
- clientId: table.adminClientId,
28
- clientSecret: table.adminClientSecret
29
- }
30
- };
31
- case "implicit":
32
- return {
33
- identityProviderId: table.identityProviderId,
34
- type: table.type,
35
- issuer: table.issuer,
36
- configUrl: table.configUrl,
37
- audience: table.audience,
38
- scope: table.scope,
39
- clientId: table.clientId,
40
- admin: {
41
- clientId: table.adminClientId,
42
- clientSecret: table.adminClientSecret
43
- }
44
- };
45
- case "client_credentials":
13
+ case "oauth": {
14
+ if (!table.configUrl) {
15
+ throw new Error(`Missing configUrl for oauth IdP: ${table.id}`);
16
+ }
46
17
  return {
47
- identityProviderId: table.identityProviderId,
18
+ id: table.id,
48
19
  type: table.type,
49
20
  issuer: table.issuer,
50
- configUrl: table.configUrl,
51
- audience: table.audience,
52
- scope: table.scope,
53
- clientId: table.clientId,
54
- clientSecret: table.clientSecret,
55
- admin: {
56
- clientId: table.adminClientId,
57
- clientSecret: table.adminClientSecret
58
- }
21
+ configUrl: table.configUrl
59
22
  };
23
+ }
60
24
  case "self_signed":
61
25
  return {
62
- identityProviderId: table.identityProviderId,
26
+ id: table.id,
63
27
  type: table.type,
64
- issuer: table.issuer,
65
- audience: table.audience,
66
- scope: table.scope,
67
- clientId: table.clientId,
68
- clientSecret: table.clientSecret,
69
- admin: {
70
- clientId: table.adminClientId,
71
- clientSecret: table.adminClientSecret
72
- }
28
+ issuer: table.issuer
73
29
  };
74
- default:
75
- throw new Error(`Unknown auth type: ${table.type}`);
76
30
  }
77
31
  };
78
- var fromAuth = (auth) => {
79
- switch (auth.type) {
80
- case "password":
81
- return {
82
- identityProviderId: auth.identityProviderId,
83
- type: auth.type,
84
- issuer: auth.issuer,
85
- configUrl: auth.configUrl,
86
- audience: auth.audience,
87
- tokenUrl: auth.tokenUrl,
88
- grantType: auth.grantType,
89
- scope: auth.scope,
90
- clientId: auth.clientId,
91
- clientSecret: "",
92
- adminClientId: auth.admin?.clientId || "",
93
- adminClientSecret: auth.admin?.clientSecret || ""
94
- };
95
- case "implicit":
32
+ var fromIdp = (idp) => {
33
+ switch (idp.type) {
34
+ case "oauth":
96
35
  return {
97
- identityProviderId: auth.identityProviderId,
98
- type: auth.type,
99
- issuer: auth.issuer,
100
- configUrl: auth.configUrl,
101
- audience: auth.audience,
102
- tokenUrl: "",
103
- grantType: "",
104
- scope: auth.scope,
105
- clientId: auth.clientId,
106
- clientSecret: "",
107
- adminClientId: auth.admin?.clientId || "",
108
- adminClientSecret: auth.admin?.clientSecret || ""
109
- };
110
- case "client_credentials":
111
- return {
112
- identityProviderId: auth.identityProviderId,
113
- type: auth.type,
114
- issuer: auth.issuer,
115
- configUrl: auth.configUrl,
116
- audience: auth.audience,
117
- tokenUrl: "",
118
- grantType: "",
119
- scope: auth.scope,
120
- clientId: auth.clientId,
121
- clientSecret: auth.clientSecret,
122
- adminClientId: auth.admin?.clientId || "",
123
- adminClientSecret: auth.admin?.clientSecret || ""
36
+ id: idp.id,
37
+ type: idp.type,
38
+ issuer: idp.issuer,
39
+ configUrl: idp.configUrl
124
40
  };
125
41
  case "self_signed":
126
42
  return {
127
- identityProviderId: auth.identityProviderId,
128
- type: auth.type,
129
- issuer: auth.issuer,
130
- configUrl: "",
131
- audience: auth.audience,
132
- tokenUrl: "",
133
- grantType: "",
134
- scope: auth.scope,
135
- clientId: auth.clientId,
136
- clientSecret: auth.clientSecret,
137
- adminClientId: auth.admin?.clientId || "",
138
- adminClientSecret: auth.admin?.clientSecret || ""
43
+ id: idp.id,
44
+ type: idp.type,
45
+ issuer: idp.issuer,
46
+ configUrl: void 0
139
47
  };
140
48
  }
141
49
  };
142
- var toNetwork = (table, authTable) => {
143
- if (!authTable) {
144
- throw new Error(`Missing auth table for network: ${table.name}`);
145
- }
50
+ var toNetwork = (table) => {
146
51
  return {
147
52
  name: table.name,
148
- chainId: table.chainId,
53
+ id: table.id,
149
54
  synchronizerId: table.synchronizerId,
55
+ identityProviderId: table.identityProviderId,
150
56
  description: table.description,
151
57
  ledgerApi: {
152
58
  baseUrl: table.ledgerApiBaseUrl
153
59
  },
154
- auth: toAuth(authTable)
60
+ auth: authSchema.parse(JSON.parse(table.auth)),
61
+ adminAuth: table.adminAuth ? authSchema.parse(JSON.parse(table.adminAuth)) : void 0
155
62
  };
156
63
  };
157
64
  var fromNetwork = (network, userId) => {
158
65
  return {
159
66
  name: network.name,
160
- chainId: network.chainId,
67
+ id: network.id,
161
68
  synchronizerId: network.synchronizerId,
162
69
  description: network.description,
163
70
  ledgerApiBaseUrl: network.ledgerApi.baseUrl,
164
71
  userId,
165
- identityProviderId: network.auth.identityProviderId
72
+ identityProviderId: network.identityProviderId,
73
+ auth: JSON.stringify(network.auth),
74
+ adminAuth: network.adminAuth ? JSON.stringify(network.adminAuth) : void 0
166
75
  };
167
76
  };
168
77
  var fromWallet = (wallet, userId) => {
@@ -211,15 +120,22 @@ var StoreSql = class _StoreSql {
211
120
  // Wallet methods
212
121
  async getWallets(filter = {}) {
213
122
  const userId = this.assertConnected();
214
- const { chainIds, signingProviderIds } = filter;
215
- const chainIdSet = chainIds ? new Set(chainIds) : null;
123
+ const { networkIds, signingProviderIds } = filter;
124
+ const networkIdSet = networkIds ? new Set(networkIds) : null;
216
125
  const signingProviderIdSet = signingProviderIds ? new Set(signingProviderIds) : null;
217
126
  const wallets = await this.db.selectFrom("wallets").selectAll().where("userId", "=", userId).execute();
218
127
  return wallets.filter((wallet) => {
219
- const matchedChainIds = chainIdSet ? chainIdSet.has(wallet.chainId) : true;
220
- const matchedStorageProviderIdS = signingProviderIdSet ? signingProviderIdSet.has(wallet.signingProviderId) : true;
221
- return matchedChainIds && matchedStorageProviderIdS;
222
- }).map((table) => toWallet(table));
128
+ const matchedNetworkIds = networkIdSet ? networkIdSet.has(wallet.networkId) : true;
129
+ const matchedSigningProviderIds = signingProviderIdSet ? signingProviderIdSet.has(wallet.signingProviderId) : true;
130
+ return matchedNetworkIds && matchedSigningProviderIds;
131
+ }).map(
132
+ (table) => toWallet({
133
+ ...table,
134
+ externalTxId: table.externalTxId ?? "",
135
+ topologyTransactions: table.topologyTransactions ?? "",
136
+ status: table.status ?? ""
137
+ })
138
+ );
223
139
  }
224
140
  async getPrimaryWallet() {
225
141
  const wallets = await this.getWallets();
@@ -262,29 +178,84 @@ var StoreSql = class _StoreSql {
262
178
  await trx.insertInto("wallets").values(fromWallet(wallet, userId)).execute();
263
179
  });
264
180
  }
181
+ async updateWallet({ status, partyId }) {
182
+ this.logger.info("Updating wallet");
183
+ await this.db.transaction().execute(async (trx) => {
184
+ await trx.updateTable("wallets").set({ status }).where("partyId", "=", partyId).execute();
185
+ });
186
+ }
187
+ async removeWallet(partyId) {
188
+ this.logger.info("Removing wallet");
189
+ await this.db.transaction().execute(async (trx) => {
190
+ await trx.deleteFrom("wallets").where("partyId", "=", partyId).execute();
191
+ });
192
+ }
265
193
  // Session methods
266
194
  async getSession() {
267
- const sessions = await this.db.selectFrom("sessions").selectAll().executeTakeFirst();
195
+ const userId = this.assertConnected();
196
+ const sessions = await this.db.selectFrom("sessions").selectAll().where("userId", "=", userId).executeTakeFirst();
268
197
  return sessions;
269
198
  }
270
199
  async setSession(session) {
271
200
  const userId = this.assertConnected();
272
201
  await this.db.transaction().execute(async (trx) => {
273
- await trx.deleteFrom("sessions").where("userId", "=", userId).execute();
274
- await trx.insertInto("sessions").values({ ...session, userId }).execute();
202
+ const deleted = await trx.deleteFrom("sessions").where("userId", "=", userId).execute();
203
+ this.logger.debug(deleted, "Deleted old session");
204
+ const inserted = await trx.insertInto("sessions").values({ ...session, userId }).execute();
205
+ this.logger.debug(inserted, "Inserted new session");
275
206
  });
276
207
  }
277
208
  async removeSession() {
278
209
  const userId = this.assertConnected();
279
210
  await this.db.deleteFrom("sessions").where("userId", "=", userId).execute();
280
211
  }
212
+ // IDP methods
213
+ async getIdp(idpId) {
214
+ this.assertConnected();
215
+ const idps = await this.listIdps();
216
+ if (!idps) throw new Error("No IDPs available");
217
+ const idp = idps.find((n) => n.id === idpId);
218
+ if (!idp) throw new Error(`IDP "${idpId}" not found`);
219
+ return idp;
220
+ }
221
+ async listIdps() {
222
+ const query = this.db.selectFrom("idps").selectAll();
223
+ const idps = await query.execute();
224
+ return idps.map((table) => toIdp(table));
225
+ }
226
+ async updateIdp(idp) {
227
+ await this.db.transaction().execute(async (trx) => {
228
+ const idpEntry = fromIdp(idp);
229
+ this.logger.info(idpEntry, "Updating idp table");
230
+ await trx.updateTable("idps").set(idpEntry).where("id", "=", idp.id).execute();
231
+ });
232
+ }
233
+ async addIdp(idp) {
234
+ await this.db.transaction().execute(async (trx) => {
235
+ const idpAlreadyExists = await trx.selectFrom("idps").selectAll().where("id", "=", idp.id).executeTakeFirst();
236
+ if (idpAlreadyExists) {
237
+ throw new Error(`IDP ${idp.id} already exists`);
238
+ } else {
239
+ await trx.insertInto("idps").values(fromIdp(idp)).execute();
240
+ }
241
+ });
242
+ }
243
+ async removeIdp(idpId) {
244
+ await this.db.transaction().execute(async (trx) => {
245
+ const idp = await trx.selectFrom("idps").selectAll().where("id", "=", idpId).executeTakeFirst();
246
+ if (!idp) {
247
+ throw new Error(`IDP ${idpId} does not exists`);
248
+ }
249
+ await trx.deleteFrom("idps").where("id", "=", idpId).execute();
250
+ });
251
+ }
281
252
  // Network methods
282
- async getNetwork(chainId) {
253
+ async getNetwork(networkId) {
283
254
  this.assertConnected();
284
255
  const networks = await this.listNetworks();
285
256
  if (!networks) throw new Error("No networks available");
286
- const network = networks.find((n) => n.chainId === chainId);
287
- if (!network) throw new Error(`Network "${chainId}" not found`);
257
+ const network = networks.find((n) => n.id === networkId);
258
+ if (!network) throw new Error(`Network "${networkId}" not found`);
288
259
  return network;
289
260
  }
290
261
  async getCurrentNetwork() {
@@ -292,14 +263,14 @@ var StoreSql = class _StoreSql {
292
263
  if (!session) {
293
264
  throw new Error("No session found");
294
265
  }
295
- const chainId = session.network;
296
- if (!chainId) {
266
+ const networkId = session.network;
267
+ if (!networkId) {
297
268
  throw new Error("No current network set in session");
298
269
  }
299
270
  const networks = await this.listNetworks();
300
- const network = networks.find((n) => n.chainId === chainId);
271
+ const network = networks.find((n) => n.id === networkId);
301
272
  if (!network) {
302
- throw new Error(`Network "${chainId}" not found`);
273
+ throw new Error(`Network "${networkId}" not found`);
303
274
  }
304
275
  return network;
305
276
  }
@@ -319,53 +290,49 @@ var StoreSql = class _StoreSql {
319
290
  query = query.where("userId", "is", null);
320
291
  }
321
292
  const networks = await query.execute();
322
- const idps = await this.db.selectFrom("idps").selectAll().execute();
323
- const idpMap = new Map(idps.map((idp) => [idp.identityProviderId, idp]));
324
- return networks.map(
325
- (table) => toNetwork(table, idpMap.get(table.identityProviderId))
326
- );
293
+ return networks.map((table) => toNetwork(table));
327
294
  }
328
295
  async updateNetwork(network) {
329
- const userId = this.assertConnected();
296
+ this.assertConnected();
330
297
  await this.db.transaction().execute(async (trx) => {
331
- const networkEntry = fromNetwork(network, userId);
298
+ const networkEntry = fromNetwork(network, void 0);
332
299
  this.logger.info(networkEntry, "Updating network table");
333
- await trx.updateTable("networks").set(networkEntry).where("chainId", "=", network.chainId).execute();
334
- const authEntry = fromAuth(network.auth);
335
- this.logger.info(authEntry, "Updating auth table");
336
- await trx.updateTable("idps").set(authEntry).where(
337
- "identityProviderId",
338
- "=",
339
- network.auth.identityProviderId
340
- ).execute();
300
+ await trx.updateTable("networks").set(networkEntry).where("id", "=", network.id).execute();
341
301
  });
342
302
  }
343
303
  async addNetwork(network) {
344
304
  const userId = this.authContext?.userId;
305
+ const idps = await this.listIdps();
306
+ const networkIdp = idps.find(
307
+ (idp) => idp.id === network.identityProviderId
308
+ );
309
+ if (!networkIdp) {
310
+ throw new Error(
311
+ `Identity provider "${network.identityProviderId}" not found`
312
+ );
313
+ }
345
314
  await this.db.transaction().execute(async (trx) => {
346
- const networkAlreadyExists = await trx.selectFrom("networks").selectAll().where("chainId", "=", network.chainId).executeTakeFirst();
315
+ const networkAlreadyExists = await trx.selectFrom("networks").selectAll().where("id", "=", network.id).executeTakeFirst();
347
316
  if (networkAlreadyExists) {
348
- throw new Error(`Network ${network.chainId} already exists`);
317
+ throw new Error(`Network ${network.id} already exists`);
349
318
  } else {
350
- await trx.insertInto("idps").values(fromAuth(network.auth)).execute();
351
319
  await trx.insertInto("networks").values(fromNetwork(network, userId)).execute();
352
320
  }
353
321
  });
354
322
  }
355
- async removeNetwork(chainId) {
323
+ async removeNetwork(networkId) {
356
324
  const userId = this.assertConnected();
357
325
  await this.db.transaction().execute(async (trx) => {
358
- const network = await trx.selectFrom("networks").selectAll().where("chainId", "=", chainId).executeTakeFirst();
326
+ const network = await trx.selectFrom("networks").selectAll().where("id", "=", networkId).executeTakeFirst();
359
327
  if (!network) {
360
- throw new Error(`Network ${chainId} does not exists`);
328
+ throw new Error(`Network ${networkId} does not exists`);
361
329
  }
362
330
  if (network.userId !== userId) {
363
331
  throw new Error(
364
- `Network ${chainId} is not owned by user ${userId}`
332
+ `Network ${networkId} is not owned by user ${userId}`
365
333
  );
366
334
  }
367
- await trx.deleteFrom("networks").where("chainId", "=", chainId).execute();
368
- await trx.deleteFrom("idps").where("identityProviderId", "=", network.identityProviderId).execute();
335
+ await trx.deleteFrom("networks").where("id", "=", networkId).execute();
369
336
  });
370
337
  }
371
338
  // Transaction methods
@@ -462,6 +429,7 @@ var migrator = (db) => {
462
429
  // src/bootstrap.ts
463
430
  async function bootstrap(db, config, logger2) {
464
431
  const store = new StoreSql(db, logger2);
432
+ await Promise.all(config.idps.map((idp) => store.addIdp(idp)));
465
433
  await Promise.all(
466
434
  config.networks.map((network) => store.addNetwork(network))
467
435
  );
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema.ts","../src/store-sql.ts","../src/migrator.ts","../src/bootstrap.ts","../src/cli.ts"],"names":["logger"],"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 { Auth, UserId } from '@canton-network/core-wallet-auth'\nimport {\n Wallet,\n Transaction,\n Session,\n Network,\n} from '@canton-network/core-wallet-store'\n\ninterface MigrationTable {\n name: string\n executedAt: string\n}\n\ninterface IdpTable {\n identityProviderId: string\n type: string\n issuer: string\n configUrl: string\n audience: string\n tokenUrl: string\n grantType: string\n scope: string\n clientId: string\n clientSecret: string\n adminClientId: string\n adminClientSecret: string\n}\n\ninterface NetworkTable {\n name: string\n chainId: string\n synchronizerId: string\n description: string\n ledgerApiBaseUrl: string\n userId: UserId | undefined // global if undefined\n identityProviderId: string\n}\n\ninterface WalletTable {\n primary: number\n partyId: string\n hint: string\n publicKey: string\n namespace: string\n chainId: string\n signingProviderId: string\n userId: UserId\n}\n\ninterface TransactionTable {\n status: string\n commandId: string\n preparedTransaction: string\n preparedTransactionHash: string\n payload: string | undefined\n userId: UserId\n}\n\ninterface SessionTable extends Session {\n userId: UserId\n}\n\nexport interface DB {\n migrations: MigrationTable\n idps: IdpTable\n networks: NetworkTable\n wallets: WalletTable\n transactions: TransactionTable\n sessions: SessionTable\n}\n\nexport const toAuth = (table: IdpTable): Auth => {\n switch (table.type) {\n case 'password':\n return {\n identityProviderId: table.identityProviderId,\n type: table.type,\n issuer: table.issuer,\n configUrl: table.configUrl,\n audience: table.audience,\n tokenUrl: table.tokenUrl || '',\n grantType: table.grantType || '',\n scope: table.scope,\n clientId: table.clientId,\n admin: {\n clientId: table.adminClientId,\n clientSecret: table.adminClientSecret,\n },\n }\n case 'implicit':\n return {\n identityProviderId: table.identityProviderId,\n type: table.type,\n issuer: table.issuer,\n configUrl: table.configUrl,\n audience: table.audience,\n scope: table.scope,\n clientId: table.clientId,\n admin: {\n clientId: table.adminClientId,\n clientSecret: table.adminClientSecret,\n },\n }\n case 'client_credentials':\n return {\n identityProviderId: table.identityProviderId,\n type: table.type,\n issuer: table.issuer,\n configUrl: table.configUrl,\n audience: table.audience,\n scope: table.scope,\n clientId: table.clientId,\n clientSecret: table.clientSecret,\n admin: {\n clientId: table.adminClientId,\n clientSecret: table.adminClientSecret,\n },\n }\n case 'self_signed':\n return {\n identityProviderId: table.identityProviderId,\n type: table.type,\n issuer: table.issuer,\n audience: table.audience,\n scope: table.scope,\n clientId: table.clientId,\n clientSecret: table.clientSecret,\n admin: {\n clientId: table.adminClientId,\n clientSecret: table.adminClientSecret,\n },\n }\n default:\n throw new Error(`Unknown auth type: ${table.type}`)\n }\n}\n\nexport const fromAuth = (auth: Auth): IdpTable => {\n switch (auth.type) {\n case 'password':\n return {\n identityProviderId: auth.identityProviderId,\n type: auth.type,\n issuer: auth.issuer,\n configUrl: auth.configUrl,\n audience: auth.audience,\n tokenUrl: auth.tokenUrl,\n grantType: auth.grantType,\n scope: auth.scope,\n clientId: auth.clientId,\n clientSecret: '',\n adminClientId: auth.admin?.clientId || '',\n adminClientSecret: auth.admin?.clientSecret || '',\n }\n case 'implicit':\n return {\n identityProviderId: auth.identityProviderId,\n type: auth.type,\n issuer: auth.issuer,\n configUrl: auth.configUrl,\n audience: auth.audience,\n tokenUrl: '',\n grantType: '',\n scope: auth.scope,\n clientId: auth.clientId,\n clientSecret: '',\n adminClientId: auth.admin?.clientId || '',\n adminClientSecret: auth.admin?.clientSecret || '',\n }\n case 'client_credentials':\n return {\n identityProviderId: auth.identityProviderId,\n type: auth.type,\n issuer: auth.issuer,\n configUrl: auth.configUrl,\n audience: auth.audience,\n tokenUrl: '',\n grantType: '',\n scope: auth.scope,\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n adminClientId: auth.admin?.clientId || '',\n adminClientSecret: auth.admin?.clientSecret || '',\n }\n case 'self_signed':\n return {\n identityProviderId: auth.identityProviderId,\n type: auth.type,\n issuer: auth.issuer,\n configUrl: '',\n audience: auth.audience,\n tokenUrl: '',\n grantType: '',\n scope: auth.scope,\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n adminClientId: auth.admin?.clientId || '',\n adminClientSecret: auth.admin?.clientSecret || '',\n }\n }\n}\n\nexport const toNetwork = (\n table: NetworkTable,\n authTable?: IdpTable\n): Network => {\n if (!authTable) {\n throw new Error(`Missing auth table for network: ${table.name}`)\n }\n return {\n name: table.name,\n chainId: table.chainId,\n synchronizerId: table.synchronizerId,\n description: table.description,\n ledgerApi: {\n baseUrl: table.ledgerApiBaseUrl,\n },\n auth: toAuth(authTable),\n }\n}\n\nexport const fromNetwork = (\n network: Network,\n userId?: UserId\n): NetworkTable => {\n return {\n name: network.name,\n chainId: network.chainId,\n synchronizerId: network.synchronizerId,\n description: network.description,\n ledgerApiBaseUrl: network.ledgerApi.baseUrl,\n userId: userId,\n identityProviderId: network.auth.identityProviderId,\n }\n}\n\nexport const fromWallet = (wallet: Wallet, userId: UserId): WalletTable => {\n return {\n ...wallet,\n primary: wallet.primary ? 1 : 0,\n userId: userId,\n }\n}\n\nexport const toWallet = (table: WalletTable): Wallet => {\n return {\n ...table,\n primary: table.primary === 1,\n }\n}\n\nexport const fromTransaction = (\n transaction: Transaction,\n userId: UserId\n): TransactionTable => {\n return {\n ...transaction,\n payload: transaction.payload\n ? JSON.stringify(transaction.payload)\n : undefined,\n userId: userId,\n }\n}\n\nexport const toTransaction = (table: TransactionTable): Transaction => {\n return {\n ...table,\n status: table.status as 'pending' | 'signed' | 'executed' | 'failed',\n payload: table.payload ? JSON.parse(table.payload) : undefined,\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 { Logger } from 'pino'\nimport {\n AuthContext,\n UserId,\n AuthAware,\n assertConnected,\n} from '@canton-network/core-wallet-auth'\nimport {\n Store as BaseStore,\n Wallet,\n PartyId,\n Session,\n WalletFilter,\n Transaction,\n Network,\n StoreConfig,\n} from '@canton-network/core-wallet-store'\nimport { CamelCasePlugin, Kysely, SqliteDialect } from 'kysely'\nimport Database from 'better-sqlite3'\nimport {\n DB,\n fromAuth,\n fromNetwork,\n fromTransaction,\n fromWallet,\n toNetwork,\n toTransaction,\n toWallet,\n} from './schema.js'\n\nexport class StoreSql implements BaseStore, AuthAware<StoreSql> {\n authContext: AuthContext | undefined\n\n constructor(\n private db: Kysely<DB>,\n private logger: Logger,\n authContext?: AuthContext\n ) {\n this.logger = logger.child({ component: 'StoreSql' })\n this.authContext = authContext\n\n // this.syncWallets()\n }\n\n withAuthContext(context?: AuthContext): StoreSql {\n return new StoreSql(this.db, this.logger, context)\n }\n\n private assertConnected(): UserId {\n return assertConnected(this.authContext).userId\n }\n\n // Wallet methods\n\n async getWallets(filter: WalletFilter = {}): Promise<Array<Wallet>> {\n const userId = this.assertConnected()\n const { chainIds, signingProviderIds } = filter\n const chainIdSet = chainIds ? new Set(chainIds) : null\n const signingProviderIdSet = signingProviderIds\n ? new Set(signingProviderIds)\n : null\n\n const wallets = await this.db\n .selectFrom('wallets')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n\n return wallets\n .filter((wallet) => {\n const matchedChainIds = chainIdSet\n ? chainIdSet.has(wallet.chainId)\n : true\n const matchedStorageProviderIdS = signingProviderIdSet\n ? signingProviderIdSet.has(wallet.signingProviderId)\n : true\n return matchedChainIds && matchedStorageProviderIdS\n })\n .map((table) => toWallet(table))\n }\n\n async getPrimaryWallet(): Promise<Wallet | undefined> {\n const wallets = await this.getWallets()\n return wallets.find((w) => w.primary === true)\n }\n\n async setPrimaryWallet(partyId: PartyId): Promise<void> {\n const wallets = await this.getWallets()\n if (!wallets.some((w) => w.partyId === partyId)) {\n throw new Error(`Wallet with partyId \"${partyId}\" not found`)\n }\n\n const primary = wallets.find((w) => w.primary === true)\n\n await this.db.transaction().execute(async (trx) => {\n if (primary) {\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where('partyId', '=', primary.partyId)\n .execute()\n }\n await trx\n .updateTable('wallets')\n .set({ primary: 1 })\n .where('partyId', '=', partyId)\n .execute()\n })\n }\n\n async addWallet(wallet: Wallet): Promise<void> {\n this.logger.info('Adding wallet')\n const userId = this.assertConnected()\n\n const wallets = await this.getWallets()\n if (wallets.some((w) => w.partyId === wallet.partyId)) {\n throw new Error(\n `Wallet with partyId \"${wallet.partyId}\" already exists`\n )\n }\n\n if (wallets.length === 0) {\n // If this is the first wallet, set it as primary automatically\n wallet.primary = true\n }\n\n await this.db.transaction().execute(async (trx) => {\n if (wallet.primary) {\n // If the new wallet is primary, set all others to non-primary\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('primary', '=', 1),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n await trx\n .insertInto('wallets')\n .values(fromWallet(wallet, userId))\n .execute()\n })\n }\n\n // Session methods\n async getSession(): Promise<Session | undefined> {\n const sessions = await this.db\n .selectFrom('sessions')\n .selectAll()\n .executeTakeFirst()\n return sessions\n }\n\n async setSession(session: Session): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n await trx\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n await trx\n .insertInto('sessions')\n .values({ ...session, userId })\n .execute()\n })\n }\n\n async removeSession(): Promise<void> {\n const userId = this.assertConnected()\n await this.db\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n }\n\n // Network methods\n async getNetwork(chainId: string): Promise<Network> {\n this.assertConnected()\n\n const networks = await this.listNetworks()\n if (!networks) throw new Error('No networks available')\n\n const network = networks.find((n) => n.chainId === chainId)\n if (!network) throw new Error(`Network \"${chainId}\" not found`)\n return network\n }\n\n async getCurrentNetwork(): Promise<Network> {\n const session = await this.getSession()\n if (!session) {\n throw new Error('No session found')\n }\n const chainId = session.network\n if (!chainId) {\n throw new Error('No current network set in session')\n }\n\n const networks = await this.listNetworks()\n const network = networks.find((n) => n.chainId === chainId)\n if (!network) {\n throw new Error(`Network \"${chainId}\" not found`)\n }\n return network\n }\n\n async listNetworks(): Promise<Array<Network>> {\n let query = this.db.selectFrom('networks').selectAll()\n\n if (this.authContext) {\n const userId = this.assertConnected()\n query = query.where((eb) =>\n eb.or([\n eb('userId', 'is', null), // Global networks\n eb('userId', '=', userId), // User-specific networks\n ])\n )\n } else {\n query = query.where('userId', 'is', null) // Only global networks\n }\n\n const networks = await query.execute()\n const idps = await this.db.selectFrom('idps').selectAll().execute()\n const idpMap = new Map(idps.map((idp) => [idp.identityProviderId, idp]))\n return networks.map((table) =>\n toNetwork(table, idpMap.get(table.identityProviderId))\n )\n }\n\n async updateNetwork(network: Network): Promise<void> {\n const userId = this.assertConnected()\n // todo: check and compare userid of existing network\n await this.db.transaction().execute(async (trx) => {\n const networkEntry = fromNetwork(network, userId)\n this.logger.info(networkEntry, 'Updating network table')\n await trx\n .updateTable('networks')\n .set(networkEntry)\n .where('chainId', '=', network.chainId)\n .execute()\n\n const authEntry = fromAuth(network.auth)\n this.logger.info(authEntry, 'Updating auth table')\n await trx\n .updateTable('idps')\n .set(authEntry)\n .where(\n 'identityProviderId',\n '=',\n network.auth.identityProviderId\n )\n .execute()\n })\n }\n\n async addNetwork(network: Network): Promise<void> {\n const userId = this.authContext?.userId\n await this.db.transaction().execute(async (trx) => {\n const networkAlreadyExists = await trx\n .selectFrom('networks')\n .selectAll()\n .where('chainId', '=', network.chainId)\n .executeTakeFirst()\n if (networkAlreadyExists) {\n throw new Error(`Network ${network.chainId} already exists`)\n } else {\n await trx\n .insertInto('idps')\n .values(fromAuth(network.auth))\n .execute()\n await trx\n .insertInto('networks')\n .values(fromNetwork(network, userId))\n .execute()\n }\n })\n }\n\n async removeNetwork(chainId: string): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const network = await trx\n .selectFrom('networks')\n .selectAll()\n .where('chainId', '=', chainId)\n .executeTakeFirst()\n if (!network) {\n throw new Error(`Network ${chainId} does not exists`)\n }\n if (network.userId !== userId) {\n throw new Error(\n `Network ${chainId} is not owned by user ${userId}`\n )\n }\n await trx\n .deleteFrom('networks')\n .where('chainId', '=', chainId)\n .execute()\n await trx\n .deleteFrom('idps')\n .where('identityProviderId', '=', network.identityProviderId)\n .execute()\n })\n }\n\n // Transaction methods\n async setTransaction(transaction: Transaction): Promise<void> {\n const userId = this.assertConnected()\n\n const existing = await this.getTransaction(transaction.commandId)\n if (existing) {\n await this.db\n .updateTable('transactions')\n .set(fromTransaction(transaction, userId))\n .where('commandId', '=', transaction.commandId)\n .execute()\n } else {\n await this.db\n .insertInto('transactions')\n .values(fromTransaction(transaction, userId))\n .execute()\n }\n }\n\n async getTransaction(commandId: string): Promise<Transaction | undefined> {\n const userId = this.assertConnected()\n const transaction = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where((eb) =>\n eb.and([\n eb('commandId', '=', commandId),\n eb('userId', '=', userId),\n ])\n )\n .executeTakeFirst()\n return transaction ? toTransaction(transaction) : undefined\n }\n}\n\nexport const connection = (config: StoreConfig) => {\n switch (config.connection.type) {\n case 'sqlite':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(config.connection.database),\n }),\n plugins: [new CamelCasePlugin()],\n })\n case 'memory':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(':memory:'),\n }),\n plugins: [new CamelCasePlugin()],\n })\n default:\n throw new Error(\n `Unsupported database type: ${config.connection.type}`\n )\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 { Umzug, MigrationMeta, UmzugStorage } from 'umzug'\nimport { Kysely } from 'kysely'\nimport { DB } from './schema'\n\nclass KyselyStorage implements UmzugStorage {\n constructor(private db: Kysely<DB>) {}\n\n private async ensureTable() {\n await this.db.schema\n .createTable('migrations')\n .ifNotExists()\n .addColumn('name', 'text', (col) => col.primaryKey())\n .addColumn('executedAt', 'text', (col) => col.notNull())\n .execute()\n }\n\n async executed(): Promise<string[]> {\n await this.ensureTable()\n const rows = await this.db\n .selectFrom('migrations')\n .select('name')\n .execute()\n return rows.map((r) => r.name)\n }\n\n async logMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .insertInto('migrations')\n .values({ name, executedAt: new Date().toISOString() })\n .execute()\n }\n\n async unlogMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .deleteFrom('migrations')\n .where('name', '=', name)\n .execute()\n }\n}\n\nexport const migrator = (db: Kysely<DB>) => {\n const ext = import.meta.url.endsWith('.ts') ? 'ts' : 'js'\n const glob = new URL(`./migrations/*.${ext}`, import.meta.url).pathname\n return new Umzug({\n migrations: {\n glob: glob,\n resolve: ({ name, path, context }) => {\n // Dynamic import for ESM\n return {\n name,\n up: async () => {\n console.log(path)\n const { up } = await import(path!)\n return up(context)\n },\n down: async () => {\n const { down } = await import(path!)\n return down(context)\n },\n }\n },\n },\n context: db,\n storage: new KyselyStorage(db),\n logger: console,\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 { Kysely } from 'kysely'\nimport { StoreSql } from './store-sql.js'\nimport { StoreConfig } from '@canton-network/core-wallet-store'\nimport { Logger } from 'pino'\nimport { DB } from './schema'\n\nexport async function bootstrap(\n db: Kysely<DB>,\n config: StoreConfig,\n logger: Logger\n): Promise<void> {\n const store = new StoreSql(db, logger)\n await Promise.all(\n config.networks.map((network) => store.addNetwork(network))\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 { Command } from 'commander'\nimport { connection } from './store-sql.js'\nimport { migrator } from './migrator.js'\nimport type { StoreConfig } from '@canton-network/core-wallet-store'\nimport { pino } from 'pino'\nimport { bootstrap } from './bootstrap.js'\n\nconst logger = pino({ name: 'main', level: 'debug' })\n\nexport function createCLI(config: StoreConfig): Command {\n const program = new Command()\n\n program\n .command('up')\n .description('Run all pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('down')\n .description('Rollback last migration')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.down()\n await db.destroy()\n })\n\n program\n .command('status')\n .description('Show executed and pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n const pending = await umzug.pending()\n\n console.log('Executed migrations:', executed)\n console.log('Pending migrations:', pending)\n\n await db.destroy()\n })\n\n program\n .command('reset')\n .description('Rollback all migrations and reapply them')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n\n // Rollback all executed migrations in reverse order\n for (const migration of executed.reverse()) {\n await umzug.down({ to: migration.name })\n }\n\n // Reapply all migrations\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('bootstrap')\n .description('Bootstrap DB from config')\n .action(async () => {\n const db = connection(config)\n await bootstrap(db, config, logger)\n await db.destroy()\n })\n\n return program\n}\n"]}
1
+ {"version":3,"sources":["../src/schema.ts","../src/store-sql.ts","../src/migrator.ts","../src/bootstrap.ts","../src/cli.ts"],"names":["logger"],"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 { authSchema, Idp, UserId } from '@canton-network/core-wallet-auth'\nimport {\n Wallet,\n Transaction,\n Session,\n Network,\n} from '@canton-network/core-wallet-store'\n\ninterface MigrationTable {\n name: string\n executedAt: string\n}\n\ninterface IdpTable {\n id: string\n type: 'oauth' | 'self_signed'\n issuer: string\n configUrl: string | undefined\n}\n\ninterface NetworkTable {\n id: string\n name: string\n synchronizerId: string\n description: string\n ledgerApiBaseUrl: string\n identityProviderId: string\n userId: UserId | undefined // global if undefined\n\n auth: string // json stringified\n adminAuth: string | undefined // json stringified\n}\n\ninterface WalletTable {\n primary: number\n partyId: string\n hint: string\n publicKey: string\n namespace: string\n networkId: string\n signingProviderId: string\n userId: UserId\n externalTxId?: string\n topologyTransactions?: string\n status?: string\n}\n\ninterface TransactionTable {\n status: string\n commandId: string\n preparedTransaction: string\n preparedTransactionHash: string\n payload: string | undefined\n userId: UserId\n}\n\ninterface SessionTable extends Session {\n userId: UserId\n}\n\nexport interface DB {\n migrations: MigrationTable\n idps: IdpTable\n networks: NetworkTable\n wallets: WalletTable\n transactions: TransactionTable\n sessions: SessionTable\n}\n\nexport const toIdp = (table: IdpTable): Idp => {\n switch (table.type) {\n case 'oauth': {\n if (!table.configUrl) {\n throw new Error(`Missing configUrl for oauth IdP: ${table.id}`)\n }\n\n return {\n id: table.id,\n type: table.type,\n issuer: table.issuer,\n configUrl: table.configUrl,\n }\n }\n case 'self_signed':\n return {\n id: table.id,\n type: table.type,\n issuer: table.issuer,\n }\n }\n}\n\nexport const fromIdp = (idp: Idp): IdpTable => {\n switch (idp.type) {\n case 'oauth':\n return {\n id: idp.id,\n type: idp.type,\n issuer: idp.issuer,\n configUrl: idp.configUrl,\n }\n case 'self_signed':\n return {\n id: idp.id,\n type: idp.type,\n issuer: idp.issuer,\n configUrl: undefined,\n }\n }\n}\n\nexport const toNetwork = (table: NetworkTable): Network => {\n return {\n name: table.name,\n id: table.id,\n synchronizerId: table.synchronizerId,\n identityProviderId: table.identityProviderId,\n description: table.description,\n ledgerApi: {\n baseUrl: table.ledgerApiBaseUrl,\n },\n auth: authSchema.parse(JSON.parse(table.auth)),\n adminAuth: table.adminAuth\n ? authSchema.parse(JSON.parse(table.adminAuth))\n : undefined,\n }\n}\n\nexport const fromNetwork = (\n network: Network,\n userId?: UserId\n): NetworkTable => {\n return {\n name: network.name,\n id: network.id,\n synchronizerId: network.synchronizerId,\n description: network.description,\n ledgerApiBaseUrl: network.ledgerApi.baseUrl,\n userId: userId,\n identityProviderId: network.identityProviderId,\n auth: JSON.stringify(network.auth),\n adminAuth: network.adminAuth\n ? JSON.stringify(network.adminAuth)\n : undefined,\n }\n}\n\nexport const fromWallet = (wallet: Wallet, userId: UserId): WalletTable => {\n return {\n ...wallet,\n primary: wallet.primary ? 1 : 0,\n userId: userId,\n }\n}\n\nexport const toWallet = (table: WalletTable): Wallet => {\n return {\n ...table,\n primary: table.primary === 1,\n }\n}\n\nexport const fromTransaction = (\n transaction: Transaction,\n userId: UserId\n): TransactionTable => {\n return {\n ...transaction,\n payload: transaction.payload\n ? JSON.stringify(transaction.payload)\n : undefined,\n userId: userId,\n }\n}\n\nexport const toTransaction = (table: TransactionTable): Transaction => {\n return {\n ...table,\n status: table.status as 'pending' | 'signed' | 'executed' | 'failed',\n payload: table.payload ? JSON.parse(table.payload) : undefined,\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 { Logger } from 'pino'\nimport {\n AuthContext,\n UserId,\n AuthAware,\n assertConnected,\n Idp,\n} from '@canton-network/core-wallet-auth'\nimport {\n Store as BaseStore,\n Wallet,\n PartyId,\n Session,\n WalletFilter,\n Transaction,\n Network,\n StoreConfig,\n UpdateWallet,\n} from '@canton-network/core-wallet-store'\nimport { CamelCasePlugin, Kysely, SqliteDialect } from 'kysely'\nimport Database from 'better-sqlite3'\nimport {\n DB,\n fromIdp,\n fromNetwork,\n fromTransaction,\n fromWallet,\n toIdp,\n toNetwork,\n toTransaction,\n toWallet,\n} from './schema.js'\n\nexport class StoreSql implements BaseStore, AuthAware<StoreSql> {\n authContext: AuthContext | undefined\n\n constructor(\n private db: Kysely<DB>,\n private logger: Logger,\n authContext?: AuthContext\n ) {\n this.logger = logger.child({ component: 'StoreSql' })\n this.authContext = authContext\n\n // this.syncWallets()\n }\n\n withAuthContext(context?: AuthContext): StoreSql {\n return new StoreSql(this.db, this.logger, context)\n }\n\n private assertConnected(): UserId {\n return assertConnected(this.authContext).userId\n }\n\n // Wallet methods\n\n async getWallets(filter: WalletFilter = {}): Promise<Array<Wallet>> {\n const userId = this.assertConnected()\n const { networkIds, signingProviderIds } = filter\n const networkIdSet = networkIds ? new Set(networkIds) : null\n const signingProviderIdSet = signingProviderIds\n ? new Set(signingProviderIds)\n : null\n\n const wallets = await this.db\n .selectFrom('wallets')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n\n return wallets\n .filter((wallet) => {\n const matchedNetworkIds = networkIdSet\n ? networkIdSet.has(wallet.networkId)\n : true\n const matchedSigningProviderIds = signingProviderIdSet\n ? signingProviderIdSet.has(wallet.signingProviderId)\n : true\n return matchedNetworkIds && matchedSigningProviderIds\n })\n .map((table) =>\n toWallet({\n ...table,\n externalTxId: table.externalTxId ?? '',\n topologyTransactions: table.topologyTransactions ?? '',\n status: table.status ?? '',\n })\n )\n }\n\n async getPrimaryWallet(): Promise<Wallet | undefined> {\n const wallets = await this.getWallets()\n return wallets.find((w) => w.primary === true)\n }\n\n async setPrimaryWallet(partyId: PartyId): Promise<void> {\n const wallets = await this.getWallets()\n if (!wallets.some((w) => w.partyId === partyId)) {\n throw new Error(`Wallet with partyId \"${partyId}\" not found`)\n }\n\n const primary = wallets.find((w) => w.primary === true)\n\n await this.db.transaction().execute(async (trx) => {\n if (primary) {\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where('partyId', '=', primary.partyId)\n .execute()\n }\n await trx\n .updateTable('wallets')\n .set({ primary: 1 })\n .where('partyId', '=', partyId)\n .execute()\n })\n }\n\n async addWallet(wallet: Wallet): Promise<void> {\n this.logger.info('Adding wallet')\n const userId = this.assertConnected()\n\n const wallets = await this.getWallets()\n if (wallets.some((w) => w.partyId === wallet.partyId)) {\n throw new Error(\n `Wallet with partyId \"${wallet.partyId}\" already exists`\n )\n }\n\n if (wallets.length === 0) {\n // If this is the first wallet, set it as primary automatically\n wallet.primary = true\n }\n\n await this.db.transaction().execute(async (trx) => {\n if (wallet.primary) {\n // If the new wallet is primary, set all others to non-primary\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('primary', '=', 1),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n await trx\n .insertInto('wallets')\n .values(fromWallet(wallet, userId))\n .execute()\n })\n }\n\n async updateWallet({ status, partyId }: UpdateWallet): Promise<void> {\n this.logger.info('Updating wallet')\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .updateTable('wallets')\n .set({ status })\n .where('partyId', '=', partyId)\n .execute()\n })\n }\n\n async removeWallet(partyId: PartyId): Promise<void> {\n this.logger.info('Removing wallet')\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .deleteFrom('wallets')\n .where('partyId', '=', partyId)\n .execute()\n })\n }\n\n // Session methods\n async getSession(): Promise<Session | undefined> {\n const userId = this.assertConnected()\n const sessions = await this.db\n .selectFrom('sessions')\n .selectAll()\n .where('userId', '=', userId)\n .executeTakeFirst()\n return sessions\n }\n\n async setSession(session: Session): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const deleted = await trx\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n this.logger.debug(deleted, 'Deleted old session')\n const inserted = await trx\n .insertInto('sessions')\n .values({ ...session, userId })\n .execute()\n this.logger.debug(inserted, 'Inserted new session')\n })\n }\n\n async removeSession(): Promise<void> {\n const userId = this.assertConnected()\n await this.db\n .deleteFrom('sessions')\n .where('userId', '=', userId)\n .execute()\n }\n\n // IDP methods\n\n async getIdp(idpId: string): Promise<Idp> {\n this.assertConnected()\n\n const idps = await this.listIdps()\n if (!idps) throw new Error('No IDPs available')\n\n const idp = idps.find((n) => n.id === idpId)\n if (!idp) throw new Error(`IDP \"${idpId}\" not found`)\n return idp\n }\n\n async listIdps(): Promise<Array<Idp>> {\n // All IDPs are global for now -- TO-DO: user-specific IDPs\n const query = this.db.selectFrom('idps').selectAll()\n\n const idps = await query.execute()\n return idps.map((table) => toIdp(table))\n }\n\n async updateIdp(idp: Idp): Promise<void> {\n // todo: check and compare userid of existing idp\n await this.db.transaction().execute(async (trx) => {\n const idpEntry = fromIdp(idp)\n this.logger.info(idpEntry, 'Updating idp table')\n await trx\n .updateTable('idps')\n .set(idpEntry)\n .where('id', '=', idp.id)\n .execute()\n })\n }\n\n async addIdp(idp: Idp): Promise<void> {\n await this.db.transaction().execute(async (trx) => {\n const idpAlreadyExists = await trx\n .selectFrom('idps')\n .selectAll()\n .where('id', '=', idp.id)\n .executeTakeFirst()\n if (idpAlreadyExists) {\n throw new Error(`IDP ${idp.id} already exists`)\n } else {\n await trx.insertInto('idps').values(fromIdp(idp)).execute()\n }\n })\n }\n\n async removeIdp(idpId: string): Promise<void> {\n await this.db.transaction().execute(async (trx) => {\n const idp = await trx\n .selectFrom('idps')\n .selectAll()\n .where('id', '=', idpId)\n .executeTakeFirst()\n if (!idp) {\n throw new Error(`IDP ${idpId} does not exists`)\n }\n await trx.deleteFrom('idps').where('id', '=', idpId).execute()\n })\n }\n\n // Network methods\n async getNetwork(networkId: string): Promise<Network> {\n this.assertConnected()\n\n const networks = await this.listNetworks()\n if (!networks) throw new Error('No networks available')\n\n const network = networks.find((n) => n.id === networkId)\n if (!network) throw new Error(`Network \"${networkId}\" not found`)\n return network\n }\n\n async getCurrentNetwork(): Promise<Network> {\n const session = await this.getSession()\n if (!session) {\n throw new Error('No session found')\n }\n const networkId = session.network\n if (!networkId) {\n throw new Error('No current network set in session')\n }\n\n const networks = await this.listNetworks()\n const network = networks.find((n) => n.id === networkId)\n if (!network) {\n throw new Error(`Network \"${networkId}\" not found`)\n }\n return network\n }\n\n async listNetworks(): Promise<Array<Network>> {\n let query = this.db.selectFrom('networks').selectAll()\n\n if (this.authContext) {\n const userId = this.assertConnected()\n query = query.where((eb) =>\n eb.or([\n eb('userId', 'is', null), // Global networks\n eb('userId', '=', userId), // User-specific networks\n ])\n )\n } else {\n query = query.where('userId', 'is', null) // Only global networks\n }\n\n const networks = await query.execute()\n return networks.map((table) => toNetwork(table))\n }\n\n async updateNetwork(network: Network): Promise<void> {\n // todo: check and compare idpId of existing network\n this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n // we do not set a userId for now and leave all networks global when updating\n const networkEntry = fromNetwork(network, undefined)\n this.logger.info(networkEntry, 'Updating network table')\n await trx\n .updateTable('networks')\n .set(networkEntry)\n .where('id', '=', network.id)\n .execute()\n })\n }\n\n async addNetwork(network: Network): Promise<void> {\n const userId = this.authContext?.userId\n const idps = await this.listIdps()\n const networkIdp = idps.find(\n (idp) => idp.id === network.identityProviderId\n )\n\n if (!networkIdp) {\n throw new Error(\n `Identity provider \"${network.identityProviderId}\" not found`\n )\n }\n\n await this.db.transaction().execute(async (trx) => {\n const networkAlreadyExists = await trx\n .selectFrom('networks')\n .selectAll()\n .where('id', '=', network.id)\n .executeTakeFirst()\n if (networkAlreadyExists) {\n throw new Error(`Network ${network.id} already exists`)\n } else {\n await trx\n .insertInto('networks')\n .values(fromNetwork(network, userId))\n .execute()\n }\n })\n }\n\n async removeNetwork(networkId: string): Promise<void> {\n const userId = this.assertConnected()\n await this.db.transaction().execute(async (trx) => {\n const network = await trx\n .selectFrom('networks')\n .selectAll()\n .where('id', '=', networkId)\n .executeTakeFirst()\n if (!network) {\n throw new Error(`Network ${networkId} does not exists`)\n }\n if (network.userId !== userId) {\n throw new Error(\n `Network ${networkId} is not owned by user ${userId}`\n )\n }\n await trx\n .deleteFrom('networks')\n .where('id', '=', networkId)\n .execute()\n })\n }\n\n // Transaction methods\n async setTransaction(transaction: Transaction): Promise<void> {\n const userId = this.assertConnected()\n\n const existing = await this.getTransaction(transaction.commandId)\n if (existing) {\n await this.db\n .updateTable('transactions')\n .set(fromTransaction(transaction, userId))\n .where('commandId', '=', transaction.commandId)\n .execute()\n } else {\n await this.db\n .insertInto('transactions')\n .values(fromTransaction(transaction, userId))\n .execute()\n }\n }\n\n async getTransaction(commandId: string): Promise<Transaction | undefined> {\n const userId = this.assertConnected()\n const transaction = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where((eb) =>\n eb.and([\n eb('commandId', '=', commandId),\n eb('userId', '=', userId),\n ])\n )\n .executeTakeFirst()\n return transaction ? toTransaction(transaction) : undefined\n }\n}\n\nexport const connection = (config: StoreConfig) => {\n switch (config.connection.type) {\n case 'sqlite':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(config.connection.database),\n }),\n plugins: [new CamelCasePlugin()],\n })\n case 'memory':\n return new Kysely<DB>({\n dialect: new SqliteDialect({\n database: new Database(':memory:'),\n }),\n plugins: [new CamelCasePlugin()],\n })\n default:\n throw new Error(\n `Unsupported database type: ${config.connection.type}`\n )\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 { Umzug, MigrationMeta, UmzugStorage } from 'umzug'\nimport { Kysely } from 'kysely'\nimport { DB } from './schema'\n\nclass KyselyStorage implements UmzugStorage {\n constructor(private db: Kysely<DB>) {}\n\n private async ensureTable() {\n await this.db.schema\n .createTable('migrations')\n .ifNotExists()\n .addColumn('name', 'text', (col) => col.primaryKey())\n .addColumn('executedAt', 'text', (col) => col.notNull())\n .execute()\n }\n\n async executed(): Promise<string[]> {\n await this.ensureTable()\n const rows = await this.db\n .selectFrom('migrations')\n .select('name')\n .execute()\n return rows.map((r) => r.name)\n }\n\n async logMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .insertInto('migrations')\n .values({ name, executedAt: new Date().toISOString() })\n .execute()\n }\n\n async unlogMigration({ name }: MigrationMeta): Promise<void> {\n await this.ensureTable()\n await this.db\n .deleteFrom('migrations')\n .where('name', '=', name)\n .execute()\n }\n}\n\nexport const migrator = (db: Kysely<DB>) => {\n const ext = import.meta.url.endsWith('.ts') ? 'ts' : 'js'\n const glob = new URL(`./migrations/*.${ext}`, import.meta.url).pathname\n return new Umzug({\n migrations: {\n glob: glob,\n resolve: ({ name, path, context }) => {\n // Dynamic import for ESM\n return {\n name,\n up: async () => {\n console.log(path)\n const { up } = await import(path!)\n return up(context)\n },\n down: async () => {\n const { down } = await import(path!)\n return down(context)\n },\n }\n },\n },\n context: db,\n storage: new KyselyStorage(db),\n logger: console,\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 { Kysely } from 'kysely'\nimport { StoreSql } from './store-sql.js'\nimport { StoreConfig } from '@canton-network/core-wallet-store'\nimport { Logger } from 'pino'\nimport { DB } from './schema'\n\nexport async function bootstrap(\n db: Kysely<DB>,\n config: StoreConfig,\n logger: Logger\n): Promise<void> {\n const store = new StoreSql(db, logger)\n\n // Load all IDPs from config into the store\n await Promise.all(config.idps.map((idp) => store.addIdp(idp)))\n\n // Load all networks from config into the store\n await Promise.all(\n config.networks.map((network) => store.addNetwork(network))\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 { Command } from 'commander'\nimport { connection } from './store-sql.js'\nimport { migrator } from './migrator.js'\nimport type { StoreConfig } from '@canton-network/core-wallet-store'\nimport { pino } from 'pino'\nimport { bootstrap } from './bootstrap.js'\n\nconst logger = pino({ name: 'main', level: 'debug' })\n\nexport function createCLI(config: StoreConfig): Command {\n const program = new Command()\n\n program\n .command('up')\n .description('Run all pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('down')\n .description('Rollback last migration')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n await umzug.down()\n await db.destroy()\n })\n\n program\n .command('status')\n .description('Show executed and pending migrations')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n const pending = await umzug.pending()\n\n console.log('Executed migrations:', executed)\n console.log('Pending migrations:', pending)\n\n await db.destroy()\n })\n\n program\n .command('reset')\n .description('Rollback all migrations and reapply them')\n .action(async () => {\n const db = connection(config)\n const umzug = migrator(db)\n const executed = await umzug.executed()\n\n // Rollback all executed migrations in reverse order\n for (const migration of executed.reverse()) {\n await umzug.down({ to: migration.name })\n }\n\n // Reapply all migrations\n await umzug.up()\n await db.destroy()\n })\n\n program\n .command('bootstrap')\n .description('Bootstrap DB from config')\n .action(async () => {\n const db = connection(config)\n await bootstrap(db, config, logger)\n await db.destroy()\n })\n\n return program\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"001-init.d.ts","sourceRoot":"","sources":["../../src/migrations/001-init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEtD;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxD"}
1
+ {"version":3,"file":"001-init.d.ts","sourceRoot":"","sources":["../../src/migrations/001-init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEtD;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxD"}