@canton-network/core-ledger-client
Advanced tools
| import { vi, type MockedObject } from 'vitest'; | ||
| import { Logger } from 'pino'; | ||
| import { AccessTokenProvider } from '@canton-network/core-wallet-auth'; | ||
| import { LedgerClient } from './ledger-client.js'; | ||
| export declare const BASE_URL: URL; | ||
| export declare const mockLogger: MockedObject<Logger>; | ||
| export declare function createAccessTokenProvider(token?: string | undefined): AccessTokenProvider; | ||
| export declare function createLedgerClient(accessTokenProvider?: AccessTokenProvider, version?: '3.4' | '3.5'): LedgerClient; | ||
| export declare function jsonResponse(data: unknown, status?: number): Response; | ||
| export declare function grpcError(message: string): { | ||
| code: number; | ||
| message: string; | ||
| details: unknown[]; | ||
| }; | ||
| export declare function getRequestMethod(fetchMock: ReturnType<typeof vi.fn>, pathSuffix: string): string | undefined; | ||
| export declare function getRequestHeaders(fetchMock: ReturnType<typeof vi.fn>, pathSuffix: string): Record<string, string>; | ||
| //# sourceMappingURL=test-utils.d.ts.map |
| {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,eAAO,MAAM,QAAQ,KAAqC,CAAA;AAW1D,eAAO,MAAM,UAAU,EAAwB,YAAY,CAAC,MAAM,CAAC,CAAA;AAEnE,wBAAgB,yBAAyB,CACrC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAC3B,mBAAmB,CAKrB;AAED,wBAAgB,kBAAkB,CAC9B,mBAAmB,sBAA4C,EAC/D,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,gBAQ1B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,SAAM,GAAG,QAAQ,CAKlE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM;;;aACK,OAAO,EAAE;EACtD;AAsBD,wBAAgB,gBAAgB,CAC5B,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EACnC,UAAU,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EACnC,UAAU,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxB"} |
+16
-10
@@ -90,4 +90,4 @@ 'use strict'; | ||
| }; | ||
| async function retryable(fn, retryableOptions2, logger) { | ||
| for (let attempts = 1; attempts <= retryableOptions2.retries; attempts++) { | ||
| async function retryable(fn, retryableOptions, logger) { | ||
| for (let attempts = 1; attempts <= retryableOptions.retries; attempts++) { | ||
| try { | ||
@@ -98,11 +98,11 @@ return await fn(); | ||
| const message = grpcError.message; | ||
| const shouldRetry = retryableOptions2.cantonErrorKeys.length === 0 || retryableOptions2.cantonErrorKeys.some( | ||
| const shouldRetry = retryableOptions.cantonErrorKeys.length === 0 || retryableOptions.cantonErrorKeys.some( | ||
| (key) => message.includes(key) | ||
| ); | ||
| if (attempts < retryableOptions2.retries && shouldRetry) { | ||
| if (attempts < retryableOptions.retries && shouldRetry) { | ||
| logger?.warn( | ||
| `Caught retryiable error: ${message}. Retrying attempt ${attempts} of ${retryableOptions2.retries}...` | ||
| `Caught retryiable error: ${message}. Retrying attempt ${attempts} of ${retryableOptions.retries}...` | ||
| ); | ||
| await new Promise( | ||
| (res) => setTimeout(res, retryableOptions2.delayMs) | ||
| (res) => setTimeout(res, retryableOptions.delayMs) | ||
| ); | ||
@@ -198,7 +198,13 @@ } else { | ||
| if (!this.initialized) { | ||
| this.logger.debug({ | ||
| message: `Initializing LedgerClient with version ${this.clientVersion} for url ${this.baseUrl.href}` | ||
| }); | ||
| this.logger.debug( | ||
| `Initializing LedgerClient with version ${this.clientVersion} for url ${this.baseUrl.href}` | ||
| ); | ||
| const versionFromClient = await this.currentClient.GET("/v2/version"); | ||
| this.logger.debug(versionFromClient, "getV2Version response"); | ||
| this.logger.debug( | ||
| { | ||
| data: versionFromClient.data, | ||
| status: versionFromClient.response.status | ||
| }, | ||
| "getV2Version response" | ||
| ); | ||
| this.clientVersion = this.parseSupportedVersions( | ||
@@ -205,0 +211,0 @@ versionFromClient.data?.version |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/ledger-api-utils.ts","../src/ledger-client.ts"],"names":["retryableOptions","ErrorInfo","RetryInfo","supportedLedgerApiVersions","version","createClient"],"mappings":"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","file":"index.cjs","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 { LedgerClient } from './ledger-client.js'\n\nimport { Types } from './ledger-client.js'\nimport { PartyId } from '@canton-network/core-types'\n\nimport { Logger } from '@canton-network/core-types'\nimport { ErrorInfo, RetryInfo } from '@canton-network/core-ledger-proto'\n\ntype Completion = Types['Completion']['value']\nexport type JSContractEntry = Types['JsContractEntry']\nexport type JsCantonError = Types['JsCantonError']\n\nconst COMPLETIONS_LIMIT = '100'\nconst COMPLETIONS_STREAM_IDLE_TIMEOUT_MS = '1000'\n\n/**\n * Polls the completions endpoint until\n * the completion with the given (userId, commandId, submissionId) is returned.\n * Then returns the updateId, synchronizerId and recordTime of that completion.\n */\nexport async function awaitCompletion(\n ledgerClient: LedgerClient,\n ledgerEnd: number,\n partyId: PartyId,\n userId: string,\n commandIdOrSubmissionId: string\n): Promise<Completion> {\n const responses = await ledgerClient.postWithRetry(\n '/v2/commands/completions',\n {\n userId,\n parties: [partyId],\n beginExclusive: ledgerEnd,\n },\n defaultRetryableOptions,\n {\n query: {\n limit: COMPLETIONS_LIMIT,\n stream_idle_timeout_ms: COMPLETIONS_STREAM_IDLE_TIMEOUT_MS,\n },\n }\n )\n\n const completions = responses.filter(\n (r) => r.completionResponse && 'Completion' in r.completionResponse\n )\n\n const wantedCompletion = responses.find((r) => {\n if (r.completionResponse && 'Completion' in r.completionResponse) {\n const completion = r.completionResponse.Completion?.value\n if (!completion) {\n return false\n }\n return (\n completion.userId === userId &&\n (completion.commandId === commandIdOrSubmissionId ||\n completion.submissionId === commandIdOrSubmissionId)\n )\n }\n return false\n })\n\n if (\n wantedCompletion?.completionResponse &&\n 'Completion' in wantedCompletion.completionResponse\n ) {\n const completion = wantedCompletion.completionResponse.Completion.value\n const status = completion.status\n if (status && status.code !== 0) {\n // status.code is 0 for success\n throw asGrpcError(status)\n }\n return completion\n } else {\n const lastCompletion = completions[completions.length - 1]\n const newLedgerEnd =\n lastCompletion?.completionResponse &&\n 'Completion' in lastCompletion.completionResponse\n ? lastCompletion.completionResponse.Completion.value.offset\n : undefined\n\n return awaitCompletion(\n ledgerClient,\n newLedgerEnd || ledgerEnd, // !newLedgerEnd implies response was empty\n partyId,\n userId,\n commandIdOrSubmissionId\n )\n }\n}\n\nexport async function promiseWithTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage: string\n): Promise<T> {\n let timeoutPid: NodeJS.Timeout | null = null\n const timeoutPromise: Promise<T> = new Promise((_resolve, reject) => {\n timeoutPid = setTimeout(() => reject(errorMessage), timeoutMs)\n })\n\n try {\n return await Promise.race([promise, timeoutPromise])\n } finally {\n if (timeoutPid) {\n clearTimeout(timeoutPid)\n }\n }\n}\n\nexport type retryableOptions = {\n retries: number\n delayMs: number\n cantonErrorKeys: string[]\n}\nexport const defaultRetryableOptions: retryableOptions = {\n retries: 5,\n delayMs: 3000,\n cantonErrorKeys: [\n 'SEQUENCER_REQUEST_FAILED',\n 'SEQUENCER_BACKPRESSURE',\n 'SUBMISSION_ALREADY_IN_FLIGHT',\n 'LOCAL_VERDICT_TIMEOUT',\n 'NOT_SEQUENCED_TIMEOUT',\n 'NO_VIEW_WITH_VALID_RECIPIENTS',\n ],\n}\n\nexport async function retryable<T>(\n fn: () => Promise<T>,\n retryableOptions: retryableOptions,\n logger?: Logger\n): Promise<T> {\n for (let attempts = 1; attempts <= retryableOptions.retries; attempts++) {\n try {\n return await fn()\n } catch (err: unknown) {\n const grpcError = asGrpcError(err)\n const message: string = grpcError.message\n const shouldRetry =\n retryableOptions.cantonErrorKeys.length === 0 ||\n retryableOptions.cantonErrorKeys.some((key) =>\n message.includes(key)\n )\n if (attempts < retryableOptions.retries && shouldRetry) {\n logger?.warn(\n `Caught retryiable error: ${message}. Retrying attempt ${attempts} of ${retryableOptions.retries}...`\n )\n await new Promise((res) =>\n setTimeout(res, retryableOptions.delayMs)\n )\n // continue to next attempt\n } else {\n throw grpcError\n }\n }\n }\n throw new Error('retryable: Exceeded maximum retries without throwing.')\n}\n\n// Helper for differentiating ledger errors from others and satisfying TS when checking error properties\nexport const isJsCantonError = (e: unknown): e is JsCantonError =>\n typeof e === 'object' &&\n e !== null &&\n 'code' in e &&\n 'cause' in e &&\n 'errorCategory' in e\n\nexport const asJsCantonError = (e: unknown): JsCantonError => {\n if (isJsCantonError(e)) {\n return e\n } else {\n throw e\n }\n}\n\nexport const asGrpcError = (\n e: unknown\n): {\n code: number\n message: string\n errorInfo: ErrorInfo | undefined\n retryInfo: RetryInfo | undefined\n} => {\n let errorInfo: ErrorInfo | undefined\n let retryInfo: RetryInfo | undefined\n\n if (\n typeof e === 'object' &&\n e !== null &&\n 'code' in e &&\n 'message' in e &&\n 'details' in e &&\n Array.isArray(e.details)\n ) {\n const code = e.code as number\n const message = e.message as string\n\n for (const detail of e.details) {\n if (\n detail.typeUrl === 'type.googleapis.com/google.rpc.ErrorInfo' &&\n typeof detail.value === 'string'\n ) {\n try {\n errorInfo = ErrorInfo.fromBinary(\n Buffer.from(detail.value, 'base64')\n )\n } catch {\n //if parsing fails, we skip adding ErrorInfo\n }\n } else if (\n detail.typeUrl === 'type.googleapis.com/google.rpc.RetryInfo' &&\n typeof detail.value === 'string'\n ) {\n try {\n retryInfo = RetryInfo.fromBinary(\n Buffer.from(detail.value, 'base64')\n )\n } catch {\n //if parsing fails, we skip adding RetryInfo\n }\n }\n }\n return { code, message, errorInfo, retryInfo }\n }\n\n // Not a gRPC error, rethrow\n throw e\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 {\n supportedLedgerApiVersions,\n type LedgerApiVersion,\n type LedgerCommonPaths,\n type LedgerCommonSchemas,\n} from '@canton-network/core-ledger-client-types'\nimport createClient, { Client, FetchOptions } from 'openapi-fetch'\nimport { Logger } from 'pino'\nimport { PartyId } from '@canton-network/core-types'\nimport {\n asJsCantonError,\n defaultRetryableOptions,\n retryable,\n retryableOptions,\n} from './ledger-api-utils.js'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport const supportedVersions = supportedLedgerApiVersions\n\nexport type SupportedVersions = LedgerApiVersion\n\ntype paths = LedgerCommonPaths\n\ntype SchemaByVersion<Name extends keyof LedgerCommonSchemas> =\n LedgerCommonSchemas[Name]\n\ntype ClientsByVersion = {\n [V in SupportedVersions]: Client<paths>\n}\n\nexport type UserSchema = SchemaByVersion<'User'>\n\nexport type Types = LedgerCommonSchemas\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\nexport type PatchEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n patch: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PatchRequest<Path extends PatchEndpoint> = paths[Path] extends {\n patch: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PatchResponse<Path extends PatchEndpoint> = paths[Path] extends {\n patch: {\n responses: { 200: { content: { 'application/json': infer Res } } }\n }\n}\n ? Res\n : never\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\nexport type PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\nexport type GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport type GenerateTransactionResponse =\n SchemaByVersion<'GenerateExternalPartyTopologyResponse'>\n\nexport type AllocateExternalPartyResponse =\n SchemaByVersion<'AllocateExternalPartyResponse'>\nexport type OnboardingTransactions = NonNullable<\n SchemaByVersion<'AllocateExternalPartyRequest'>['onboardingTransactions']\n>\n\nexport type MultiHashSignatures = NonNullable<\n SchemaByVersion<'AllocateExternalPartyRequest'>['multiHashSignatures']\n>\nexport type PrepareSubmissionResponse =\n SchemaByVersion<'JsPrepareSubmissionResponse'>\n\n// Any options the client accepts besides body/params\ntype ExtraPostOpts = Omit<FetchOptions<paths>, 'body' | 'params'>\n\nexport class LedgerClient {\n // privately manage the active connected version and associated client codegen\n private readonly clients: ClientsByVersion\n private clientVersion: SupportedVersions = '3.5'\n private initialized: boolean = false\n private accessTokenProvider: AccessTokenProvider\n private readonly logger: Logger\n private synchronizerId: string | undefined\n baseUrl: URL\n\n constructor({\n baseUrl,\n logger,\n accessTokenProvider,\n version,\n }: {\n baseUrl: URL\n logger: Logger\n accessTokenProvider: AccessTokenProvider\n version?: SupportedVersions\n }) {\n this.logger = logger.child({ component: 'LedgerClient' })\n this.accessTokenProvider = accessTokenProvider\n\n const authenticatedFetch = async (\n url: RequestInfo,\n options: RequestInit = {}\n ) => {\n const token = await this.accessTokenProvider.getAccessToken()\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token && { Authorization: `Bearer ${token}` }),\n },\n })\n }\n\n this.clients = {\n ...supportedVersions.reduce((acc, version) => {\n acc[version] = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: authenticatedFetch,\n })\n return acc\n }, {} as ClientsByVersion),\n }\n\n this.clientVersion = version ?? this.clientVersion\n this.baseUrl = baseUrl\n }\n\n private get currentClient(): Client<paths> {\n return this.clients[this.clientVersion] as unknown as Client<paths>\n }\n\n public async init() {\n if (!this.initialized) {\n this.logger.debug({\n message: `Initializing LedgerClient with version ${this.clientVersion} for url ${this.baseUrl.href}`,\n })\n\n //TODO: parse error response and escalate\n const versionFromClient =\n await this.currentClient.GET('/v2/version')\n\n this.logger.debug(versionFromClient, 'getV2Version response')\n\n this.clientVersion = this.parseSupportedVersions(\n versionFromClient.data?.version\n )\n this.initialized = true\n }\n }\n\n public getCurrentClientVersion(): SupportedVersions {\n return this.clientVersion\n }\n\n parseSupportedVersions(version: string | undefined): SupportedVersions {\n if (!version) {\n throw new Error('Client version missing from response')\n }\n\n const match = supportedVersions.find((v) => version.startsWith(v))\n if (!match) {\n this.logger.warn(\n `Unknown support of version ${version} (defaulting to ${this.clientVersion}) please check if a newer version is available that support this version of canton.`\n )\n return this.clientVersion\n }\n\n return match\n }\n\n /**\n * Check if a party exists\n *\n * @param partyId The ID of the party to look for\n * @returns A promise to resolves to a boolean.\n */\n public async checkIfPartyExists(partyId: PartyId): Promise<boolean> {\n try {\n const party = await this.get('/v2/parties/{party}', {\n path: { party: partyId },\n })\n return (\n party.partyDetails !== undefined &&\n party.partyDetails[0].party === partyId\n )\n } catch {\n return false\n }\n }\n\n /**\n * grant \"Master User\" rights to a user.\n *\n * this require running with an admin token.\n *\n * @param userId The ID of the user to grant rights to.\n * @param canReadAsAnyParty define if the user can read as any party.\n * @param canExecuteAsAnyParty define if the user can execute as any party.\n */\n public async grantMasterUserRights(\n userId: string,\n canReadAsAnyParty: boolean,\n canExecuteAsAnyParty: boolean\n ) {\n const rights = []\n if (canReadAsAnyParty) {\n rights.push({\n kind: {\n CanReadAsAnyParty: { value: {} as Record<string, never> },\n },\n })\n }\n if (canExecuteAsAnyParty) {\n rights.push({\n kind: {\n CanExecuteAsAnyParty: {\n value: {} as Record<string, never>,\n },\n },\n })\n }\n\n const result = await this.post(\n '/v2/users/{user-id}/rights',\n {\n identityProviderId: '',\n userId,\n rights,\n },\n {\n path: {\n 'user-id': userId,\n },\n }\n )\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n }\n\n /**\n * Create a new user.\n *\n * @param userId The ID of the user to create.\n * @param primaryParty The primary party of the user.\n */\n public async createUser(\n userId: string,\n primaryParty: PartyId\n ): Promise<UserSchema> {\n try {\n const existing = await this.get('/v2/users/{user-id}', {\n path: { 'user-id': userId },\n })\n\n if (existing && existing.user) {\n return existing.user!\n }\n } catch {\n //TODO: proper error handling based on daml code\n // we continue if code is:\n // code: 'USER_NOT_FOUND',\n // cause: 'getting user failed for unknown user \"master-user\"',\n }\n\n return (\n await this.post('/v2/users', {\n user: {\n identityProviderId: '',\n id: userId,\n isDeactivated: false,\n primaryParty: primaryParty,\n },\n rights: [\n {\n kind: {\n ParticipantAdmin: {\n value: {} as Record<string, never>,\n },\n },\n },\n ],\n })\n ).user!\n }\n\n /**\n * Grants a user the right to act as a party, while ensuring the party exists.\n *\n * @param userId The ID of the user to grant rights to.\n * @param partyId The ID of the party to grant rights for.\n * @param maxTries Optional max number of retries with default 30. May be increased if expecting heavy load.\n * @param retryIntervalMs Optional interval between retries to verify that party exists with default 2000ms. May be increased if expecting heavy load.\n * @returns A promise that resolves when the rights have been granted.\n */\n public async waitForPartyAndGrantUserRights(\n userId: string,\n partyId: PartyId,\n maxTries: number = 30,\n retryIntervalMs: number = 2000\n ) {\n await this.init()\n // Wait for party to appear on participant\n let partyFound = false\n let tries = 0\n\n while (!partyFound && tries < maxTries) {\n partyFound = await this.checkIfPartyExists(partyId)\n\n await new Promise((resolve) => setTimeout(resolve, retryIntervalMs))\n tries++\n }\n\n if (tries >= maxTries) {\n throw new Error(\n `timed out waiting for new party to appear after ${maxTries} tries`\n )\n }\n\n const result = await this.grantRights(userId, {\n actAs: [partyId],\n })\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n\n return\n }\n\n public async grantRights(\n userId: string,\n userRightsOptions: {\n canReadAsAnyParty?: boolean\n canExecuteAsAnyParty?: boolean\n readAs?: PartyId[]\n actAs?: PartyId[]\n }\n ) {\n await this.init()\n const rights = []\n\n for (const partyId of userRightsOptions.readAs ?? []) {\n rights.push({\n kind: {\n CanReadAs: {\n value: {\n party: partyId,\n },\n },\n },\n })\n }\n\n for (const partyId of userRightsOptions.actAs ?? []) {\n rights.push({\n kind: {\n CanActAs: {\n value: {\n party: partyId,\n },\n },\n },\n })\n }\n\n if (userRightsOptions.canReadAsAnyParty) {\n rights.push({\n kind: {\n CanReadAsAnyParty: { value: {} as Record<string, never> },\n },\n })\n }\n if (userRightsOptions.canExecuteAsAnyParty) {\n rights.push({\n kind: {\n CanExecuteAsAnyParty: {\n value: {} as Record<string, never>,\n },\n },\n })\n }\n\n const result = await this.post(\n '/v2/users/{user-id}/rights',\n {\n identityProviderId: '',\n userId,\n rights,\n },\n {\n path: {\n 'user-id': userId,\n },\n }\n )\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n\n return result\n }\n\n public async allocateExternalParty(\n synchronizerId: string,\n onboardingTransactions: OnboardingTransactions,\n multiHashSignatures: MultiHashSignatures\n ): Promise<AllocateExternalPartyResponse> {\n await this.init()\n const resp = await this.currentClient.POST(\n '/v2/parties/external/allocate',\n {\n body: {\n synchronizer: synchronizerId,\n identityProviderId: '',\n onboardingTransactions,\n multiHashSignatures,\n },\n }\n )\n\n return this.valueOrError(resp)\n }\n\n public async generateTopology(\n synchronizerId: string,\n publicKey: string,\n partyHint: string,\n localParticipantObservationOnly: boolean = false,\n confirmationThreshold: number = 1,\n otherConfirmingParticipantUids: string[] = [],\n observingParticipantUids: string[] = []\n ): Promise<GenerateTransactionResponse> {\n await this.init()\n\n const body = {\n synchronizer: synchronizerId,\n partyHint,\n publicKey: {\n format: 'CRYPTO_KEY_FORMAT_RAW',\n keyData: publicKey,\n keySpec: 'SIGNING_KEY_SPEC_EC_CURVE25519',\n },\n localParticipantObservationOnly,\n confirmationThreshold,\n otherConfirmingParticipantUids,\n observingParticipantUids,\n }\n\n this.logger.debug(body, 'generateTopology request body')\n\n const resp = await this.currentClient.POST(\n '/v2/parties/external/generate-topology',\n { body }\n )\n\n return this.valueOrError(resp)\n }\n\n // Retrieve an (arbitrary) synchronizer id from the validator.\n // This synchronizer id is cached for the remainder of this object's life.\n public async getSynchronizerId(): Promise<string> {\n if (this.synchronizerId) return this.synchronizerId\n const response = await this.getWithRetry(\n '/v2/state/connected-synchronizers'\n )\n if (!response.connectedSynchronizers?.[0]) {\n throw new Error('No connected synchronizers found')\n }\n const synchronizerId = response.connectedSynchronizers[0].synchronizerId\n if (response.connectedSynchronizers.length > 1) {\n this.logger.warn(\n `Found ${response.connectedSynchronizers.length} synchronizers, defaulting to ${synchronizerId}`\n )\n }\n this.synchronizerId = synchronizerId\n return synchronizerId\n }\n\n public async postWithRetry<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n retryOptions: retryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n },\n additionalOptions?: ExtraPostOpts\n ): Promise<PostResponse<Path>> {\n return await retryable(\n () => this.post(path, body, params, additionalOptions),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in postWithRetry for path ${path} with body retry options ${JSON.stringify(retryOptions)}`\n )\n this.logger.debug(JSON.stringify(body))\n throw asJsCantonError(e)\n })\n }\n\n public async getWithRetry<Path extends GetEndpoint>(\n path: Path,\n retryOptions: retryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n return await retryable(\n () => this.get(path, params),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in getWithRetry for path ${path} with retry options ${JSON.stringify(retryOptions)}`\n )\n\n throw asJsCantonError(e)\n })\n }\n\n public async patchWithRetry<Path extends PatchEndpoint>(\n path: Path,\n body: PatchRequest<Path>,\n retryOptions: retryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n },\n additionalOptions?: ExtraPostOpts\n ): Promise<PatchResponse<Path>> {\n return await retryable(\n () => this.patch(path, body, params, additionalOptions),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in patchWithRetry for path ${path} with body retry options ${JSON.stringify(retryOptions)}`\n )\n throw asJsCantonError(e)\n })\n }\n\n public async patch<Path extends PatchEndpoint>(\n path: Path,\n body: PatchRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string | number | boolean>\n },\n // needed when posting to /packages, so content type and jsonification of bytes can be overriden\n additionalOptions?: ExtraPostOpts\n ): Promise<PatchResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params, ...additionalOptions } as any\n\n const resp = await this.currentClient.PATCH(path, options)\n return this.valueOrError(resp)\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string | number | boolean>\n },\n // needed when posting to /packages, so content type and jsonification of bytes can be overriden\n additionalOptions?: ExtraPostOpts\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params, ...additionalOptions } as any\n\n const resp = await this.currentClient.POST(path, options)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n await this.init()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n const resp = await this.currentClient.GET(path, options)\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n}\n"]} | ||
| {"version":3,"sources":["../src/ledger-api-utils.ts","../src/ledger-client.ts"],"names":["ErrorInfo","RetryInfo","supportedLedgerApiVersions","version","createClient"],"mappings":"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","file":"index.cjs","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 { LedgerClient } from './ledger-client.js'\n\nimport { Types } from './ledger-client.js'\nimport { PartyId } from '@canton-network/core-types'\n\nimport { Logger } from '@canton-network/core-types'\nimport { ErrorInfo, RetryInfo } from '@canton-network/core-ledger-proto'\n\ntype Completion = Types['Completion']['value']\nexport type JSContractEntry = Types['JsContractEntry']\nexport type JsCantonError = Types['JsCantonError']\n\nconst COMPLETIONS_LIMIT = '100'\nconst COMPLETIONS_STREAM_IDLE_TIMEOUT_MS = '1000'\n\n/**\n * Polls the completions endpoint until\n * the completion with the given (userId, commandId, submissionId) is returned.\n * Then returns the updateId, synchronizerId and recordTime of that completion.\n */\nexport async function awaitCompletion(\n ledgerClient: LedgerClient,\n ledgerEnd: number,\n partyId: PartyId,\n userId: string,\n commandIdOrSubmissionId: string\n): Promise<Completion> {\n const responses = await ledgerClient.postWithRetry(\n '/v2/commands/completions',\n {\n userId,\n parties: [partyId],\n beginExclusive: ledgerEnd,\n },\n defaultRetryableOptions,\n {\n query: {\n limit: COMPLETIONS_LIMIT,\n stream_idle_timeout_ms: COMPLETIONS_STREAM_IDLE_TIMEOUT_MS,\n },\n }\n )\n\n const completions = responses.filter(\n (r) => r.completionResponse && 'Completion' in r.completionResponse\n )\n\n const wantedCompletion = responses.find((r) => {\n if (r.completionResponse && 'Completion' in r.completionResponse) {\n const completion = r.completionResponse.Completion?.value\n if (!completion) {\n return false\n }\n return (\n completion.userId === userId &&\n (completion.commandId === commandIdOrSubmissionId ||\n completion.submissionId === commandIdOrSubmissionId)\n )\n }\n return false\n })\n\n if (\n wantedCompletion?.completionResponse &&\n 'Completion' in wantedCompletion.completionResponse\n ) {\n const completion = wantedCompletion.completionResponse.Completion.value\n const status = completion.status\n if (status && status.code !== 0) {\n // status.code is 0 for success\n throw asGrpcError(status)\n }\n return completion\n } else {\n const lastCompletion = completions[completions.length - 1]\n const newLedgerEnd =\n lastCompletion?.completionResponse &&\n 'Completion' in lastCompletion.completionResponse\n ? lastCompletion.completionResponse.Completion.value.offset\n : undefined\n\n return awaitCompletion(\n ledgerClient,\n newLedgerEnd || ledgerEnd, // !newLedgerEnd implies response was empty\n partyId,\n userId,\n commandIdOrSubmissionId\n )\n }\n}\n\nexport async function promiseWithTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage: string\n): Promise<T> {\n let timeoutPid: NodeJS.Timeout | null = null\n const timeoutPromise: Promise<T> = new Promise((_resolve, reject) => {\n timeoutPid = setTimeout(() => reject(errorMessage), timeoutMs)\n })\n\n try {\n return await Promise.race([promise, timeoutPromise])\n } finally {\n if (timeoutPid) {\n clearTimeout(timeoutPid)\n }\n }\n}\n\nexport type RetryableOptions = {\n retries: number\n delayMs: number\n cantonErrorKeys: string[]\n}\nexport const defaultRetryableOptions: RetryableOptions = {\n retries: 5,\n delayMs: 3000,\n cantonErrorKeys: [\n 'SEQUENCER_REQUEST_FAILED',\n 'SEQUENCER_BACKPRESSURE',\n 'SUBMISSION_ALREADY_IN_FLIGHT',\n 'LOCAL_VERDICT_TIMEOUT',\n 'NOT_SEQUENCED_TIMEOUT',\n 'NO_VIEW_WITH_VALID_RECIPIENTS',\n ],\n}\n\nexport async function retryable<T>(\n fn: () => Promise<T>,\n retryableOptions: RetryableOptions,\n logger?: Logger\n): Promise<T> {\n for (let attempts = 1; attempts <= retryableOptions.retries; attempts++) {\n try {\n return await fn()\n } catch (err: unknown) {\n const grpcError = asGrpcError(err)\n const message: string = grpcError.message\n const shouldRetry =\n retryableOptions.cantonErrorKeys.length === 0 ||\n retryableOptions.cantonErrorKeys.some((key) =>\n message.includes(key)\n )\n if (attempts < retryableOptions.retries && shouldRetry) {\n logger?.warn(\n `Caught retryiable error: ${message}. Retrying attempt ${attempts} of ${retryableOptions.retries}...`\n )\n await new Promise((res) =>\n setTimeout(res, retryableOptions.delayMs)\n )\n // continue to next attempt\n } else {\n throw grpcError\n }\n }\n }\n throw new Error('retryable: Exceeded maximum retries without throwing.')\n}\n\n// Helper for differentiating ledger errors from others and satisfying TS when checking error properties\nexport const isJsCantonError = (e: unknown): e is JsCantonError =>\n typeof e === 'object' &&\n e !== null &&\n 'code' in e &&\n 'cause' in e &&\n 'errorCategory' in e\n\nexport const asJsCantonError = (e: unknown): JsCantonError => {\n if (isJsCantonError(e)) {\n return e\n } else {\n throw e\n }\n}\n\nexport const asGrpcError = (\n e: unknown\n): {\n code: number\n message: string\n errorInfo: ErrorInfo | undefined\n retryInfo: RetryInfo | undefined\n} => {\n let errorInfo: ErrorInfo | undefined\n let retryInfo: RetryInfo | undefined\n\n if (\n typeof e === 'object' &&\n e !== null &&\n 'code' in e &&\n 'message' in e &&\n 'details' in e &&\n Array.isArray(e.details)\n ) {\n const code = e.code as number\n const message = e.message as string\n\n for (const detail of e.details) {\n if (\n detail.typeUrl === 'type.googleapis.com/google.rpc.ErrorInfo' &&\n typeof detail.value === 'string'\n ) {\n try {\n errorInfo = ErrorInfo.fromBinary(\n Buffer.from(detail.value, 'base64')\n )\n } catch {\n //if parsing fails, we skip adding ErrorInfo\n }\n } else if (\n detail.typeUrl === 'type.googleapis.com/google.rpc.RetryInfo' &&\n typeof detail.value === 'string'\n ) {\n try {\n retryInfo = RetryInfo.fromBinary(\n Buffer.from(detail.value, 'base64')\n )\n } catch {\n //if parsing fails, we skip adding RetryInfo\n }\n }\n }\n return { code, message, errorInfo, retryInfo }\n }\n\n // Not a gRPC error, rethrow\n throw e\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 {\n supportedLedgerApiVersions,\n type LedgerApiVersion,\n type LedgerCommonPaths,\n type LedgerCommonSchemas,\n} from '@canton-network/core-ledger-client-types'\nimport createClient, { Client, FetchOptions } from 'openapi-fetch'\nimport { Logger } from 'pino'\nimport { PartyId } from '@canton-network/core-types'\nimport {\n asJsCantonError,\n defaultRetryableOptions,\n retryable,\n RetryableOptions,\n} from './ledger-api-utils.js'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport const supportedVersions = supportedLedgerApiVersions\n\nexport type SupportedVersions = LedgerApiVersion\n\ntype paths = LedgerCommonPaths\n\ntype SchemaByVersion<Name extends keyof LedgerCommonSchemas> =\n LedgerCommonSchemas[Name]\n\ntype ClientsByVersion = {\n [V in SupportedVersions]: Client<paths>\n}\n\nexport type UserSchema = SchemaByVersion<'User'>\n\nexport type Types = LedgerCommonSchemas\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\nexport type PatchEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n patch: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PatchRequest<Path extends PatchEndpoint> = paths[Path] extends {\n patch: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PatchResponse<Path extends PatchEndpoint> = paths[Path] extends {\n patch: {\n responses: { 200: { content: { 'application/json': infer Res } } }\n }\n}\n ? Res\n : never\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\nexport type PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\nexport type GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport type GenerateTransactionResponse =\n SchemaByVersion<'GenerateExternalPartyTopologyResponse'>\n\nexport type AllocateExternalPartyResponse =\n SchemaByVersion<'AllocateExternalPartyResponse'>\nexport type OnboardingTransactions = NonNullable<\n SchemaByVersion<'AllocateExternalPartyRequest'>['onboardingTransactions']\n>\n\nexport type MultiHashSignatures = NonNullable<\n SchemaByVersion<'AllocateExternalPartyRequest'>['multiHashSignatures']\n>\nexport type PrepareSubmissionResponse =\n SchemaByVersion<'JsPrepareSubmissionResponse'>\n\n// Any options the client accepts besides body/params\ntype ExtraPostOpts = Omit<FetchOptions<paths>, 'body' | 'params'>\n\nexport class LedgerClient {\n // privately manage the active connected version and associated client codegen\n private readonly clients: ClientsByVersion\n private clientVersion: SupportedVersions = '3.5'\n private initialized: boolean = false\n private accessTokenProvider: AccessTokenProvider\n private readonly logger: Logger\n private synchronizerId: string | undefined\n baseUrl: URL\n\n constructor({\n baseUrl,\n logger,\n accessTokenProvider,\n version,\n }: {\n baseUrl: URL\n logger: Logger\n accessTokenProvider: AccessTokenProvider\n version?: SupportedVersions\n }) {\n this.logger = logger.child({ component: 'LedgerClient' })\n this.accessTokenProvider = accessTokenProvider\n\n const authenticatedFetch = async (\n url: RequestInfo,\n options: RequestInit = {}\n ) => {\n const token = await this.accessTokenProvider.getAccessToken()\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token && { Authorization: `Bearer ${token}` }),\n },\n })\n }\n\n this.clients = {\n ...supportedVersions.reduce((acc, version) => {\n acc[version] = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: authenticatedFetch,\n })\n return acc\n }, {} as ClientsByVersion),\n }\n\n this.clientVersion = version ?? this.clientVersion\n this.baseUrl = baseUrl\n }\n\n private get currentClient(): Client<paths> {\n return this.clients[this.clientVersion] as unknown as Client<paths>\n }\n\n public async init() {\n if (!this.initialized) {\n this.logger.debug(\n `Initializing LedgerClient with version ${this.clientVersion} for url ${this.baseUrl.href}`\n )\n\n //TODO: parse error response and escalate\n const versionFromClient =\n await this.currentClient.GET('/v2/version')\n\n this.logger.debug(\n {\n data: versionFromClient.data,\n status: versionFromClient.response.status,\n },\n 'getV2Version response'\n )\n\n this.clientVersion = this.parseSupportedVersions(\n versionFromClient.data?.version\n )\n this.initialized = true\n }\n }\n\n public getCurrentClientVersion(): SupportedVersions {\n return this.clientVersion\n }\n\n parseSupportedVersions(version: string | undefined): SupportedVersions {\n if (!version) {\n throw new Error('Client version missing from response')\n }\n\n const match = supportedVersions.find((v) => version.startsWith(v))\n if (!match) {\n this.logger.warn(\n `Unknown support of version ${version} (defaulting to ${this.clientVersion}) please check if a newer version is available that support this version of canton.`\n )\n return this.clientVersion\n }\n\n return match\n }\n\n /**\n * Check if a party exists\n *\n * @param partyId The ID of the party to look for\n * @returns A promise to resolves to a boolean.\n */\n public async checkIfPartyExists(partyId: PartyId): Promise<boolean> {\n try {\n const party = await this.get('/v2/parties/{party}', {\n path: { party: partyId },\n })\n return (\n party.partyDetails !== undefined &&\n party.partyDetails[0].party === partyId\n )\n } catch {\n return false\n }\n }\n\n /**\n * grant \"Master User\" rights to a user.\n *\n * this require running with an admin token.\n *\n * @param userId The ID of the user to grant rights to.\n * @param canReadAsAnyParty define if the user can read as any party.\n * @param canExecuteAsAnyParty define if the user can execute as any party.\n */\n public async grantMasterUserRights(\n userId: string,\n canReadAsAnyParty: boolean,\n canExecuteAsAnyParty: boolean\n ) {\n const rights = []\n if (canReadAsAnyParty) {\n rights.push({\n kind: {\n CanReadAsAnyParty: { value: {} as Record<string, never> },\n },\n })\n }\n if (canExecuteAsAnyParty) {\n rights.push({\n kind: {\n CanExecuteAsAnyParty: {\n value: {} as Record<string, never>,\n },\n },\n })\n }\n\n const result = await this.post(\n '/v2/users/{user-id}/rights',\n {\n identityProviderId: '',\n userId,\n rights,\n },\n {\n path: {\n 'user-id': userId,\n },\n }\n )\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n }\n\n /**\n * Create a new user.\n *\n * @param userId The ID of the user to create.\n * @param primaryParty The primary party of the user.\n */\n public async createUser(\n userId: string,\n primaryParty: PartyId\n ): Promise<UserSchema> {\n try {\n const existing = await this.get('/v2/users/{user-id}', {\n path: { 'user-id': userId },\n })\n\n if (existing && existing.user) {\n return existing.user!\n }\n } catch {\n //TODO: proper error handling based on daml code\n // we continue if code is:\n // code: 'USER_NOT_FOUND',\n // cause: 'getting user failed for unknown user \"master-user\"',\n }\n\n return (\n await this.post('/v2/users', {\n user: {\n identityProviderId: '',\n id: userId,\n isDeactivated: false,\n primaryParty: primaryParty,\n },\n rights: [\n {\n kind: {\n ParticipantAdmin: {\n value: {} as Record<string, never>,\n },\n },\n },\n ],\n })\n ).user!\n }\n\n /**\n * Grants a user the right to act as a party, while ensuring the party exists.\n *\n * @param userId The ID of the user to grant rights to.\n * @param partyId The ID of the party to grant rights for.\n * @param maxTries Optional max number of retries with default 30. May be increased if expecting heavy load.\n * @param retryIntervalMs Optional interval between retries to verify that party exists with default 2000ms. May be increased if expecting heavy load.\n * @returns A promise that resolves when the rights have been granted.\n */\n public async waitForPartyAndGrantUserRights(\n userId: string,\n partyId: PartyId,\n maxTries: number = 30,\n retryIntervalMs: number = 2000\n ) {\n await this.init()\n // Wait for party to appear on participant\n let partyFound = false\n let tries = 0\n\n while (!partyFound && tries < maxTries) {\n partyFound = await this.checkIfPartyExists(partyId)\n\n await new Promise((resolve) => setTimeout(resolve, retryIntervalMs))\n tries++\n }\n\n if (tries >= maxTries) {\n throw new Error(\n `timed out waiting for new party to appear after ${maxTries} tries`\n )\n }\n\n const result = await this.grantRights(userId, {\n actAs: [partyId],\n })\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n\n return\n }\n\n public async grantRights(\n userId: string,\n userRightsOptions: {\n canReadAsAnyParty?: boolean\n canExecuteAsAnyParty?: boolean\n readAs?: PartyId[]\n actAs?: PartyId[]\n }\n ) {\n await this.init()\n const rights = []\n\n for (const partyId of userRightsOptions.readAs ?? []) {\n rights.push({\n kind: {\n CanReadAs: {\n value: {\n party: partyId,\n },\n },\n },\n })\n }\n\n for (const partyId of userRightsOptions.actAs ?? []) {\n rights.push({\n kind: {\n CanActAs: {\n value: {\n party: partyId,\n },\n },\n },\n })\n }\n\n if (userRightsOptions.canReadAsAnyParty) {\n rights.push({\n kind: {\n CanReadAsAnyParty: { value: {} as Record<string, never> },\n },\n })\n }\n if (userRightsOptions.canExecuteAsAnyParty) {\n rights.push({\n kind: {\n CanExecuteAsAnyParty: {\n value: {} as Record<string, never>,\n },\n },\n })\n }\n\n const result = await this.post(\n '/v2/users/{user-id}/rights',\n {\n identityProviderId: '',\n userId,\n rights,\n },\n {\n path: {\n 'user-id': userId,\n },\n }\n )\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n\n return result\n }\n\n public async allocateExternalParty(\n synchronizerId: string,\n onboardingTransactions: OnboardingTransactions,\n multiHashSignatures: MultiHashSignatures\n ): Promise<AllocateExternalPartyResponse> {\n await this.init()\n const resp = await this.currentClient.POST(\n '/v2/parties/external/allocate',\n {\n body: {\n synchronizer: synchronizerId,\n identityProviderId: '',\n onboardingTransactions,\n multiHashSignatures,\n },\n }\n )\n\n return this.valueOrError(resp)\n }\n\n public async generateTopology(\n synchronizerId: string,\n publicKey: string,\n partyHint: string,\n localParticipantObservationOnly: boolean = false,\n confirmationThreshold: number = 1,\n otherConfirmingParticipantUids: string[] = [],\n observingParticipantUids: string[] = []\n ): Promise<GenerateTransactionResponse> {\n await this.init()\n\n const body = {\n synchronizer: synchronizerId,\n partyHint,\n publicKey: {\n format: 'CRYPTO_KEY_FORMAT_RAW',\n keyData: publicKey,\n keySpec: 'SIGNING_KEY_SPEC_EC_CURVE25519',\n },\n localParticipantObservationOnly,\n confirmationThreshold,\n otherConfirmingParticipantUids,\n observingParticipantUids,\n }\n\n this.logger.debug(body, 'generateTopology request body')\n\n const resp = await this.currentClient.POST(\n '/v2/parties/external/generate-topology',\n { body }\n )\n\n return this.valueOrError(resp)\n }\n\n // Retrieve an (arbitrary) synchronizer id from the validator.\n // This synchronizer id is cached for the remainder of this object's life.\n public async getSynchronizerId(): Promise<string> {\n if (this.synchronizerId) return this.synchronizerId\n const response = await this.getWithRetry(\n '/v2/state/connected-synchronizers'\n )\n if (!response.connectedSynchronizers?.[0]) {\n throw new Error('No connected synchronizers found')\n }\n const synchronizerId = response.connectedSynchronizers[0].synchronizerId\n if (response.connectedSynchronizers.length > 1) {\n this.logger.warn(\n `Found ${response.connectedSynchronizers.length} synchronizers, defaulting to ${synchronizerId}`\n )\n }\n this.synchronizerId = synchronizerId\n return synchronizerId\n }\n\n public async postWithRetry<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n retryOptions: RetryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n },\n additionalOptions?: ExtraPostOpts\n ): Promise<PostResponse<Path>> {\n return await retryable(\n () => this.post(path, body, params, additionalOptions),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in postWithRetry for path ${path} with body retry options ${JSON.stringify(retryOptions)}`\n )\n this.logger.debug(JSON.stringify(body))\n throw asJsCantonError(e)\n })\n }\n\n public async getWithRetry<Path extends GetEndpoint>(\n path: Path,\n retryOptions: RetryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n return await retryable(\n () => this.get(path, params),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in getWithRetry for path ${path} with retry options ${JSON.stringify(retryOptions)}`\n )\n\n throw asJsCantonError(e)\n })\n }\n\n public async patchWithRetry<Path extends PatchEndpoint>(\n path: Path,\n body: PatchRequest<Path>,\n retryOptions: RetryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n },\n additionalOptions?: ExtraPostOpts\n ): Promise<PatchResponse<Path>> {\n return await retryable(\n () => this.patch(path, body, params, additionalOptions),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in patchWithRetry for path ${path} with body retry options ${JSON.stringify(retryOptions)}`\n )\n throw asJsCantonError(e)\n })\n }\n\n public async patch<Path extends PatchEndpoint>(\n path: Path,\n body: PatchRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string | number | boolean>\n },\n // needed when posting to /packages, so content type and jsonification of bytes can be overriden\n additionalOptions?: ExtraPostOpts\n ): Promise<PatchResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params, ...additionalOptions } as any\n\n const resp = await this.currentClient.PATCH(path, options)\n return this.valueOrError(resp)\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string | number | boolean>\n },\n // needed when posting to /packages, so content type and jsonification of bytes can be overriden\n additionalOptions?: ExtraPostOpts\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params, ...additionalOptions } as any\n\n const resp = await this.currentClient.POST(path, options)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n await this.init()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n const resp = await this.currentClient.GET(path, options)\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n}\n"]} |
+16
-10
@@ -84,4 +84,4 @@ import { supportedLedgerApiVersions } from '@canton-network/core-ledger-client-types'; | ||
| }; | ||
| async function retryable(fn, retryableOptions2, logger) { | ||
| for (let attempts = 1; attempts <= retryableOptions2.retries; attempts++) { | ||
| async function retryable(fn, retryableOptions, logger) { | ||
| for (let attempts = 1; attempts <= retryableOptions.retries; attempts++) { | ||
| try { | ||
@@ -92,11 +92,11 @@ return await fn(); | ||
| const message = grpcError.message; | ||
| const shouldRetry = retryableOptions2.cantonErrorKeys.length === 0 || retryableOptions2.cantonErrorKeys.some( | ||
| const shouldRetry = retryableOptions.cantonErrorKeys.length === 0 || retryableOptions.cantonErrorKeys.some( | ||
| (key) => message.includes(key) | ||
| ); | ||
| if (attempts < retryableOptions2.retries && shouldRetry) { | ||
| if (attempts < retryableOptions.retries && shouldRetry) { | ||
| logger?.warn( | ||
| `Caught retryiable error: ${message}. Retrying attempt ${attempts} of ${retryableOptions2.retries}...` | ||
| `Caught retryiable error: ${message}. Retrying attempt ${attempts} of ${retryableOptions.retries}...` | ||
| ); | ||
| await new Promise( | ||
| (res) => setTimeout(res, retryableOptions2.delayMs) | ||
| (res) => setTimeout(res, retryableOptions.delayMs) | ||
| ); | ||
@@ -192,7 +192,13 @@ } else { | ||
| if (!this.initialized) { | ||
| this.logger.debug({ | ||
| message: `Initializing LedgerClient with version ${this.clientVersion} for url ${this.baseUrl.href}` | ||
| }); | ||
| this.logger.debug( | ||
| `Initializing LedgerClient with version ${this.clientVersion} for url ${this.baseUrl.href}` | ||
| ); | ||
| const versionFromClient = await this.currentClient.GET("/v2/version"); | ||
| this.logger.debug(versionFromClient, "getV2Version response"); | ||
| this.logger.debug( | ||
| { | ||
| data: versionFromClient.data, | ||
| status: versionFromClient.response.status | ||
| }, | ||
| "getV2Version response" | ||
| ); | ||
| this.clientVersion = this.parseSupportedVersions( | ||
@@ -199,0 +205,0 @@ versionFromClient.data?.version |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/ledger-api-utils.ts","../src/ledger-client.ts"],"names":["retryableOptions","version"],"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 { LedgerClient } from './ledger-client.js'\n\nimport { Types } from './ledger-client.js'\nimport { PartyId } from '@canton-network/core-types'\n\nimport { Logger } from '@canton-network/core-types'\nimport { ErrorInfo, RetryInfo } from '@canton-network/core-ledger-proto'\n\ntype Completion = Types['Completion']['value']\nexport type JSContractEntry = Types['JsContractEntry']\nexport type JsCantonError = Types['JsCantonError']\n\nconst COMPLETIONS_LIMIT = '100'\nconst COMPLETIONS_STREAM_IDLE_TIMEOUT_MS = '1000'\n\n/**\n * Polls the completions endpoint until\n * the completion with the given (userId, commandId, submissionId) is returned.\n * Then returns the updateId, synchronizerId and recordTime of that completion.\n */\nexport async function awaitCompletion(\n ledgerClient: LedgerClient,\n ledgerEnd: number,\n partyId: PartyId,\n userId: string,\n commandIdOrSubmissionId: string\n): Promise<Completion> {\n const responses = await ledgerClient.postWithRetry(\n '/v2/commands/completions',\n {\n userId,\n parties: [partyId],\n beginExclusive: ledgerEnd,\n },\n defaultRetryableOptions,\n {\n query: {\n limit: COMPLETIONS_LIMIT,\n stream_idle_timeout_ms: COMPLETIONS_STREAM_IDLE_TIMEOUT_MS,\n },\n }\n )\n\n const completions = responses.filter(\n (r) => r.completionResponse && 'Completion' in r.completionResponse\n )\n\n const wantedCompletion = responses.find((r) => {\n if (r.completionResponse && 'Completion' in r.completionResponse) {\n const completion = r.completionResponse.Completion?.value\n if (!completion) {\n return false\n }\n return (\n completion.userId === userId &&\n (completion.commandId === commandIdOrSubmissionId ||\n completion.submissionId === commandIdOrSubmissionId)\n )\n }\n return false\n })\n\n if (\n wantedCompletion?.completionResponse &&\n 'Completion' in wantedCompletion.completionResponse\n ) {\n const completion = wantedCompletion.completionResponse.Completion.value\n const status = completion.status\n if (status && status.code !== 0) {\n // status.code is 0 for success\n throw asGrpcError(status)\n }\n return completion\n } else {\n const lastCompletion = completions[completions.length - 1]\n const newLedgerEnd =\n lastCompletion?.completionResponse &&\n 'Completion' in lastCompletion.completionResponse\n ? lastCompletion.completionResponse.Completion.value.offset\n : undefined\n\n return awaitCompletion(\n ledgerClient,\n newLedgerEnd || ledgerEnd, // !newLedgerEnd implies response was empty\n partyId,\n userId,\n commandIdOrSubmissionId\n )\n }\n}\n\nexport async function promiseWithTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage: string\n): Promise<T> {\n let timeoutPid: NodeJS.Timeout | null = null\n const timeoutPromise: Promise<T> = new Promise((_resolve, reject) => {\n timeoutPid = setTimeout(() => reject(errorMessage), timeoutMs)\n })\n\n try {\n return await Promise.race([promise, timeoutPromise])\n } finally {\n if (timeoutPid) {\n clearTimeout(timeoutPid)\n }\n }\n}\n\nexport type retryableOptions = {\n retries: number\n delayMs: number\n cantonErrorKeys: string[]\n}\nexport const defaultRetryableOptions: retryableOptions = {\n retries: 5,\n delayMs: 3000,\n cantonErrorKeys: [\n 'SEQUENCER_REQUEST_FAILED',\n 'SEQUENCER_BACKPRESSURE',\n 'SUBMISSION_ALREADY_IN_FLIGHT',\n 'LOCAL_VERDICT_TIMEOUT',\n 'NOT_SEQUENCED_TIMEOUT',\n 'NO_VIEW_WITH_VALID_RECIPIENTS',\n ],\n}\n\nexport async function retryable<T>(\n fn: () => Promise<T>,\n retryableOptions: retryableOptions,\n logger?: Logger\n): Promise<T> {\n for (let attempts = 1; attempts <= retryableOptions.retries; attempts++) {\n try {\n return await fn()\n } catch (err: unknown) {\n const grpcError = asGrpcError(err)\n const message: string = grpcError.message\n const shouldRetry =\n retryableOptions.cantonErrorKeys.length === 0 ||\n retryableOptions.cantonErrorKeys.some((key) =>\n message.includes(key)\n )\n if (attempts < retryableOptions.retries && shouldRetry) {\n logger?.warn(\n `Caught retryiable error: ${message}. Retrying attempt ${attempts} of ${retryableOptions.retries}...`\n )\n await new Promise((res) =>\n setTimeout(res, retryableOptions.delayMs)\n )\n // continue to next attempt\n } else {\n throw grpcError\n }\n }\n }\n throw new Error('retryable: Exceeded maximum retries without throwing.')\n}\n\n// Helper for differentiating ledger errors from others and satisfying TS when checking error properties\nexport const isJsCantonError = (e: unknown): e is JsCantonError =>\n typeof e === 'object' &&\n e !== null &&\n 'code' in e &&\n 'cause' in e &&\n 'errorCategory' in e\n\nexport const asJsCantonError = (e: unknown): JsCantonError => {\n if (isJsCantonError(e)) {\n return e\n } else {\n throw e\n }\n}\n\nexport const asGrpcError = (\n e: unknown\n): {\n code: number\n message: string\n errorInfo: ErrorInfo | undefined\n retryInfo: RetryInfo | undefined\n} => {\n let errorInfo: ErrorInfo | undefined\n let retryInfo: RetryInfo | undefined\n\n if (\n typeof e === 'object' &&\n e !== null &&\n 'code' in e &&\n 'message' in e &&\n 'details' in e &&\n Array.isArray(e.details)\n ) {\n const code = e.code as number\n const message = e.message as string\n\n for (const detail of e.details) {\n if (\n detail.typeUrl === 'type.googleapis.com/google.rpc.ErrorInfo' &&\n typeof detail.value === 'string'\n ) {\n try {\n errorInfo = ErrorInfo.fromBinary(\n Buffer.from(detail.value, 'base64')\n )\n } catch {\n //if parsing fails, we skip adding ErrorInfo\n }\n } else if (\n detail.typeUrl === 'type.googleapis.com/google.rpc.RetryInfo' &&\n typeof detail.value === 'string'\n ) {\n try {\n retryInfo = RetryInfo.fromBinary(\n Buffer.from(detail.value, 'base64')\n )\n } catch {\n //if parsing fails, we skip adding RetryInfo\n }\n }\n }\n return { code, message, errorInfo, retryInfo }\n }\n\n // Not a gRPC error, rethrow\n throw e\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 {\n supportedLedgerApiVersions,\n type LedgerApiVersion,\n type LedgerCommonPaths,\n type LedgerCommonSchemas,\n} from '@canton-network/core-ledger-client-types'\nimport createClient, { Client, FetchOptions } from 'openapi-fetch'\nimport { Logger } from 'pino'\nimport { PartyId } from '@canton-network/core-types'\nimport {\n asJsCantonError,\n defaultRetryableOptions,\n retryable,\n retryableOptions,\n} from './ledger-api-utils.js'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport const supportedVersions = supportedLedgerApiVersions\n\nexport type SupportedVersions = LedgerApiVersion\n\ntype paths = LedgerCommonPaths\n\ntype SchemaByVersion<Name extends keyof LedgerCommonSchemas> =\n LedgerCommonSchemas[Name]\n\ntype ClientsByVersion = {\n [V in SupportedVersions]: Client<paths>\n}\n\nexport type UserSchema = SchemaByVersion<'User'>\n\nexport type Types = LedgerCommonSchemas\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\nexport type PatchEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n patch: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PatchRequest<Path extends PatchEndpoint> = paths[Path] extends {\n patch: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PatchResponse<Path extends PatchEndpoint> = paths[Path] extends {\n patch: {\n responses: { 200: { content: { 'application/json': infer Res } } }\n }\n}\n ? Res\n : never\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\nexport type PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\nexport type GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport type GenerateTransactionResponse =\n SchemaByVersion<'GenerateExternalPartyTopologyResponse'>\n\nexport type AllocateExternalPartyResponse =\n SchemaByVersion<'AllocateExternalPartyResponse'>\nexport type OnboardingTransactions = NonNullable<\n SchemaByVersion<'AllocateExternalPartyRequest'>['onboardingTransactions']\n>\n\nexport type MultiHashSignatures = NonNullable<\n SchemaByVersion<'AllocateExternalPartyRequest'>['multiHashSignatures']\n>\nexport type PrepareSubmissionResponse =\n SchemaByVersion<'JsPrepareSubmissionResponse'>\n\n// Any options the client accepts besides body/params\ntype ExtraPostOpts = Omit<FetchOptions<paths>, 'body' | 'params'>\n\nexport class LedgerClient {\n // privately manage the active connected version and associated client codegen\n private readonly clients: ClientsByVersion\n private clientVersion: SupportedVersions = '3.5'\n private initialized: boolean = false\n private accessTokenProvider: AccessTokenProvider\n private readonly logger: Logger\n private synchronizerId: string | undefined\n baseUrl: URL\n\n constructor({\n baseUrl,\n logger,\n accessTokenProvider,\n version,\n }: {\n baseUrl: URL\n logger: Logger\n accessTokenProvider: AccessTokenProvider\n version?: SupportedVersions\n }) {\n this.logger = logger.child({ component: 'LedgerClient' })\n this.accessTokenProvider = accessTokenProvider\n\n const authenticatedFetch = async (\n url: RequestInfo,\n options: RequestInit = {}\n ) => {\n const token = await this.accessTokenProvider.getAccessToken()\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token && { Authorization: `Bearer ${token}` }),\n },\n })\n }\n\n this.clients = {\n ...supportedVersions.reduce((acc, version) => {\n acc[version] = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: authenticatedFetch,\n })\n return acc\n }, {} as ClientsByVersion),\n }\n\n this.clientVersion = version ?? this.clientVersion\n this.baseUrl = baseUrl\n }\n\n private get currentClient(): Client<paths> {\n return this.clients[this.clientVersion] as unknown as Client<paths>\n }\n\n public async init() {\n if (!this.initialized) {\n this.logger.debug({\n message: `Initializing LedgerClient with version ${this.clientVersion} for url ${this.baseUrl.href}`,\n })\n\n //TODO: parse error response and escalate\n const versionFromClient =\n await this.currentClient.GET('/v2/version')\n\n this.logger.debug(versionFromClient, 'getV2Version response')\n\n this.clientVersion = this.parseSupportedVersions(\n versionFromClient.data?.version\n )\n this.initialized = true\n }\n }\n\n public getCurrentClientVersion(): SupportedVersions {\n return this.clientVersion\n }\n\n parseSupportedVersions(version: string | undefined): SupportedVersions {\n if (!version) {\n throw new Error('Client version missing from response')\n }\n\n const match = supportedVersions.find((v) => version.startsWith(v))\n if (!match) {\n this.logger.warn(\n `Unknown support of version ${version} (defaulting to ${this.clientVersion}) please check if a newer version is available that support this version of canton.`\n )\n return this.clientVersion\n }\n\n return match\n }\n\n /**\n * Check if a party exists\n *\n * @param partyId The ID of the party to look for\n * @returns A promise to resolves to a boolean.\n */\n public async checkIfPartyExists(partyId: PartyId): Promise<boolean> {\n try {\n const party = await this.get('/v2/parties/{party}', {\n path: { party: partyId },\n })\n return (\n party.partyDetails !== undefined &&\n party.partyDetails[0].party === partyId\n )\n } catch {\n return false\n }\n }\n\n /**\n * grant \"Master User\" rights to a user.\n *\n * this require running with an admin token.\n *\n * @param userId The ID of the user to grant rights to.\n * @param canReadAsAnyParty define if the user can read as any party.\n * @param canExecuteAsAnyParty define if the user can execute as any party.\n */\n public async grantMasterUserRights(\n userId: string,\n canReadAsAnyParty: boolean,\n canExecuteAsAnyParty: boolean\n ) {\n const rights = []\n if (canReadAsAnyParty) {\n rights.push({\n kind: {\n CanReadAsAnyParty: { value: {} as Record<string, never> },\n },\n })\n }\n if (canExecuteAsAnyParty) {\n rights.push({\n kind: {\n CanExecuteAsAnyParty: {\n value: {} as Record<string, never>,\n },\n },\n })\n }\n\n const result = await this.post(\n '/v2/users/{user-id}/rights',\n {\n identityProviderId: '',\n userId,\n rights,\n },\n {\n path: {\n 'user-id': userId,\n },\n }\n )\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n }\n\n /**\n * Create a new user.\n *\n * @param userId The ID of the user to create.\n * @param primaryParty The primary party of the user.\n */\n public async createUser(\n userId: string,\n primaryParty: PartyId\n ): Promise<UserSchema> {\n try {\n const existing = await this.get('/v2/users/{user-id}', {\n path: { 'user-id': userId },\n })\n\n if (existing && existing.user) {\n return existing.user!\n }\n } catch {\n //TODO: proper error handling based on daml code\n // we continue if code is:\n // code: 'USER_NOT_FOUND',\n // cause: 'getting user failed for unknown user \"master-user\"',\n }\n\n return (\n await this.post('/v2/users', {\n user: {\n identityProviderId: '',\n id: userId,\n isDeactivated: false,\n primaryParty: primaryParty,\n },\n rights: [\n {\n kind: {\n ParticipantAdmin: {\n value: {} as Record<string, never>,\n },\n },\n },\n ],\n })\n ).user!\n }\n\n /**\n * Grants a user the right to act as a party, while ensuring the party exists.\n *\n * @param userId The ID of the user to grant rights to.\n * @param partyId The ID of the party to grant rights for.\n * @param maxTries Optional max number of retries with default 30. May be increased if expecting heavy load.\n * @param retryIntervalMs Optional interval between retries to verify that party exists with default 2000ms. May be increased if expecting heavy load.\n * @returns A promise that resolves when the rights have been granted.\n */\n public async waitForPartyAndGrantUserRights(\n userId: string,\n partyId: PartyId,\n maxTries: number = 30,\n retryIntervalMs: number = 2000\n ) {\n await this.init()\n // Wait for party to appear on participant\n let partyFound = false\n let tries = 0\n\n while (!partyFound && tries < maxTries) {\n partyFound = await this.checkIfPartyExists(partyId)\n\n await new Promise((resolve) => setTimeout(resolve, retryIntervalMs))\n tries++\n }\n\n if (tries >= maxTries) {\n throw new Error(\n `timed out waiting for new party to appear after ${maxTries} tries`\n )\n }\n\n const result = await this.grantRights(userId, {\n actAs: [partyId],\n })\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n\n return\n }\n\n public async grantRights(\n userId: string,\n userRightsOptions: {\n canReadAsAnyParty?: boolean\n canExecuteAsAnyParty?: boolean\n readAs?: PartyId[]\n actAs?: PartyId[]\n }\n ) {\n await this.init()\n const rights = []\n\n for (const partyId of userRightsOptions.readAs ?? []) {\n rights.push({\n kind: {\n CanReadAs: {\n value: {\n party: partyId,\n },\n },\n },\n })\n }\n\n for (const partyId of userRightsOptions.actAs ?? []) {\n rights.push({\n kind: {\n CanActAs: {\n value: {\n party: partyId,\n },\n },\n },\n })\n }\n\n if (userRightsOptions.canReadAsAnyParty) {\n rights.push({\n kind: {\n CanReadAsAnyParty: { value: {} as Record<string, never> },\n },\n })\n }\n if (userRightsOptions.canExecuteAsAnyParty) {\n rights.push({\n kind: {\n CanExecuteAsAnyParty: {\n value: {} as Record<string, never>,\n },\n },\n })\n }\n\n const result = await this.post(\n '/v2/users/{user-id}/rights',\n {\n identityProviderId: '',\n userId,\n rights,\n },\n {\n path: {\n 'user-id': userId,\n },\n }\n )\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n\n return result\n }\n\n public async allocateExternalParty(\n synchronizerId: string,\n onboardingTransactions: OnboardingTransactions,\n multiHashSignatures: MultiHashSignatures\n ): Promise<AllocateExternalPartyResponse> {\n await this.init()\n const resp = await this.currentClient.POST(\n '/v2/parties/external/allocate',\n {\n body: {\n synchronizer: synchronizerId,\n identityProviderId: '',\n onboardingTransactions,\n multiHashSignatures,\n },\n }\n )\n\n return this.valueOrError(resp)\n }\n\n public async generateTopology(\n synchronizerId: string,\n publicKey: string,\n partyHint: string,\n localParticipantObservationOnly: boolean = false,\n confirmationThreshold: number = 1,\n otherConfirmingParticipantUids: string[] = [],\n observingParticipantUids: string[] = []\n ): Promise<GenerateTransactionResponse> {\n await this.init()\n\n const body = {\n synchronizer: synchronizerId,\n partyHint,\n publicKey: {\n format: 'CRYPTO_KEY_FORMAT_RAW',\n keyData: publicKey,\n keySpec: 'SIGNING_KEY_SPEC_EC_CURVE25519',\n },\n localParticipantObservationOnly,\n confirmationThreshold,\n otherConfirmingParticipantUids,\n observingParticipantUids,\n }\n\n this.logger.debug(body, 'generateTopology request body')\n\n const resp = await this.currentClient.POST(\n '/v2/parties/external/generate-topology',\n { body }\n )\n\n return this.valueOrError(resp)\n }\n\n // Retrieve an (arbitrary) synchronizer id from the validator.\n // This synchronizer id is cached for the remainder of this object's life.\n public async getSynchronizerId(): Promise<string> {\n if (this.synchronizerId) return this.synchronizerId\n const response = await this.getWithRetry(\n '/v2/state/connected-synchronizers'\n )\n if (!response.connectedSynchronizers?.[0]) {\n throw new Error('No connected synchronizers found')\n }\n const synchronizerId = response.connectedSynchronizers[0].synchronizerId\n if (response.connectedSynchronizers.length > 1) {\n this.logger.warn(\n `Found ${response.connectedSynchronizers.length} synchronizers, defaulting to ${synchronizerId}`\n )\n }\n this.synchronizerId = synchronizerId\n return synchronizerId\n }\n\n public async postWithRetry<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n retryOptions: retryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n },\n additionalOptions?: ExtraPostOpts\n ): Promise<PostResponse<Path>> {\n return await retryable(\n () => this.post(path, body, params, additionalOptions),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in postWithRetry for path ${path} with body retry options ${JSON.stringify(retryOptions)}`\n )\n this.logger.debug(JSON.stringify(body))\n throw asJsCantonError(e)\n })\n }\n\n public async getWithRetry<Path extends GetEndpoint>(\n path: Path,\n retryOptions: retryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n return await retryable(\n () => this.get(path, params),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in getWithRetry for path ${path} with retry options ${JSON.stringify(retryOptions)}`\n )\n\n throw asJsCantonError(e)\n })\n }\n\n public async patchWithRetry<Path extends PatchEndpoint>(\n path: Path,\n body: PatchRequest<Path>,\n retryOptions: retryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n },\n additionalOptions?: ExtraPostOpts\n ): Promise<PatchResponse<Path>> {\n return await retryable(\n () => this.patch(path, body, params, additionalOptions),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in patchWithRetry for path ${path} with body retry options ${JSON.stringify(retryOptions)}`\n )\n throw asJsCantonError(e)\n })\n }\n\n public async patch<Path extends PatchEndpoint>(\n path: Path,\n body: PatchRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string | number | boolean>\n },\n // needed when posting to /packages, so content type and jsonification of bytes can be overriden\n additionalOptions?: ExtraPostOpts\n ): Promise<PatchResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params, ...additionalOptions } as any\n\n const resp = await this.currentClient.PATCH(path, options)\n return this.valueOrError(resp)\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string | number | boolean>\n },\n // needed when posting to /packages, so content type and jsonification of bytes can be overriden\n additionalOptions?: ExtraPostOpts\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params, ...additionalOptions } as any\n\n const resp = await this.currentClient.POST(path, options)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n await this.init()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n const resp = await this.currentClient.GET(path, options)\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n}\n"]} | ||
| {"version":3,"sources":["../src/ledger-api-utils.ts","../src/ledger-client.ts"],"names":["version"],"mappings":";;;;;;;AAeA,IAAM,iBAAA,GAAoB,KAAA;AAC1B,IAAM,kCAAA,GAAqC,MAAA;AAO3C,eAAsB,eAAA,CAClB,YAAA,EACA,SAAA,EACA,OAAA,EACA,QACA,uBAAA,EACmB;AACnB,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,aAAA;AAAA,IACjC,0BAAA;AAAA,IACA;AAAA,MACI,MAAA;AAAA,MACA,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,cAAA,EAAgB;AAAA,KACpB;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,MACI,KAAA,EAAO;AAAA,QACH,KAAA,EAAO,iBAAA;AAAA,QACP,sBAAA,EAAwB;AAAA;AAC5B;AACJ,GACJ;AAEA,EAAA,MAAM,cAAc,SAAA,CAAU,MAAA;AAAA,IAC1B,CAAC,CAAA,KAAM,CAAA,CAAE,kBAAA,IAAsB,gBAAgB,CAAA,CAAE;AAAA,GACrD;AAEA,EAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM;AAC3C,IAAA,IAAI,CAAA,CAAE,kBAAA,IAAsB,YAAA,IAAgB,CAAA,CAAE,kBAAA,EAAoB;AAC9D,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,kBAAA,CAAmB,UAAA,EAAY,KAAA;AACpD,MAAA,IAAI,CAAC,UAAA,EAAY;AACb,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,OACI,WAAW,MAAA,KAAW,MAAA,KACrB,WAAW,SAAA,KAAc,uBAAA,IACtB,WAAW,YAAA,KAAiB,uBAAA,CAAA;AAAA,IAExC;AACA,IAAA,OAAO,KAAA;AAAA,EACX,CAAC,CAAA;AAED,EAAA,IACI,gBAAA,EAAkB,kBAAA,IAClB,YAAA,IAAgB,gBAAA,CAAiB,kBAAA,EACnC;AACE,IAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,kBAAA,CAAmB,UAAA,CAAW,KAAA;AAClE,IAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,CAAA,EAAG;AAE7B,MAAA,MAAM,YAAY,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,UAAA;AAAA,EACX,CAAA,MAAO;AACH,IAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA;AACzD,IAAA,MAAM,YAAA,GACF,cAAA,EAAgB,kBAAA,IAChB,YAAA,IAAgB,cAAA,CAAe,qBACzB,cAAA,CAAe,kBAAA,CAAmB,UAAA,CAAW,KAAA,CAAM,MAAA,GACnD,MAAA;AAEV,IAAA,OAAO,eAAA;AAAA,MACH,YAAA;AAAA,MACA,YAAA,IAAgB,SAAA;AAAA;AAAA,MAChB,OAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACJ;AAAA,EACJ;AACJ;AAEA,eAAsB,kBAAA,CAClB,OAAA,EACA,SAAA,EACA,YAAA,EACU;AACV,EAAA,IAAI,UAAA,GAAoC,IAAA;AACxC,EAAA,MAAM,cAAA,GAA6B,IAAI,OAAA,CAAQ,CAAC,UAAU,MAAA,KAAW;AACjE,IAAA,UAAA,GAAa,UAAA,CAAW,MAAM,MAAA,CAAO,YAAY,GAAG,SAAS,CAAA;AAAA,EACjE,CAAC,CAAA;AAED,EAAA,IAAI;AACA,IAAA,OAAO,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,EAAS,cAAc,CAAC,CAAA;AAAA,EACvD,CAAA,SAAE;AACE,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,YAAA,CAAa,UAAU,CAAA;AAAA,IAC3B;AAAA,EACJ;AACJ;AAOO,IAAM,uBAAA,GAA4C;AAAA,EACrD,OAAA,EAAS,CAAA;AAAA,EACT,OAAA,EAAS,GAAA;AAAA,EACT,eAAA,EAAiB;AAAA,IACb,0BAAA;AAAA,IACA,wBAAA;AAAA,IACA,8BAAA;AAAA,IACA,uBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA;AAER;AAEA,eAAsB,SAAA,CAClB,EAAA,EACA,gBAAA,EACA,MAAA,EACU;AACV,EAAA,KAAA,IAAS,QAAA,GAAW,CAAA,EAAG,QAAA,IAAY,gBAAA,CAAiB,SAAS,QAAA,EAAA,EAAY;AACrE,IAAA,IAAI;AACA,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IACpB,SAAS,GAAA,EAAc;AACnB,MAAA,MAAM,SAAA,GAAY,YAAY,GAAG,CAAA;AACjC,MAAA,MAAM,UAAkB,SAAA,CAAU,OAAA;AAClC,MAAA,MAAM,cACF,gBAAA,CAAiB,eAAA,CAAgB,MAAA,KAAW,CAAA,IAC5C,iBAAiB,eAAA,CAAgB,IAAA;AAAA,QAAK,CAAC,GAAA,KACnC,OAAA,CAAQ,QAAA,CAAS,GAAG;AAAA,OACxB;AACJ,MAAA,IAAI,QAAA,GAAW,gBAAA,CAAiB,OAAA,IAAW,WAAA,EAAa;AACpD,QAAA,MAAA,EAAQ,IAAA;AAAA,UACJ,4BAA4B,OAAO,CAAA,mBAAA,EAAsB,QAAQ,CAAA,IAAA,EAAO,iBAAiB,OAAO,CAAA,GAAA;AAAA,SACpG;AACA,QAAA,MAAM,IAAI,OAAA;AAAA,UAAQ,CAAC,GAAA,KACf,UAAA,CAAW,GAAA,EAAK,iBAAiB,OAAO;AAAA,SAC5C;AAAA,MAEJ,CAAA,MAAO;AACH,QAAA,MAAM,SAAA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ;AACA,EAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAC3E;AAGO,IAAM,eAAA,GAAkB,CAAC,CAAA,KAC5B,OAAO,CAAA,KAAM,QAAA,IACb,CAAA,KAAM,IAAA,IACN,MAAA,IAAU,CAAA,IACV,OAAA,IAAW,CAAA,IACX,eAAA,IAAmB;AAEhB,IAAM,eAAA,GAAkB,CAAC,CAAA,KAA8B;AAC1D,EAAA,IAAI,eAAA,CAAgB,CAAC,CAAA,EAAG;AACpB,IAAA,OAAO,CAAA;AAAA,EACX,CAAA,MAAO;AACH,IAAA,MAAM,CAAA;AAAA,EACV;AACJ;AAEO,IAAM,WAAA,GAAc,CACvB,CAAA,KAMC;AACD,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,SAAA;AAEJ,EAAA,IACI,OAAO,CAAA,KAAM,QAAA,IACb,CAAA,KAAM,QACN,MAAA,IAAU,CAAA,IACV,SAAA,IAAa,CAAA,IACb,aAAa,CAAA,IACb,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EACzB;AACE,IAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,IAAA,MAAM,UAAU,CAAA,CAAE,OAAA;AAElB,IAAA,KAAA,MAAW,MAAA,IAAU,EAAE,OAAA,EAAS;AAC5B,MAAA,IACI,OAAO,OAAA,KAAY,0CAAA,IACnB,OAAO,MAAA,CAAO,UAAU,QAAA,EAC1B;AACE,QAAA,IAAI;AACA,UAAA,SAAA,GAAY,SAAA,CAAU,UAAA;AAAA,YAClB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,QAAQ;AAAA,WACtC;AAAA,QACJ,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACJ,WACI,MAAA,CAAO,OAAA,KAAY,8CACnB,OAAO,MAAA,CAAO,UAAU,QAAA,EAC1B;AACE,QAAA,IAAI;AACA,UAAA,SAAA,GAAY,SAAA,CAAU,UAAA;AAAA,YAClB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,QAAQ;AAAA,WACtC;AAAA,QACJ,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,SAAA,EAAU;AAAA,EACjD;AAGA,EAAA,MAAM,CAAA;AACV,CAAA;;;ACnNO,IAAM,iBAAA,GAAoB;AAqG1B,IAAM,eAAN,MAAmB;AAAA,EAUtB,WAAA,CAAY;AAAA,IACR,OAAA;AAAA,IACA,MAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACJ,EAKG;AAlBH;AAAA,IAAA,aAAA,CAAA,IAAA,EAAiB,SAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAQ,eAAA,EAAmC,KAAA,CAAA;AAC3C,IAAA,aAAA,CAAA,IAAA,EAAQ,aAAA,EAAuB,KAAA,CAAA;AAC/B,IAAA,aAAA,CAAA,IAAA,EAAQ,qBAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAQ,gBAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAaI,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,KAAA,CAAM,EAAE,SAAA,EAAW,gBAAgB,CAAA;AACxD,IAAA,IAAA,CAAK,mBAAA,GAAsB,mBAAA;AAE3B,IAAA,MAAM,kBAAA,GAAqB,OACvB,GAAA,EACA,OAAA,GAAuB,EAAC,KACvB;AACD,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,mBAAA,CAAoB,cAAA,EAAe;AAC5D,MAAA,OAAO,MAAM,GAAA,EAAK;AAAA,QACd,GAAG,OAAA;AAAA,QACH,OAAA,EAAS;AAAA,UACL,GAAI,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,UACxB,GAAI,KAAA,IAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAG;AACpD,OACH,CAAA;AAAA,IACL,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACX,GAAG,iBAAA,CAAkB,MAAA,CAAO,CAAC,KAAKA,QAAAA,KAAY;AAC1C,QAAA,GAAA,CAAIA,QAAO,IAAI,YAAA,CAAoB;AAAA,UAC/B,SAAS,OAAA,CAAQ,IAAA;AAAA,UACjB,KAAA,EAAO;AAAA,SACV,CAAA;AACD,QAAA,OAAO,GAAA;AAAA,MACX,CAAA,EAAG,EAAsB;AAAA,KAC7B;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAW,IAAA,CAAK,aAAA;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACnB;AAAA,EAEA,IAAY,aAAA,GAA+B;AACvC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAa,IAAA,GAAO;AAChB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACnB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACR,0CAA0C,IAAA,CAAK,aAAa,CAAA,SAAA,EAAY,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,OAC7F;AAGA,MAAA,MAAM,iBAAA,GACF,MAAM,IAAA,CAAK,aAAA,CAAc,IAAI,aAAa,CAAA;AAE9C,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACR;AAAA,UACI,MAAM,iBAAA,CAAkB,IAAA;AAAA,UACxB,MAAA,EAAQ,kBAAkB,QAAA,CAAS;AAAA,SACvC;AAAA,QACA;AAAA,OACJ;AAEA,MAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,sBAAA;AAAA,QACtB,kBAAkB,IAAA,EAAM;AAAA,OAC5B;AACA,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACvB;AAAA,EACJ;AAAA,EAEO,uBAAA,GAA6C;AAChD,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAChB;AAAA,EAEA,uBAAuB,OAAA,EAAgD;AACnE,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,KAAA,GAAQ,kBAAkB,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,UAAA,CAAW,CAAC,CAAC,CAAA;AACjE,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACR,CAAA,2BAAA,EAA8B,OAAO,CAAA,gBAAA,EAAmB,IAAA,CAAK,aAAa,CAAA,mFAAA;AAAA,OAC9E;AACA,MAAA,OAAO,IAAA,CAAK,aAAA;AAAA,IAChB;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,mBAAmB,OAAA,EAAoC;AAChE,IAAA,IAAI;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB;AAAA,QAChD,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA;AAAQ,OAC1B,CAAA;AACD,MAAA,OACI,MAAM,YAAA,KAAiB,KAAA,CAAA,IACvB,MAAM,YAAA,CAAa,CAAC,EAAE,KAAA,KAAU,OAAA;AAAA,IAExC,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,KAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,qBAAA,CACT,MAAA,EACA,iBAAA,EACA,oBAAA,EACF;AACE,IAAA,MAAM,SAAS,EAAC;AAChB,IAAA,IAAI,iBAAA,EAAmB;AACnB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA,EAAM;AAAA,UACF,iBAAA,EAAmB,EAAE,KAAA,EAAO,EAAC;AAA2B;AAC5D,OACH,CAAA;AAAA,IACL;AACA,IAAA,IAAI,oBAAA,EAAsB;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA,EAAM;AAAA,UACF,oBAAA,EAAsB;AAAA,YAClB,OAAO;AAAC;AACZ;AACJ,OACH,CAAA;AAAA,IACL;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA;AAAA,MACtB,4BAAA;AAAA,MACA;AAAA,QACI,kBAAA,EAAoB,EAAA;AAAA,QACpB,MAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACA;AAAA,QACI,IAAA,EAAM;AAAA,UACF,SAAA,EAAW;AAAA;AACf;AACJ,KACJ;AAEA,IAAA,IAAI,CAAC,OAAO,kBAAA,EAAoB;AAC5B,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IACjD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,UAAA,CACT,MAAA,EACA,YAAA,EACmB;AACnB,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB;AAAA,QACnD,IAAA,EAAM,EAAE,SAAA,EAAW,MAAA;AAAO,OAC7B,CAAA;AAED,MAAA,IAAI,QAAA,IAAY,SAAS,IAAA,EAAM;AAC3B,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACpB;AAAA,IACJ,CAAA,CAAA,MAAQ;AAAA,IAKR;AAEA,IAAA,OAAA,CACI,MAAM,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa;AAAA,MACzB,IAAA,EAAM;AAAA,QACF,kBAAA,EAAoB,EAAA;AAAA,QACpB,EAAA,EAAI,MAAA;AAAA,QACJ,aAAA,EAAe,KAAA;AAAA,QACf;AAAA,OACJ;AAAA,MACA,MAAA,EAAQ;AAAA,QACJ;AAAA,UACI,IAAA,EAAM;AAAA,YACF,gBAAA,EAAkB;AAAA,cACd,OAAO;AAAC;AACZ;AACJ;AACJ;AACJ,KACH,CAAA,EACH,IAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,8BAAA,CACT,MAAA,EACA,SACA,QAAA,GAAmB,EAAA,EACnB,kBAA0B,GAAA,EAC5B;AACE,IAAA,MAAM,KAAK,IAAA,EAAK;AAEhB,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,OAAO,CAAC,UAAA,IAAc,KAAA,GAAQ,QAAA,EAAU;AACpC,MAAA,UAAA,GAAa,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAElD,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,eAAe,CAAC,CAAA;AACnE,MAAA,KAAA,EAAA;AAAA,IACJ;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,mDAAmD,QAAQ,CAAA,MAAA;AAAA,OAC/D;AAAA,IACJ;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ;AAAA,MAC1C,KAAA,EAAO,CAAC,OAAO;AAAA,KAClB,CAAA;AAED,IAAA,IAAI,CAAC,OAAO,kBAAA,EAAoB;AAC5B,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IACjD;AAEA,IAAA;AAAA,EACJ;AAAA,EAEA,MAAa,WAAA,CACT,MAAA,EACA,iBAAA,EAMF;AACE,IAAA,MAAM,KAAK,IAAA,EAAK;AAChB,IAAA,MAAM,SAAS,EAAC;AAEhB,IAAA,KAAA,MAAW,OAAA,IAAW,iBAAA,CAAkB,MAAA,IAAU,EAAC,EAAG;AAClD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA,EAAM;AAAA,UACF,SAAA,EAAW;AAAA,YACP,KAAA,EAAO;AAAA,cACH,KAAA,EAAO;AAAA;AACX;AACJ;AACJ,OACH,CAAA;AAAA,IACL;AAEA,IAAA,KAAA,MAAW,OAAA,IAAW,iBAAA,CAAkB,KAAA,IAAS,EAAC,EAAG;AACjD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA,EAAM;AAAA,UACF,QAAA,EAAU;AAAA,YACN,KAAA,EAAO;AAAA,cACH,KAAA,EAAO;AAAA;AACX;AACJ;AACJ,OACH,CAAA;AAAA,IACL;AAEA,IAAA,IAAI,kBAAkB,iBAAA,EAAmB;AACrC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA,EAAM;AAAA,UACF,iBAAA,EAAmB,EAAE,KAAA,EAAO,EAAC;AAA2B;AAC5D,OACH,CAAA;AAAA,IACL;AACA,IAAA,IAAI,kBAAkB,oBAAA,EAAsB;AACxC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA,EAAM;AAAA,UACF,oBAAA,EAAsB;AAAA,YAClB,OAAO;AAAC;AACZ;AACJ,OACH,CAAA;AAAA,IACL;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA;AAAA,MACtB,4BAAA;AAAA,MACA;AAAA,QACI,kBAAA,EAAoB,EAAA;AAAA,QACpB,MAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACA;AAAA,QACI,IAAA,EAAM;AAAA,UACF,SAAA,EAAW;AAAA;AACf;AACJ,KACJ;AAEA,IAAA,IAAI,CAAC,OAAO,kBAAA,EAAoB;AAC5B,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,MAAa,qBAAA,CACT,cAAA,EACA,sBAAA,EACA,mBAAA,EACsC;AACtC,IAAA,MAAM,KAAK,IAAA,EAAK;AAChB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MAClC,+BAAA;AAAA,MACA;AAAA,QACI,IAAA,EAAM;AAAA,UACF,YAAA,EAAc,cAAA;AAAA,UACd,kBAAA,EAAoB,EAAA;AAAA,UACpB,sBAAA;AAAA,UACA;AAAA;AACJ;AACJ,KACJ;AAEA,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,gBAAA,CACT,cAAA,EACA,SAAA,EACA,WACA,+BAAA,GAA2C,KAAA,EAC3C,qBAAA,GAAgC,CAAA,EAChC,8BAAA,GAA2C,EAAC,EAC5C,wBAAA,GAAqC,EAAC,EACF;AACpC,IAAA,MAAM,KAAK,IAAA,EAAK;AAEhB,IAAA,MAAM,IAAA,GAAO;AAAA,MACT,YAAA,EAAc,cAAA;AAAA,MACd,SAAA;AAAA,MACA,SAAA,EAAW;AAAA,QACP,MAAA,EAAQ,uBAAA;AAAA,QACR,OAAA,EAAS,SAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACb;AAAA,MACA,+BAAA;AAAA,MACA,qBAAA;AAAA,MACA,8BAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,+BAA+B,CAAA;AAEvD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MAClC,wCAAA;AAAA,MACA,EAAE,IAAA;AAAK,KACX;AAEA,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA,EAIA,MAAa,iBAAA,GAAqC;AAC9C,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,OAAO,IAAA,CAAK,cAAA;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA;AAAA,MACxB;AAAA,KACJ;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,sBAAA,GAAyB,CAAC,CAAA,EAAG;AACvC,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACtD;AACA,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,sBAAA,CAAuB,CAAC,CAAA,CAAE,cAAA;AAC1D,IAAA,IAAI,QAAA,CAAS,sBAAA,CAAuB,MAAA,GAAS,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACR,CAAA,MAAA,EAAS,QAAA,CAAS,sBAAA,CAAuB,MAAM,iCAAiC,cAAc,CAAA;AAAA,OAClG;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AACtB,IAAA,OAAO,cAAA;AAAA,EACX;AAAA,EAEA,MAAa,aAAA,CACT,IAAA,EACA,MACA,YAAA,GAAiC,uBAAA,EACjC,QAIA,iBAAA,EAC2B;AAC3B,IAAA,OAAO,MAAM,SAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,QAAQ,iBAAiB,CAAA;AAAA,MACrD,YAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACT,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM;AACX,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACR,mCAAmC,IAAI,CAAA,yBAAA,EAA4B,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,OACnG;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AACtC,MAAA,MAAM,gBAAgB,CAAC,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAa,YAAA,CACT,IAAA,EACA,YAAA,GAAiC,yBACjC,MAAA,EAI0B;AAC1B,IAAA,OAAO,MAAM,SAAA;AAAA,MACT,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAAA,MAC3B,YAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACT,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM;AACX,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACR,kCAAkC,IAAI,CAAA,oBAAA,EAAuB,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,OAC7F;AAEA,MAAA,MAAM,gBAAgB,CAAC,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAa,cAAA,CACT,IAAA,EACA,MACA,YAAA,GAAiC,uBAAA,EACjC,QAIA,iBAAA,EAC4B;AAC5B,IAAA,OAAO,MAAM,SAAA;AAAA,MACT,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,IAAA,EAAM,QAAQ,iBAAiB,CAAA;AAAA,MACtD,YAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACT,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM;AACX,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACR,oCAAoC,IAAI,CAAA,yBAAA,EAA4B,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,OACpG;AACA,MAAA,MAAM,gBAAgB,CAAC,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAa,KAAA,CACT,IAAA,EACA,IAAA,EACA,QAKA,iBAAA,EAC4B;AAE5B,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAG,iBAAA,EAAkB;AAErD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,MAAM,OAAO,CAAA;AACzD,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,IAAA,CACT,IAAA,EACA,IAAA,EACA,QAKA,iBAAA,EAC2B;AAE3B,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAG,iBAAA,EAAkB;AAErD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,MAAM,OAAO,CAAA;AACxD,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,GAAA,CACT,IAAA,EACA,MAAA,EAI0B;AAC1B,IAAA,MAAM,KAAK,IAAA,EAAK;AAEhB,IAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAO;AACzB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,MAAM,OAAO,CAAA;AACvD,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAc,aAAgB,QAAA,EAGf;AACX,IAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAW;AAC7B,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAAA,IACxC,CAAA,MAAO;AACH,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,IACxC;AAAA,EACJ;AACJ","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 { LedgerClient } from './ledger-client.js'\n\nimport { Types } from './ledger-client.js'\nimport { PartyId } from '@canton-network/core-types'\n\nimport { Logger } from '@canton-network/core-types'\nimport { ErrorInfo, RetryInfo } from '@canton-network/core-ledger-proto'\n\ntype Completion = Types['Completion']['value']\nexport type JSContractEntry = Types['JsContractEntry']\nexport type JsCantonError = Types['JsCantonError']\n\nconst COMPLETIONS_LIMIT = '100'\nconst COMPLETIONS_STREAM_IDLE_TIMEOUT_MS = '1000'\n\n/**\n * Polls the completions endpoint until\n * the completion with the given (userId, commandId, submissionId) is returned.\n * Then returns the updateId, synchronizerId and recordTime of that completion.\n */\nexport async function awaitCompletion(\n ledgerClient: LedgerClient,\n ledgerEnd: number,\n partyId: PartyId,\n userId: string,\n commandIdOrSubmissionId: string\n): Promise<Completion> {\n const responses = await ledgerClient.postWithRetry(\n '/v2/commands/completions',\n {\n userId,\n parties: [partyId],\n beginExclusive: ledgerEnd,\n },\n defaultRetryableOptions,\n {\n query: {\n limit: COMPLETIONS_LIMIT,\n stream_idle_timeout_ms: COMPLETIONS_STREAM_IDLE_TIMEOUT_MS,\n },\n }\n )\n\n const completions = responses.filter(\n (r) => r.completionResponse && 'Completion' in r.completionResponse\n )\n\n const wantedCompletion = responses.find((r) => {\n if (r.completionResponse && 'Completion' in r.completionResponse) {\n const completion = r.completionResponse.Completion?.value\n if (!completion) {\n return false\n }\n return (\n completion.userId === userId &&\n (completion.commandId === commandIdOrSubmissionId ||\n completion.submissionId === commandIdOrSubmissionId)\n )\n }\n return false\n })\n\n if (\n wantedCompletion?.completionResponse &&\n 'Completion' in wantedCompletion.completionResponse\n ) {\n const completion = wantedCompletion.completionResponse.Completion.value\n const status = completion.status\n if (status && status.code !== 0) {\n // status.code is 0 for success\n throw asGrpcError(status)\n }\n return completion\n } else {\n const lastCompletion = completions[completions.length - 1]\n const newLedgerEnd =\n lastCompletion?.completionResponse &&\n 'Completion' in lastCompletion.completionResponse\n ? lastCompletion.completionResponse.Completion.value.offset\n : undefined\n\n return awaitCompletion(\n ledgerClient,\n newLedgerEnd || ledgerEnd, // !newLedgerEnd implies response was empty\n partyId,\n userId,\n commandIdOrSubmissionId\n )\n }\n}\n\nexport async function promiseWithTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage: string\n): Promise<T> {\n let timeoutPid: NodeJS.Timeout | null = null\n const timeoutPromise: Promise<T> = new Promise((_resolve, reject) => {\n timeoutPid = setTimeout(() => reject(errorMessage), timeoutMs)\n })\n\n try {\n return await Promise.race([promise, timeoutPromise])\n } finally {\n if (timeoutPid) {\n clearTimeout(timeoutPid)\n }\n }\n}\n\nexport type RetryableOptions = {\n retries: number\n delayMs: number\n cantonErrorKeys: string[]\n}\nexport const defaultRetryableOptions: RetryableOptions = {\n retries: 5,\n delayMs: 3000,\n cantonErrorKeys: [\n 'SEQUENCER_REQUEST_FAILED',\n 'SEQUENCER_BACKPRESSURE',\n 'SUBMISSION_ALREADY_IN_FLIGHT',\n 'LOCAL_VERDICT_TIMEOUT',\n 'NOT_SEQUENCED_TIMEOUT',\n 'NO_VIEW_WITH_VALID_RECIPIENTS',\n ],\n}\n\nexport async function retryable<T>(\n fn: () => Promise<T>,\n retryableOptions: RetryableOptions,\n logger?: Logger\n): Promise<T> {\n for (let attempts = 1; attempts <= retryableOptions.retries; attempts++) {\n try {\n return await fn()\n } catch (err: unknown) {\n const grpcError = asGrpcError(err)\n const message: string = grpcError.message\n const shouldRetry =\n retryableOptions.cantonErrorKeys.length === 0 ||\n retryableOptions.cantonErrorKeys.some((key) =>\n message.includes(key)\n )\n if (attempts < retryableOptions.retries && shouldRetry) {\n logger?.warn(\n `Caught retryiable error: ${message}. Retrying attempt ${attempts} of ${retryableOptions.retries}...`\n )\n await new Promise((res) =>\n setTimeout(res, retryableOptions.delayMs)\n )\n // continue to next attempt\n } else {\n throw grpcError\n }\n }\n }\n throw new Error('retryable: Exceeded maximum retries without throwing.')\n}\n\n// Helper for differentiating ledger errors from others and satisfying TS when checking error properties\nexport const isJsCantonError = (e: unknown): e is JsCantonError =>\n typeof e === 'object' &&\n e !== null &&\n 'code' in e &&\n 'cause' in e &&\n 'errorCategory' in e\n\nexport const asJsCantonError = (e: unknown): JsCantonError => {\n if (isJsCantonError(e)) {\n return e\n } else {\n throw e\n }\n}\n\nexport const asGrpcError = (\n e: unknown\n): {\n code: number\n message: string\n errorInfo: ErrorInfo | undefined\n retryInfo: RetryInfo | undefined\n} => {\n let errorInfo: ErrorInfo | undefined\n let retryInfo: RetryInfo | undefined\n\n if (\n typeof e === 'object' &&\n e !== null &&\n 'code' in e &&\n 'message' in e &&\n 'details' in e &&\n Array.isArray(e.details)\n ) {\n const code = e.code as number\n const message = e.message as string\n\n for (const detail of e.details) {\n if (\n detail.typeUrl === 'type.googleapis.com/google.rpc.ErrorInfo' &&\n typeof detail.value === 'string'\n ) {\n try {\n errorInfo = ErrorInfo.fromBinary(\n Buffer.from(detail.value, 'base64')\n )\n } catch {\n //if parsing fails, we skip adding ErrorInfo\n }\n } else if (\n detail.typeUrl === 'type.googleapis.com/google.rpc.RetryInfo' &&\n typeof detail.value === 'string'\n ) {\n try {\n retryInfo = RetryInfo.fromBinary(\n Buffer.from(detail.value, 'base64')\n )\n } catch {\n //if parsing fails, we skip adding RetryInfo\n }\n }\n }\n return { code, message, errorInfo, retryInfo }\n }\n\n // Not a gRPC error, rethrow\n throw e\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 {\n supportedLedgerApiVersions,\n type LedgerApiVersion,\n type LedgerCommonPaths,\n type LedgerCommonSchemas,\n} from '@canton-network/core-ledger-client-types'\nimport createClient, { Client, FetchOptions } from 'openapi-fetch'\nimport { Logger } from 'pino'\nimport { PartyId } from '@canton-network/core-types'\nimport {\n asJsCantonError,\n defaultRetryableOptions,\n retryable,\n RetryableOptions,\n} from './ledger-api-utils.js'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport const supportedVersions = supportedLedgerApiVersions\n\nexport type SupportedVersions = LedgerApiVersion\n\ntype paths = LedgerCommonPaths\n\ntype SchemaByVersion<Name extends keyof LedgerCommonSchemas> =\n LedgerCommonSchemas[Name]\n\ntype ClientsByVersion = {\n [V in SupportedVersions]: Client<paths>\n}\n\nexport type UserSchema = SchemaByVersion<'User'>\n\nexport type Types = LedgerCommonSchemas\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\nexport type PatchEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n patch: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PatchRequest<Path extends PatchEndpoint> = paths[Path] extends {\n patch: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PatchResponse<Path extends PatchEndpoint> = paths[Path] extends {\n patch: {\n responses: { 200: { content: { 'application/json': infer Res } } }\n }\n}\n ? Res\n : never\n\n// A conditional type that filters the set of OpenAPI path names to those that actually have a defined POST operation.\n// Any path without a POST is excluded via the `never` branch of the conditional\nexport type PostEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n post: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Given a pathname (string) that has a POST, this helper type extracts the request body type from the OpenAPI definition.\nexport type PostRequest<Path extends PostEndpoint> = paths[Path] extends {\n post: { requestBody: { content: { 'application/json': infer Req } } }\n}\n ? Req\n : never\n\n// Given a pathname (string) that has a POST, this helper type extracts the 200 response type from the OpenAPI definition.\nexport type PostResponse<Path extends PostEndpoint> = paths[Path] extends {\n post: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\n// Similar as above, for GETs\nexport type GetEndpoint = {\n [Pathname in keyof paths]: paths[Pathname] extends {\n get: unknown\n }\n ? Pathname\n : never\n}[keyof paths]\n\n// Similar as above, for GETs\nexport type GetResponse<Path extends GetEndpoint> = paths[Path] extends {\n get: { responses: { 200: { content: { 'application/json': infer Res } } } }\n}\n ? Res\n : never\n\nexport type GenerateTransactionResponse =\n SchemaByVersion<'GenerateExternalPartyTopologyResponse'>\n\nexport type AllocateExternalPartyResponse =\n SchemaByVersion<'AllocateExternalPartyResponse'>\nexport type OnboardingTransactions = NonNullable<\n SchemaByVersion<'AllocateExternalPartyRequest'>['onboardingTransactions']\n>\n\nexport type MultiHashSignatures = NonNullable<\n SchemaByVersion<'AllocateExternalPartyRequest'>['multiHashSignatures']\n>\nexport type PrepareSubmissionResponse =\n SchemaByVersion<'JsPrepareSubmissionResponse'>\n\n// Any options the client accepts besides body/params\ntype ExtraPostOpts = Omit<FetchOptions<paths>, 'body' | 'params'>\n\nexport class LedgerClient {\n // privately manage the active connected version and associated client codegen\n private readonly clients: ClientsByVersion\n private clientVersion: SupportedVersions = '3.5'\n private initialized: boolean = false\n private accessTokenProvider: AccessTokenProvider\n private readonly logger: Logger\n private synchronizerId: string | undefined\n baseUrl: URL\n\n constructor({\n baseUrl,\n logger,\n accessTokenProvider,\n version,\n }: {\n baseUrl: URL\n logger: Logger\n accessTokenProvider: AccessTokenProvider\n version?: SupportedVersions\n }) {\n this.logger = logger.child({ component: 'LedgerClient' })\n this.accessTokenProvider = accessTokenProvider\n\n const authenticatedFetch = async (\n url: RequestInfo,\n options: RequestInit = {}\n ) => {\n const token = await this.accessTokenProvider.getAccessToken()\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token && { Authorization: `Bearer ${token}` }),\n },\n })\n }\n\n this.clients = {\n ...supportedVersions.reduce((acc, version) => {\n acc[version] = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: authenticatedFetch,\n })\n return acc\n }, {} as ClientsByVersion),\n }\n\n this.clientVersion = version ?? this.clientVersion\n this.baseUrl = baseUrl\n }\n\n private get currentClient(): Client<paths> {\n return this.clients[this.clientVersion] as unknown as Client<paths>\n }\n\n public async init() {\n if (!this.initialized) {\n this.logger.debug(\n `Initializing LedgerClient with version ${this.clientVersion} for url ${this.baseUrl.href}`\n )\n\n //TODO: parse error response and escalate\n const versionFromClient =\n await this.currentClient.GET('/v2/version')\n\n this.logger.debug(\n {\n data: versionFromClient.data,\n status: versionFromClient.response.status,\n },\n 'getV2Version response'\n )\n\n this.clientVersion = this.parseSupportedVersions(\n versionFromClient.data?.version\n )\n this.initialized = true\n }\n }\n\n public getCurrentClientVersion(): SupportedVersions {\n return this.clientVersion\n }\n\n parseSupportedVersions(version: string | undefined): SupportedVersions {\n if (!version) {\n throw new Error('Client version missing from response')\n }\n\n const match = supportedVersions.find((v) => version.startsWith(v))\n if (!match) {\n this.logger.warn(\n `Unknown support of version ${version} (defaulting to ${this.clientVersion}) please check if a newer version is available that support this version of canton.`\n )\n return this.clientVersion\n }\n\n return match\n }\n\n /**\n * Check if a party exists\n *\n * @param partyId The ID of the party to look for\n * @returns A promise to resolves to a boolean.\n */\n public async checkIfPartyExists(partyId: PartyId): Promise<boolean> {\n try {\n const party = await this.get('/v2/parties/{party}', {\n path: { party: partyId },\n })\n return (\n party.partyDetails !== undefined &&\n party.partyDetails[0].party === partyId\n )\n } catch {\n return false\n }\n }\n\n /**\n * grant \"Master User\" rights to a user.\n *\n * this require running with an admin token.\n *\n * @param userId The ID of the user to grant rights to.\n * @param canReadAsAnyParty define if the user can read as any party.\n * @param canExecuteAsAnyParty define if the user can execute as any party.\n */\n public async grantMasterUserRights(\n userId: string,\n canReadAsAnyParty: boolean,\n canExecuteAsAnyParty: boolean\n ) {\n const rights = []\n if (canReadAsAnyParty) {\n rights.push({\n kind: {\n CanReadAsAnyParty: { value: {} as Record<string, never> },\n },\n })\n }\n if (canExecuteAsAnyParty) {\n rights.push({\n kind: {\n CanExecuteAsAnyParty: {\n value: {} as Record<string, never>,\n },\n },\n })\n }\n\n const result = await this.post(\n '/v2/users/{user-id}/rights',\n {\n identityProviderId: '',\n userId,\n rights,\n },\n {\n path: {\n 'user-id': userId,\n },\n }\n )\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n }\n\n /**\n * Create a new user.\n *\n * @param userId The ID of the user to create.\n * @param primaryParty The primary party of the user.\n */\n public async createUser(\n userId: string,\n primaryParty: PartyId\n ): Promise<UserSchema> {\n try {\n const existing = await this.get('/v2/users/{user-id}', {\n path: { 'user-id': userId },\n })\n\n if (existing && existing.user) {\n return existing.user!\n }\n } catch {\n //TODO: proper error handling based on daml code\n // we continue if code is:\n // code: 'USER_NOT_FOUND',\n // cause: 'getting user failed for unknown user \"master-user\"',\n }\n\n return (\n await this.post('/v2/users', {\n user: {\n identityProviderId: '',\n id: userId,\n isDeactivated: false,\n primaryParty: primaryParty,\n },\n rights: [\n {\n kind: {\n ParticipantAdmin: {\n value: {} as Record<string, never>,\n },\n },\n },\n ],\n })\n ).user!\n }\n\n /**\n * Grants a user the right to act as a party, while ensuring the party exists.\n *\n * @param userId The ID of the user to grant rights to.\n * @param partyId The ID of the party to grant rights for.\n * @param maxTries Optional max number of retries with default 30. May be increased if expecting heavy load.\n * @param retryIntervalMs Optional interval between retries to verify that party exists with default 2000ms. May be increased if expecting heavy load.\n * @returns A promise that resolves when the rights have been granted.\n */\n public async waitForPartyAndGrantUserRights(\n userId: string,\n partyId: PartyId,\n maxTries: number = 30,\n retryIntervalMs: number = 2000\n ) {\n await this.init()\n // Wait for party to appear on participant\n let partyFound = false\n let tries = 0\n\n while (!partyFound && tries < maxTries) {\n partyFound = await this.checkIfPartyExists(partyId)\n\n await new Promise((resolve) => setTimeout(resolve, retryIntervalMs))\n tries++\n }\n\n if (tries >= maxTries) {\n throw new Error(\n `timed out waiting for new party to appear after ${maxTries} tries`\n )\n }\n\n const result = await this.grantRights(userId, {\n actAs: [partyId],\n })\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n\n return\n }\n\n public async grantRights(\n userId: string,\n userRightsOptions: {\n canReadAsAnyParty?: boolean\n canExecuteAsAnyParty?: boolean\n readAs?: PartyId[]\n actAs?: PartyId[]\n }\n ) {\n await this.init()\n const rights = []\n\n for (const partyId of userRightsOptions.readAs ?? []) {\n rights.push({\n kind: {\n CanReadAs: {\n value: {\n party: partyId,\n },\n },\n },\n })\n }\n\n for (const partyId of userRightsOptions.actAs ?? []) {\n rights.push({\n kind: {\n CanActAs: {\n value: {\n party: partyId,\n },\n },\n },\n })\n }\n\n if (userRightsOptions.canReadAsAnyParty) {\n rights.push({\n kind: {\n CanReadAsAnyParty: { value: {} as Record<string, never> },\n },\n })\n }\n if (userRightsOptions.canExecuteAsAnyParty) {\n rights.push({\n kind: {\n CanExecuteAsAnyParty: {\n value: {} as Record<string, never>,\n },\n },\n })\n }\n\n const result = await this.post(\n '/v2/users/{user-id}/rights',\n {\n identityProviderId: '',\n userId,\n rights,\n },\n {\n path: {\n 'user-id': userId,\n },\n }\n )\n\n if (!result.newlyGrantedRights) {\n throw new Error('Failed to grant user rights')\n }\n\n return result\n }\n\n public async allocateExternalParty(\n synchronizerId: string,\n onboardingTransactions: OnboardingTransactions,\n multiHashSignatures: MultiHashSignatures\n ): Promise<AllocateExternalPartyResponse> {\n await this.init()\n const resp = await this.currentClient.POST(\n '/v2/parties/external/allocate',\n {\n body: {\n synchronizer: synchronizerId,\n identityProviderId: '',\n onboardingTransactions,\n multiHashSignatures,\n },\n }\n )\n\n return this.valueOrError(resp)\n }\n\n public async generateTopology(\n synchronizerId: string,\n publicKey: string,\n partyHint: string,\n localParticipantObservationOnly: boolean = false,\n confirmationThreshold: number = 1,\n otherConfirmingParticipantUids: string[] = [],\n observingParticipantUids: string[] = []\n ): Promise<GenerateTransactionResponse> {\n await this.init()\n\n const body = {\n synchronizer: synchronizerId,\n partyHint,\n publicKey: {\n format: 'CRYPTO_KEY_FORMAT_RAW',\n keyData: publicKey,\n keySpec: 'SIGNING_KEY_SPEC_EC_CURVE25519',\n },\n localParticipantObservationOnly,\n confirmationThreshold,\n otherConfirmingParticipantUids,\n observingParticipantUids,\n }\n\n this.logger.debug(body, 'generateTopology request body')\n\n const resp = await this.currentClient.POST(\n '/v2/parties/external/generate-topology',\n { body }\n )\n\n return this.valueOrError(resp)\n }\n\n // Retrieve an (arbitrary) synchronizer id from the validator.\n // This synchronizer id is cached for the remainder of this object's life.\n public async getSynchronizerId(): Promise<string> {\n if (this.synchronizerId) return this.synchronizerId\n const response = await this.getWithRetry(\n '/v2/state/connected-synchronizers'\n )\n if (!response.connectedSynchronizers?.[0]) {\n throw new Error('No connected synchronizers found')\n }\n const synchronizerId = response.connectedSynchronizers[0].synchronizerId\n if (response.connectedSynchronizers.length > 1) {\n this.logger.warn(\n `Found ${response.connectedSynchronizers.length} synchronizers, defaulting to ${synchronizerId}`\n )\n }\n this.synchronizerId = synchronizerId\n return synchronizerId\n }\n\n public async postWithRetry<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n retryOptions: RetryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n },\n additionalOptions?: ExtraPostOpts\n ): Promise<PostResponse<Path>> {\n return await retryable(\n () => this.post(path, body, params, additionalOptions),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in postWithRetry for path ${path} with body retry options ${JSON.stringify(retryOptions)}`\n )\n this.logger.debug(JSON.stringify(body))\n throw asJsCantonError(e)\n })\n }\n\n public async getWithRetry<Path extends GetEndpoint>(\n path: Path,\n retryOptions: RetryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n return await retryable(\n () => this.get(path, params),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in getWithRetry for path ${path} with retry options ${JSON.stringify(retryOptions)}`\n )\n\n throw asJsCantonError(e)\n })\n }\n\n public async patchWithRetry<Path extends PatchEndpoint>(\n path: Path,\n body: PatchRequest<Path>,\n retryOptions: RetryableOptions = defaultRetryableOptions,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n },\n additionalOptions?: ExtraPostOpts\n ): Promise<PatchResponse<Path>> {\n return await retryable(\n () => this.patch(path, body, params, additionalOptions),\n retryOptions,\n this.logger\n ).catch((e) => {\n this.logger.warn(\n `Error in patchWithRetry for path ${path} with body retry options ${JSON.stringify(retryOptions)}`\n )\n throw asJsCantonError(e)\n })\n }\n\n public async patch<Path extends PatchEndpoint>(\n path: Path,\n body: PatchRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string | number | boolean>\n },\n // needed when posting to /packages, so content type and jsonification of bytes can be overriden\n additionalOptions?: ExtraPostOpts\n ): Promise<PatchResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params, ...additionalOptions } as any\n\n const resp = await this.currentClient.PATCH(path, options)\n return this.valueOrError(resp)\n }\n\n public async post<Path extends PostEndpoint>(\n path: Path,\n body: PostRequest<Path>,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string | number | boolean>\n },\n // needed when posting to /packages, so content type and jsonification of bytes can be overriden\n additionalOptions?: ExtraPostOpts\n ): Promise<PostResponse<Path>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { body, params, ...additionalOptions } as any\n\n const resp = await this.currentClient.POST(path, options)\n return this.valueOrError(resp)\n }\n\n public async get<Path extends GetEndpoint>(\n path: Path,\n params?: {\n path?: Record<string, string>\n query?: Record<string, string>\n }\n ): Promise<GetResponse<Path>> {\n await this.init()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n const resp = await this.currentClient.GET(path, options)\n return this.valueOrError(resp)\n }\n\n private async valueOrError<T>(response: {\n data?: T\n error?: unknown\n }): Promise<T> {\n if (response.data === undefined) {\n return Promise.reject(response.error)\n } else {\n return Promise.resolve(response.data)\n }\n }\n}\n"]} |
@@ -16,3 +16,3 @@ import { LedgerClient } from './ledger-client.js'; | ||
| export declare function promiseWithTimeout<T>(promise: Promise<T>, timeoutMs: number, errorMessage: string): Promise<T>; | ||
| export type retryableOptions = { | ||
| export type RetryableOptions = { | ||
| retries: number; | ||
@@ -22,4 +22,4 @@ delayMs: number; | ||
| }; | ||
| export declare const defaultRetryableOptions: retryableOptions; | ||
| export declare function retryable<T>(fn: () => Promise<T>, retryableOptions: retryableOptions, logger?: Logger): Promise<T>; | ||
| export declare const defaultRetryableOptions: RetryableOptions; | ||
| export declare function retryable<T>(fn: () => Promise<T>, retryableOptions: RetryableOptions, logger?: Logger): Promise<T>; | ||
| export declare const isJsCantonError: (e: unknown) => e is JsCantonError; | ||
@@ -26,0 +26,0 @@ export declare const asJsCantonError: (e: unknown) => JsCantonError; |
@@ -5,3 +5,3 @@ import { type LedgerApiVersion, type LedgerCommonPaths, type LedgerCommonSchemas } from '@canton-network/core-ledger-client-types'; | ||
| import { PartyId } from '@canton-network/core-types'; | ||
| import { retryableOptions } from './ledger-api-utils.js'; | ||
| import { RetryableOptions } from './ledger-api-utils.js'; | ||
| import { AccessTokenProvider } from '@canton-network/core-wallet-auth'; | ||
@@ -151,11 +151,11 @@ export declare const supportedVersions: readonly ["3.4", "3.5"]; | ||
| getSynchronizerId(): Promise<string>; | ||
| postWithRetry<Path extends PostEndpoint>(path: Path, body: PostRequest<Path>, retryOptions?: retryableOptions, params?: { | ||
| postWithRetry<Path extends PostEndpoint>(path: Path, body: PostRequest<Path>, retryOptions?: RetryableOptions, params?: { | ||
| path?: Record<string, string>; | ||
| query?: Record<string, string>; | ||
| }, additionalOptions?: ExtraPostOpts): Promise<PostResponse<Path>>; | ||
| getWithRetry<Path extends GetEndpoint>(path: Path, retryOptions?: retryableOptions, params?: { | ||
| getWithRetry<Path extends GetEndpoint>(path: Path, retryOptions?: RetryableOptions, params?: { | ||
| path?: Record<string, string>; | ||
| query?: Record<string, string>; | ||
| }): Promise<GetResponse<Path>>; | ||
| patchWithRetry<Path extends PatchEndpoint>(path: Path, body: PatchRequest<Path>, retryOptions?: retryableOptions, params?: { | ||
| patchWithRetry<Path extends PatchEndpoint>(path: Path, body: PatchRequest<Path>, retryOptions?: RetryableOptions, params?: { | ||
| path?: Record<string, string>; | ||
@@ -162,0 +162,0 @@ query?: Record<string, string>; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"ledger-client.d.ts","sourceRoot":"","sources":["../src/ledger-client.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"ledger-client.d.ts","sourceRoot":"","sources":["../src/ledger-client.ts"],"names":[],"mappings":"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"} |
+9
-10
| { | ||
| "name": "@canton-network/core-ledger-client", | ||
| "version": "1.5.0", | ||
| "version": "1.6.0", | ||
| "type": "module", | ||
@@ -8,3 +8,2 @@ "description": "Provides a TypeScript Canton Network ledger client, generated by the OpenAPI spec", | ||
| "author": "Phillip Olesen <phillip.olesen@digitalasset.com>", | ||
| "packageManager": "yarn@4.9.4", | ||
| "main": "dist/index.cjs", | ||
@@ -26,4 +25,4 @@ "module": "dist/index.js", | ||
| "flatpack": "yarn pack --out \"$FLATPACK_OUTDIR\"", | ||
| "test": "vitest run --project node --project browser --passWithNoTests", | ||
| "test:coverage": "vitest run --project node --project browser --coverage --passWithNoTests" | ||
| "test": "vitest run --project node --project browser", | ||
| "test:coverage": "vitest run --project node --project browser --coverage" | ||
| }, | ||
@@ -41,8 +40,8 @@ "devDependencies": { | ||
| "dependencies": { | ||
| "@canton-network/core-ledger-client-types": "^1.5.0", | ||
| "@canton-network/core-ledger-proto": "^1.5.0", | ||
| "@canton-network/core-splice-client": "^1.5.0", | ||
| "@canton-network/core-token-standard": "^1.5.0", | ||
| "@canton-network/core-types": "^1.5.0", | ||
| "@canton-network/core-wallet-auth": "^1.5.0", | ||
| "@canton-network/core-ledger-client-types": "^1.6.0", | ||
| "@canton-network/core-ledger-proto": "^1.5.1", | ||
| "@canton-network/core-splice-client": "^1.6.0", | ||
| "@canton-network/core-token-standard": "^1.6.0", | ||
| "@canton-network/core-types": "^1.6.0", | ||
| "@canton-network/core-wallet-auth": "^1.6.0", | ||
| "bignumber.js": "^10.0.2", | ||
@@ -49,0 +48,0 @@ "dayjs": "^1.11.19", |
141944
1.72%14
16.67%1281
2.23%