@canton-network/core-wallet-store-sql 0.20.1 → 0.21.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.cjs +112 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +112 -28
- package/dist/index.js.map +1 -1
- package/dist/migrations/006-change-wallet-primary-key-to-composite.d.ts +5 -0
- package/dist/migrations/006-change-wallet-primary-key-to-composite.d.ts.map +1 -0
- package/dist/migrations/006-change-wallet-primary-key-to-composite.js +228 -0
- package/dist/migrations/007-add-unique-primary-per-network.d.ts +5 -0
- package/dist/migrations/007-add-unique-primary-per-network.d.ts.map +1 -0
- package/dist/migrations/007-add-unique-primary-per-network.js +62 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +5 -3
- package/dist/store-sql.d.ts +4 -3
- package/dist/store-sql.d.ts.map +1 -1
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +13 -0
- package/package.json +11 -9
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { assertConnected, authSchema } from '@canton-network/core-wallet-auth';
|
|
2
|
-
import { Kysely, CamelCasePlugin, SqliteDialect } from 'kysely';
|
|
2
|
+
import { Kysely, CamelCasePlugin, SqliteDialect, PostgresDialect } from 'kysely';
|
|
3
3
|
import Database from 'better-sqlite3';
|
|
4
|
+
import pg from 'pg';
|
|
4
5
|
import { Umzug } from 'umzug';
|
|
5
6
|
import { Command } from 'commander';
|
|
6
7
|
import { pino } from 'pino';
|
|
@@ -57,8 +58,12 @@ var toNetwork = (table) => {
|
|
|
57
58
|
ledgerApi: {
|
|
58
59
|
baseUrl: table.ledgerApiBaseUrl
|
|
59
60
|
},
|
|
60
|
-
auth: authSchema.parse(
|
|
61
|
-
|
|
61
|
+
auth: authSchema.parse(
|
|
62
|
+
typeof table.auth === "string" ? JSON.parse(table.auth) : table.auth
|
|
63
|
+
),
|
|
64
|
+
adminAuth: table.adminAuth ? authSchema.parse(
|
|
65
|
+
typeof table.adminAuth === "string" ? JSON.parse(table.adminAuth) : table.adminAuth
|
|
66
|
+
) : void 0
|
|
62
67
|
};
|
|
63
68
|
};
|
|
64
69
|
var fromNetwork = (network, userId) => {
|
|
@@ -92,7 +97,7 @@ var toWallet = (table) => {
|
|
|
92
97
|
throw new Error(`Missing wallet disabled reason: ${table.partyId}`);
|
|
93
98
|
}
|
|
94
99
|
return {
|
|
95
|
-
primary: table.primary
|
|
100
|
+
primary: Boolean(table.primary),
|
|
96
101
|
status: toWalletStatus(table.status),
|
|
97
102
|
partyId: table.partyId,
|
|
98
103
|
hint: table.hint,
|
|
@@ -139,8 +144,6 @@ var toTransaction = (table) => {
|
|
|
139
144
|
}
|
|
140
145
|
return result;
|
|
141
146
|
};
|
|
142
|
-
|
|
143
|
-
// src/store-sql.ts
|
|
144
147
|
var StoreSql = class _StoreSql {
|
|
145
148
|
constructor(db, logger2, authContext) {
|
|
146
149
|
this.db = db;
|
|
@@ -156,7 +159,7 @@ var StoreSql = class _StoreSql {
|
|
|
156
159
|
return assertConnected(this.authContext).userId;
|
|
157
160
|
}
|
|
158
161
|
// Wallet methods
|
|
159
|
-
async
|
|
162
|
+
async getAllWallets(filter = {}) {
|
|
160
163
|
const userId = this.assertConnected();
|
|
161
164
|
const { networkIds, signingProviderIds } = filter;
|
|
162
165
|
const networkIdSet = networkIds ? new Set(networkIds) : null;
|
|
@@ -186,61 +189,133 @@ var StoreSql = class _StoreSql {
|
|
|
186
189
|
})
|
|
187
190
|
);
|
|
188
191
|
}
|
|
192
|
+
async getWallets(filter = {}) {
|
|
193
|
+
const network = await this.getCurrentNetwork();
|
|
194
|
+
return this.getAllWallets({
|
|
195
|
+
...filter,
|
|
196
|
+
networkIds: [network.id]
|
|
197
|
+
});
|
|
198
|
+
}
|
|
189
199
|
async getPrimaryWallet() {
|
|
190
200
|
const wallets = await this.getWallets();
|
|
191
201
|
return wallets.find((w) => w.primary === true);
|
|
192
202
|
}
|
|
193
203
|
async setPrimaryWallet(partyId) {
|
|
204
|
+
const network = await this.getCurrentNetwork();
|
|
205
|
+
const userId = this.assertConnected();
|
|
194
206
|
const wallets = await this.getWallets();
|
|
195
207
|
if (!wallets.some((w) => w.partyId === partyId)) {
|
|
196
|
-
throw new Error(
|
|
208
|
+
throw new Error(
|
|
209
|
+
`Wallet with partyId "${partyId}" not found in network "${network.id}"`
|
|
210
|
+
);
|
|
197
211
|
}
|
|
198
212
|
const primary = wallets.find((w) => w.primary === true);
|
|
199
213
|
await this.db.transaction().execute(async (trx) => {
|
|
200
214
|
if (primary) {
|
|
201
|
-
await trx.updateTable("wallets").set({ primary: 0 }).where(
|
|
215
|
+
await trx.updateTable("wallets").set({ primary: 0 }).where(
|
|
216
|
+
(eb) => eb.and([
|
|
217
|
+
eb("partyId", "=", primary.partyId),
|
|
218
|
+
eb("networkId", "=", network.id),
|
|
219
|
+
eb("userId", "=", userId)
|
|
220
|
+
])
|
|
221
|
+
).execute();
|
|
202
222
|
}
|
|
203
|
-
await trx.updateTable("wallets").set({ primary: 1 }).where(
|
|
223
|
+
await trx.updateTable("wallets").set({ primary: 1 }).where(
|
|
224
|
+
(eb) => eb.and([
|
|
225
|
+
eb("partyId", "=", partyId),
|
|
226
|
+
eb("networkId", "=", network.id),
|
|
227
|
+
eb("userId", "=", userId)
|
|
228
|
+
])
|
|
229
|
+
).execute();
|
|
204
230
|
});
|
|
205
231
|
}
|
|
206
232
|
async addWallet(wallet) {
|
|
207
233
|
this.logger.info("Adding wallet");
|
|
208
234
|
const userId = this.assertConnected();
|
|
209
|
-
const wallets = await this.
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
}
|
|
215
|
-
if (wallets.length === 0) {
|
|
235
|
+
const wallets = await this.getAllWallets({
|
|
236
|
+
networkIds: [wallet.networkId]
|
|
237
|
+
});
|
|
238
|
+
const isFirstWallet = wallets.length === 0;
|
|
239
|
+
if (isFirstWallet) {
|
|
216
240
|
wallet.primary = true;
|
|
217
241
|
}
|
|
218
242
|
await this.db.transaction().execute(async (trx) => {
|
|
219
|
-
|
|
220
|
-
|
|
243
|
+
const existingWallet = await trx.selectFrom("wallets").selectAll().where(
|
|
244
|
+
(eb) => eb.and([
|
|
245
|
+
eb("partyId", "=", wallet.partyId),
|
|
246
|
+
eb("networkId", "=", wallet.networkId)
|
|
247
|
+
])
|
|
248
|
+
).executeTakeFirst();
|
|
249
|
+
if (existingWallet) {
|
|
250
|
+
this.logger.info(
|
|
251
|
+
{
|
|
252
|
+
partyId: wallet.partyId,
|
|
253
|
+
networkId: wallet.networkId,
|
|
254
|
+
oldUserId: existingWallet.userId,
|
|
255
|
+
newUserId: userId
|
|
256
|
+
},
|
|
257
|
+
"Updating existing wallet (possibly from different user)"
|
|
258
|
+
);
|
|
259
|
+
if (wallet.primary) {
|
|
260
|
+
await trx.updateTable("wallets").set({ primary: 0 }).where(
|
|
261
|
+
(eb) => eb.and([
|
|
262
|
+
eb("primary", "=", 1),
|
|
263
|
+
eb("networkId", "=", wallet.networkId),
|
|
264
|
+
eb("userId", "=", userId)
|
|
265
|
+
])
|
|
266
|
+
).execute();
|
|
267
|
+
}
|
|
268
|
+
await trx.updateTable("wallets").set(fromWallet(wallet, userId)).where(
|
|
221
269
|
(eb) => eb.and([
|
|
222
|
-
eb("
|
|
223
|
-
eb("
|
|
270
|
+
eb("partyId", "=", wallet.partyId),
|
|
271
|
+
eb("networkId", "=", wallet.networkId)
|
|
224
272
|
])
|
|
225
273
|
).execute();
|
|
274
|
+
} else {
|
|
275
|
+
if (wallet.primary) {
|
|
276
|
+
await trx.updateTable("wallets").set({ primary: 0 }).where(
|
|
277
|
+
(eb) => eb.and([
|
|
278
|
+
eb("primary", "=", 1),
|
|
279
|
+
eb("networkId", "=", wallet.networkId),
|
|
280
|
+
eb("userId", "=", userId)
|
|
281
|
+
])
|
|
282
|
+
).execute();
|
|
283
|
+
}
|
|
284
|
+
await trx.insertInto("wallets").values(fromWallet(wallet, userId)).execute();
|
|
226
285
|
}
|
|
227
|
-
await trx.insertInto("wallets").values(fromWallet(wallet, userId)).execute();
|
|
228
286
|
});
|
|
229
287
|
}
|
|
230
288
|
async updateWallet({
|
|
231
289
|
status,
|
|
232
290
|
partyId,
|
|
291
|
+
networkId,
|
|
233
292
|
externalTxId
|
|
234
293
|
}) {
|
|
235
294
|
this.logger.info("Updating wallet");
|
|
295
|
+
const userId = this.assertConnected();
|
|
296
|
+
const targetNetworkId = networkId ?? (await this.getCurrentNetwork()).id;
|
|
236
297
|
await this.db.transaction().execute(async (trx) => {
|
|
237
|
-
await trx.updateTable("wallets").set({ status, externalTxId }).where(
|
|
298
|
+
await trx.updateTable("wallets").set({ status, externalTxId }).where(
|
|
299
|
+
(eb) => eb.and([
|
|
300
|
+
eb("partyId", "=", partyId),
|
|
301
|
+
eb("networkId", "=", targetNetworkId),
|
|
302
|
+
eb("userId", "=", userId)
|
|
303
|
+
])
|
|
304
|
+
).execute();
|
|
238
305
|
});
|
|
239
306
|
}
|
|
240
307
|
async removeWallet(partyId) {
|
|
241
308
|
this.logger.info("Removing wallet");
|
|
309
|
+
const userId = this.assertConnected();
|
|
310
|
+
const network = await this.getCurrentNetwork();
|
|
242
311
|
await this.db.transaction().execute(async (trx) => {
|
|
243
|
-
await trx.deleteFrom("wallets").where(
|
|
312
|
+
await trx.deleteFrom("wallets").where(
|
|
313
|
+
(eb) => eb.and([
|
|
314
|
+
eb("partyId", "=", partyId),
|
|
315
|
+
eb("networkId", "=", network.id),
|
|
316
|
+
eb("userId", "=", userId)
|
|
317
|
+
])
|
|
318
|
+
).execute();
|
|
244
319
|
});
|
|
245
320
|
}
|
|
246
321
|
// Session methods
|
|
@@ -429,6 +504,19 @@ var connection = (config) => {
|
|
|
429
504
|
}),
|
|
430
505
|
plugins: [new CamelCasePlugin()]
|
|
431
506
|
});
|
|
507
|
+
case "postgres":
|
|
508
|
+
return new Kysely({
|
|
509
|
+
dialect: new PostgresDialect({
|
|
510
|
+
pool: new pg.Pool({
|
|
511
|
+
database: config.connection.database,
|
|
512
|
+
user: config.connection.user,
|
|
513
|
+
password: config.connection.password,
|
|
514
|
+
port: config.connection.port,
|
|
515
|
+
host: config.connection.host
|
|
516
|
+
})
|
|
517
|
+
}),
|
|
518
|
+
plugins: [new CamelCasePlugin()]
|
|
519
|
+
});
|
|
432
520
|
case "memory":
|
|
433
521
|
return new Kysely({
|
|
434
522
|
dialect: new SqliteDialect({
|
|
@@ -436,10 +524,6 @@ var connection = (config) => {
|
|
|
436
524
|
}),
|
|
437
525
|
plugins: [new CamelCasePlugin()]
|
|
438
526
|
});
|
|
439
|
-
default:
|
|
440
|
-
throw new Error(
|
|
441
|
-
`Unsupported database type: ${config.connection.type}`
|
|
442
|
-
);
|
|
443
527
|
}
|
|
444
528
|
};
|
|
445
529
|
var KyselyStorage = class {
|
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-2026 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 WalletStatus,\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 | null // retrieved at runtime if null\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 disabled: number\n reason?: string\n}\n\ninterface TransactionTable {\n status: string\n commandId: string\n preparedTransaction: string\n preparedTransactionHash: string\n payload: string | undefined\n origin: string | null\n userId: UserId\n createdAt: string | null\n signedAt: string | null\n}\n\ninterface SessionTable extends Session {\n id: string\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 ?? undefined,\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 ?? null,\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 disabled: wallet.disabled !== undefined && wallet.disabled ? 1 : 0,\n ...(wallet.disabled === true &&\n wallet.reason !== undefined && { reason: wallet.reason }),\n }\n}\n\nexport const toWalletStatus = (status?: string): WalletStatus => {\n if (status === 'allocated') return 'allocated'\n return 'initialized'\n}\n\nexport const toWallet = (table: WalletTable): Wallet => {\n if (table.disabled === 1 && table.reason === undefined) {\n throw new Error(`Missing wallet disabled reason: ${table.partyId}`)\n }\n return {\n primary: table.primary === 1,\n status: toWalletStatus(table.status),\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n disabled: table.disabled === 1,\n ...(table.externalTxId !== undefined && {\n externalTxId: table.externalTxId,\n }),\n ...(table.topologyTransactions !== undefined && {\n topologyTransactions: table.topologyTransactions,\n }),\n ...(table.disabled === 1 &&\n table.reason !== undefined && {\n reason: table.reason,\n }),\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 origin: transaction.origin || null,\n userId: userId,\n createdAt: transaction.createdAt?.toISOString() || null,\n signedAt: transaction.signedAt?.toISOString() || null,\n }\n}\n\nexport const toTransaction = (table: TransactionTable): Transaction => {\n const result: Transaction = {\n commandId: table.commandId,\n status: table.status as 'pending' | 'signed' | 'executed' | 'failed',\n preparedTransaction: table.preparedTransaction,\n preparedTransactionHash: table.preparedTransactionHash,\n payload: table.payload ? JSON.parse(table.payload) : undefined,\n origin: table.origin || null,\n }\n\n if (table.createdAt) {\n result.createdAt = new Date(table.createdAt)\n }\n\n if (table.signedAt) {\n result.signedAt = new Date(table.signedAt)\n }\n\n return result\n}\n","// Copyright (c) 2025-2026 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\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 primary: table.primary,\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n userId: table.userId,\n externalTxId: table.externalTxId ?? '',\n topologyTransactions: table.topologyTransactions ?? '',\n status: table.status ?? '',\n disabled: table.disabled ?? 0,\n ...(table.reason !== undefined && {\n reason: table.reason,\n }),\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({\n status,\n partyId,\n externalTxId,\n }: 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, externalTxId })\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 const networks = await this.listNetworks()\n if (networks.some((n) => n.identityProviderId === idpId)) {\n throw new Error(\n `Cannot delete IDP ${idpId} as it is in use by existing networks`\n )\n }\n\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 async listTransactions(): Promise<Array<Transaction>> {\n const userId = this.assertConnected()\n const transactions = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n return transactions.map((table) => toTransaction(table))\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-2026 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-2026 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-2026 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-2026 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 WalletStatus,\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 | null // retrieved at runtime if null\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 disabled: number\n reason?: string\n}\n\ninterface TransactionTable {\n status: string\n commandId: string\n preparedTransaction: string\n preparedTransactionHash: string\n payload: string | undefined\n origin: string | null\n userId: UserId\n createdAt: string | null\n signedAt: string | null\n}\n\ninterface SessionTable extends Session {\n id: string\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 ?? undefined,\n identityProviderId: table.identityProviderId,\n description: table.description,\n ledgerApi: {\n baseUrl: table.ledgerApiBaseUrl,\n },\n auth: authSchema.parse(\n typeof table.auth === 'string' ? JSON.parse(table.auth) : table.auth\n ),\n adminAuth: table.adminAuth\n ? authSchema.parse(\n typeof table.adminAuth === 'string'\n ? JSON.parse(table.adminAuth)\n : table.adminAuth\n )\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 ?? null,\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 disabled: wallet.disabled !== undefined && wallet.disabled ? 1 : 0,\n ...(wallet.disabled === true &&\n wallet.reason !== undefined && { reason: wallet.reason }),\n }\n}\n\nexport const toWalletStatus = (status?: string): WalletStatus => {\n if (status === 'allocated') return 'allocated'\n return 'initialized'\n}\n\nexport const toWallet = (table: WalletTable): Wallet => {\n if (table.disabled === 1 && table.reason === undefined) {\n throw new Error(`Missing wallet disabled reason: ${table.partyId}`)\n }\n return {\n primary: Boolean(table.primary),\n status: toWalletStatus(table.status),\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n disabled: table.disabled === 1,\n ...(table.externalTxId !== undefined && {\n externalTxId: table.externalTxId,\n }),\n ...(table.topologyTransactions !== undefined && {\n topologyTransactions: table.topologyTransactions,\n }),\n ...(table.disabled === 1 &&\n table.reason !== undefined && {\n reason: table.reason,\n }),\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 origin: transaction.origin || null,\n userId: userId,\n createdAt: transaction.createdAt?.toISOString() || null,\n signedAt: transaction.signedAt?.toISOString() || null,\n }\n}\n\nexport const toTransaction = (table: TransactionTable): Transaction => {\n const result: Transaction = {\n commandId: table.commandId,\n status: table.status as 'pending' | 'signed' | 'executed' | 'failed',\n preparedTransaction: table.preparedTransaction,\n preparedTransactionHash: table.preparedTransactionHash,\n payload: table.payload ? JSON.parse(table.payload) : undefined,\n origin: table.origin || null,\n }\n\n if (table.createdAt) {\n result.createdAt = new Date(table.createdAt)\n }\n\n if (table.signedAt) {\n result.signedAt = new Date(table.signedAt)\n }\n\n return result\n}\n","// Copyright (c) 2025-2026 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 CurrentNetworkWalletFilter,\n} from '@canton-network/core-wallet-store'\nimport { CamelCasePlugin, Kysely, PostgresDialect, 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'\nimport pg from 'pg'\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\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 getAllWallets(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 primary: table.primary,\n partyId: table.partyId,\n hint: table.hint,\n publicKey: table.publicKey,\n namespace: table.namespace,\n networkId: table.networkId,\n signingProviderId: table.signingProviderId,\n userId: table.userId,\n externalTxId: table.externalTxId ?? '',\n topologyTransactions: table.topologyTransactions ?? '',\n status: table.status ?? '',\n disabled: table.disabled ?? 0,\n ...(table.reason !== undefined && {\n reason: table.reason,\n }),\n })\n )\n }\n\n async getWallets(\n filter: CurrentNetworkWalletFilter = {}\n ): Promise<Array<Wallet>> {\n const network = await this.getCurrentNetwork()\n return this.getAllWallets({\n ...filter,\n networkIds: [network.id],\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 network = await this.getCurrentNetwork()\n const userId = this.assertConnected()\n const wallets = await this.getWallets()\n\n if (!wallets.some((w) => w.partyId === partyId)) {\n throw new Error(\n `Wallet with partyId \"${partyId}\" not found in network \"${network.id}\"`\n )\n }\n\n const primary = wallets.find((w) => w.primary === true)\n\n await this.db.transaction().execute(async (trx) => {\n if (primary) {\n // Unset primary for current network only\n await trx\n .updateTable('wallets')\n .set({ primary: 0 })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', primary.partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n // Set new primary for current network\n await trx\n .updateTable('wallets')\n .set({ primary: 1 })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\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 // Check if this is the first wallet in this network for this user\n const wallets = await this.getAllWallets({\n networkIds: [wallet.networkId],\n })\n const isFirstWallet = wallets.length === 0\n if (isFirstWallet) {\n wallet.primary = true\n }\n\n await this.db.transaction().execute(async (trx) => {\n // Check if wallet already exists (possibly from a different user)\n const existingWallet = await trx\n .selectFrom('wallets')\n .selectAll()\n .where((eb) =>\n eb.and([\n eb('partyId', '=', wallet.partyId),\n eb('networkId', '=', wallet.networkId),\n ])\n )\n .executeTakeFirst()\n\n if (existingWallet) {\n // Wallet exists - update it (handles case where network was edited to use different user)\n this.logger.info(\n {\n partyId: wallet.partyId,\n networkId: wallet.networkId,\n oldUserId: existingWallet.userId,\n newUserId: userId,\n },\n 'Updating existing wallet (possibly from different user)'\n )\n\n if (wallet.primary) {\n // If the new wallet is primary, set all others in the same network 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('networkId', '=', wallet.networkId),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n }\n\n // Update the existing wallet with new data and user\n await trx\n .updateTable('wallets')\n .set(fromWallet(wallet, userId))\n .where((eb) =>\n eb.and([\n eb('partyId', '=', wallet.partyId),\n eb('networkId', '=', wallet.networkId),\n ])\n )\n .execute()\n } else {\n // Wallet doesn't exist - insert it\n if (wallet.primary) {\n // If the new wallet is primary, set all others in the same network 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('networkId', '=', wallet.networkId),\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\n async updateWallet({\n status,\n partyId,\n networkId,\n externalTxId,\n }: UpdateWallet): Promise<void> {\n this.logger.info('Updating wallet')\n const userId = this.assertConnected()\n\n // Use provided networkId or get current network from session\n const targetNetworkId = networkId ?? (await this.getCurrentNetwork()).id\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .updateTable('wallets')\n .set({ status, externalTxId })\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', targetNetworkId),\n eb('userId', '=', userId),\n ])\n )\n .execute()\n })\n }\n\n async removeWallet(partyId: PartyId): Promise<void> {\n this.logger.info('Removing wallet')\n const userId = this.assertConnected()\n\n // Remove wallet from current network only\n const network = await this.getCurrentNetwork()\n\n await this.db.transaction().execute(async (trx) => {\n await trx\n .deleteFrom('wallets')\n .where((eb) =>\n eb.and([\n eb('partyId', '=', partyId),\n eb('networkId', '=', network.id),\n eb('userId', '=', userId),\n ])\n )\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 const networks = await this.listNetworks()\n if (networks.some((n) => n.identityProviderId === idpId)) {\n throw new Error(\n `Cannot delete IDP ${idpId} as it is in use by existing networks`\n )\n }\n\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 async listTransactions(): Promise<Array<Transaction>> {\n const userId = this.assertConnected()\n const transactions = await this.db\n .selectFrom('transactions')\n .selectAll()\n .where('userId', '=', userId)\n .execute()\n return transactions.map((table) => toTransaction(table))\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 'postgres':\n return new Kysely<DB>({\n dialect: new PostgresDialect({\n pool: new pg.Pool({\n database: config.connection.database,\n user: config.connection.user,\n password: config.connection.password,\n port: config.connection.port,\n host: config.connection.host,\n }),\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 }\n}\n","// Copyright (c) 2025-2026 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-2026 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-2026 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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"006-change-wallet-primary-key-to-composite.d.ts","sourceRoot":"","sources":["../../src/migrations/006-change-wallet-primary-key-to-composite.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAA;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AA2BjC,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqItD;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FxD"}
|