@canton-network/core-splice-client 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -71,14 +71,16 @@ var ScanClient = class {
71
71
  } else return initActiveSynchronizer;
72
72
  }
73
73
  };
74
- var ScanProxyClient = class {
74
+ var _ScanProxyClient = class _ScanProxyClient {
75
75
  constructor(baseUrl, logger, isAdmin, accessToken, accessTokenProvider) {
76
76
  __publicField(this, "client");
77
77
  __publicField(this, "logger");
78
78
  __publicField(this, "accessTokenProvider");
79
+ __publicField(this, "baseUrlHref");
80
+ this.baseUrlHref = baseUrl.href;
79
81
  this.accessTokenProvider = accessTokenProvider;
80
82
  this.logger = logger;
81
- this.logger.debug({ baseUrl }, "TokenStandardClient initialized");
83
+ this.logger.debug({ baseUrl }, "ScanProxyClient initialized");
82
84
  this.client = createClient__default.default({
83
85
  baseUrl: baseUrl.href,
84
86
  fetch: async (url, options = {}) => {
@@ -119,17 +121,103 @@ var ScanProxyClient = class {
119
121
  return Promise.resolve(response.data);
120
122
  }
121
123
  }
124
+ async fetchAmuletRulesOnce() {
125
+ const resp = await this.get("/v0/scan-proxy/amulet-rules");
126
+ const contract = resp?.amulet_rules?.contract;
127
+ if (!contract?.contract_id || !contract?.template_id) {
128
+ throw new Error("Malformed AmuletRules response");
129
+ }
130
+ _ScanProxyClient.amuletRulesCache.set(this.baseUrlHref, contract);
131
+ return contract;
132
+ }
122
133
  async getAmuletRules() {
123
- const amuletRules = await this.get("/v0/scan-proxy/amulet-rules");
124
- return amuletRules.amulet_rules.contract;
134
+ const key = this.baseUrlHref;
135
+ const cached = _ScanProxyClient.amuletRulesCache.get(key);
136
+ if (cached) return structuredClone(cached);
137
+ let inflight = _ScanProxyClient.amuletRulesInflight.get(key);
138
+ if (!inflight) {
139
+ inflight = this.fetchAmuletRulesOnce().finally(() => {
140
+ _ScanProxyClient.amuletRulesInflight.delete(key);
141
+ });
142
+ _ScanProxyClient.amuletRulesInflight.set(key, inflight);
143
+ }
144
+ const contract = await inflight;
145
+ return structuredClone(contract);
125
146
  }
126
- async getOpenMiningRounds() {
127
- const openAndIssuingMiningRounds = await this.get(
147
+ static invalidateAmuletRulesCache(baseUrl) {
148
+ const key = baseUrl.href;
149
+ this.amuletRulesCache.delete(key);
150
+ this.amuletRulesInflight.delete(key);
151
+ }
152
+ computeNextChangeAt(rounds) {
153
+ const now = Date.now();
154
+ let next = Number.POSITIVE_INFINITY;
155
+ for (const round of rounds) {
156
+ const { opensAt, targetClosesAt } = round.payload ?? {};
157
+ const openMs = opensAt ? Number(new Date(opensAt)) : NaN;
158
+ const closeMs = targetClosesAt ? Number(new Date(targetClosesAt)) : NaN;
159
+ if (Number.isFinite(openMs) && openMs > now && openMs < next) {
160
+ next = openMs;
161
+ }
162
+ if (Number.isFinite(closeMs) && closeMs > now && closeMs < next) {
163
+ next = closeMs;
164
+ }
165
+ }
166
+ return Number.isFinite(next) ? next : now;
167
+ }
168
+ async fetchOpenMiningRoundsOnce() {
169
+ const resp = await this.get(
128
170
  "/v0/scan-proxy/open-and-issuing-mining-rounds"
129
171
  );
130
- return openAndIssuingMiningRounds.open_mining_rounds.map(
131
- (openMiningRound) => openMiningRound.contract
172
+ const rounds = (resp.open_mining_rounds ?? []).map(
173
+ (x) => x.contract
132
174
  );
175
+ const key = this.baseUrlHref;
176
+ _ScanProxyClient.roundsCache.set(key, rounds);
177
+ _ScanProxyClient.roundsNextChangeAt.set(
178
+ key,
179
+ this.computeNextChangeAt(rounds)
180
+ );
181
+ return rounds;
182
+ }
183
+ async refreshRounds(key) {
184
+ let inflight = _ScanProxyClient.roundsInflight.get(key);
185
+ if (!inflight) {
186
+ inflight = this.fetchOpenMiningRoundsOnce().finally(() => {
187
+ _ScanProxyClient.roundsInflight.delete(key);
188
+ });
189
+ _ScanProxyClient.roundsInflight.set(key, inflight);
190
+ }
191
+ return inflight;
192
+ }
193
+ async getOpenMiningRounds() {
194
+ const key = this.baseUrlHref;
195
+ const now = Date.now();
196
+ const cached = _ScanProxyClient.roundsCache.get(key);
197
+ const next = _ScanProxyClient.roundsNextChangeAt.get(key);
198
+ if (cached && next !== void 0 && now < next) {
199
+ return structuredClone(cached);
200
+ }
201
+ const fresh = await this.refreshRounds(key);
202
+ return structuredClone(fresh);
203
+ }
204
+ async getActiveOpenMiningRound() {
205
+ const pickActive = (rounds2, timestamp) => rounds2.filter((round) => {
206
+ const { opensAt, targetClosesAt } = round.payload;
207
+ const openMs = opensAt ? Number(new Date(opensAt)) : NaN;
208
+ const closeMs = targetClosesAt ? Number(new Date(targetClosesAt)) : NaN;
209
+ return Number.isFinite(openMs) && Number.isFinite(closeMs) && openMs <= timestamp && timestamp < closeMs;
210
+ }).sort((a, b) => a.payload.opensAt - b.payload.opensAt).at(-1) ?? null;
211
+ const now = Date.now();
212
+ const rounds = await this.getOpenMiningRounds();
213
+ const active = pickActive(rounds, now);
214
+ return active ? structuredClone(active) : null;
215
+ }
216
+ static invalidateOpenMiningRoundsCache(baseUrl) {
217
+ const key = baseUrl.href;
218
+ this.roundsCache.delete(key);
219
+ this.roundsInflight.delete(key);
220
+ this.roundsNextChangeAt.delete(key);
133
221
  }
134
222
  async getAmuletSynchronizerId() {
135
223
  const amuletRules = await this.getAmuletRules();
@@ -148,6 +236,15 @@ var ScanProxyClient = class {
148
236
  } else return initActiveSynchronizer;
149
237
  }
150
238
  };
239
+ // shared caches for all instances of ScanProxyClient
240
+ __publicField(_ScanProxyClient, "amuletRulesCache", /* @__PURE__ */ new Map());
241
+ __publicField(_ScanProxyClient, "roundsCache", /* @__PURE__ */ new Map());
242
+ // one in-flight fetch per baseUrl for rules/rounds
243
+ __publicField(_ScanProxyClient, "amuletRulesInflight", /* @__PURE__ */ new Map());
244
+ __publicField(_ScanProxyClient, "roundsInflight", /* @__PURE__ */ new Map());
245
+ // time after surpassing which mining rounds should be refreshed
246
+ __publicField(_ScanProxyClient, "roundsNextChangeAt", /* @__PURE__ */ new Map());
247
+ var ScanProxyClient = _ScanProxyClient;
151
248
  var ValidatorInternalClient = class {
152
249
  constructor(baseUrl, logger, isAdmin, accessToken, accessTokenProvider) {
153
250
  __publicField(this, "client");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/scan-client.ts","../src/scan-proxy-client.ts","../src/validator-internal-client.ts"],"names":["createClient"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\n\nexport type ScanTypes = components['schemas']\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\ntype 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\ntype 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 class ScanClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n\n constructor(baseUrl: string, logger: Logger, token?: string) {\n this.logger = logger\n this.logger.debug({ baseUrl, token }, 'TokenStandardClient initialized')\n this.client = createClient<paths>({\n baseUrl,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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 public async getAmuletSynchronizerId(): Promise<string | undefined> {\n const dsoInfo = await this.get('/v0/dso')\n\n const payloadObj = JSON.parse(\n JSON.stringify(dsoInfo.amulet_rules.contract.payload)\n )\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues as []\n\n if (futureValues.length > 0) {\n let updatedValue = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan-proxy'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport type ScanProxyTypes = components['schemas']\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\ntype 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\ntype 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 class ScanProxyClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private accessTokenProvider: AccessTokenProvider | undefined\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'TokenStandardClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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 public async getAmuletRules(): Promise<ScanProxyTypes['Contract']> {\n const amuletRules = await this.get('/v0/scan-proxy/amulet-rules')\n return amuletRules.amulet_rules.contract\n }\n\n public async getOpenMiningRounds(): Promise<ScanProxyTypes['Contract'][]> {\n const openAndIssuingMiningRounds = await this.get(\n '/v0/scan-proxy/open-and-issuing-mining-rounds'\n )\n return openAndIssuingMiningRounds.open_mining_rounds.map(\n (openMiningRound) => openMiningRound.contract\n )\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n type FutureValue = {\n decentralizedSynchronizer?: {\n activeSynchronizer?: string\n }\n }\n\n type Payload = {\n configSchedule?: {\n initialValue?: FutureValue\n futureValues?: FutureValue[]\n }\n }\n\n const amuletRules = await this.getAmuletRules()\n const payloadObj = amuletRules.payload as Payload\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues\n\n if (Array.isArray(futureValues) && futureValues.length > 0) {\n let updatedValue: string | undefined = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { paths } from './generated-clients/validator-internal'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\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\ntype 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\ntype 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 class ValidatorInternalClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private accessTokenProvider: AccessTokenProvider | undefined\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ValidatorInternalClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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"]}
1
+ {"version":3,"sources":["../src/scan-client.ts","../src/scan-proxy-client.ts","../src/validator-internal-client.ts"],"names":["createClient","rounds"],"mappings":";;;;;;;;;;;AAiDO,IAAM,aAAN,MAAiB;AAAA,EAIpB,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAgB,KAAA,EAAgB;AAH7D,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AAGb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,EAAE,OAAA,EAAS,KAAA,IAAS,iCAAiC,CAAA;AACvE,IAAA,IAAA,CAAK,SAASA,6BAAA,CAAoB;AAAA,MAC9B,OAAA;AAAA,MACA,KAAA,EAAO,OAAO,GAAA,EAAkB,OAAA,GAAuB,EAAC,KAAM;AAC1D,QAAA,OAAO,MAAM,GAAA,EAAK;AAAA,UACd,GAAG,OAAA;AAAA,UACH,OAAA,EAAS;AAAA,YACL,GAAI,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,YACxB,GAAI,QAAQ,EAAE,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA,KAAO,EAAC;AAAA,YACpD,cAAA,EAAgB;AAAA;AACpB,SACH,CAAA;AAAA,MACL;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEA,MAAa,IAAA,CACT,IAAA,EACA,IAAA,EACA,MAAA,EAI2B;AAE3B,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,WAAA,EAAa,MAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,WAAA,EAAa,IAAA,EAAM,UAAU,IAAA,EAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,GAAA,CACT,IAAA,EACA,MAAA,EAI0B;AAE1B,IAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAO;AAEzB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACR,EAAE,IAAA,EAAY,MAAA,EAAgB,QAAA,EAAU,IAAA,EAAK;AAAA,MAC7C,OAAO,IAAI,CAAA;AAAA,KACf;AACA,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;AAAA,EAEA,MAAa,uBAAA,GAAuD;AAChE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAExC,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA;AAAA,MACpB,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,YAAA,CAAa,SAAS,OAAO;AAAA,KACxD;AAEA,IAAA,MAAM,sBAAA,GACF,UAAA,EAAY,cAAA,EAAgB,YAAA,EAAc,yBAAA,EACpC,kBAAA;AACV,IAAA,MAAM,YAAA,GAAe,YAAY,cAAA,EAAgB,YAAA;AAEjD,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AACzB,MAAA,IAAI,YAAA,GAAe,MAAA;AACnB,MAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAC9B,QAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAC/C,QAAA,IAAI,MAAA,EAAQ,2BAA2B,kBAAA,EAAoB;AACvD,UAAA,YAAA,GACI,OAAO,yBAAA,CAA0B,kBAAA;AAAA,QACzC;AAAA,MACJ;AACA,MAAA,OAAO,YAAA,IAAgB,sBAAA;AAAA,IAC3B,OAAO,OAAO,sBAAA;AAAA,EAClB;AACJ;AC1FO,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EAuBzB,WAAA,CACI,OAAA,EACA,MAAA,EACA,OAAA,EACA,aACA,mBAAA,EACF;AA5BF,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,qBAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,aAAA,CAAA;AA0Bb,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,IAAA;AAC3B,IAAA,IAAA,CAAK,mBAAA,GAAsB,mBAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,OAAA,IAAW,6BAA6B,CAAA;AAC5D,IAAA,IAAA,CAAK,SAASA,6BAAAA,CAAoB;AAAA,MAC9B,SAAS,OAAA,CAAQ,IAAA;AAAA,MACjB,KAAA,EAAO,OAAO,GAAA,EAAkB,OAAA,GAAuB,EAAC,KAAM;AAC1D,QAAA,IAAI,KAAK,mBAAA,EAAqB;AAC1B,UAAA,WAAA,GAAc,OAAA,GACR,MAAM,IAAA,CAAK,mBAAA,CAAoB,qBAAoB,GACnD,MAAM,IAAA,CAAK,mBAAA,CAAoB,kBAAA,EAAmB;AAAA,QAC5D;AACA,QAAA,OAAO,MAAM,GAAA,EAAK;AAAA,UACd,GAAG,OAAA;AAAA,UACH,OAAA,EAAS;AAAA,YACL,GAAI,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,YACxB,GAAI,cACE,EAAE,aAAA,EAAe,UAAU,WAAW,CAAA,CAAA,KACtC,EAAC;AAAA,YACP,cAAA,EAAgB;AAAA;AACpB,SACH,CAAA;AAAA,MACL;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEA,MAAa,IAAA,CACT,IAAA,EACA,IAAA,EACA,MAAA,EAI2B;AAE3B,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,WAAA,EAAa,MAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,WAAA,EAAa,IAAA,EAAM,UAAU,IAAA,EAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,GAAA,CACT,IAAA,EACA,MAAA,EAI0B;AAE1B,IAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAO;AAEzB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACR,EAAE,IAAA,EAAY,MAAA,EAAgB,QAAA,EAAU,IAAA,EAAK;AAAA,MAC7C,OAAO,IAAI,CAAA;AAAA,KACf;AACA,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;AAAA,EAEA,MAAc,oBAAA,GAA4D;AACtE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAI,6BAA6B,CAAA;AACzD,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAc,QAAA;AACrC,IAAA,IAAI,CAAC,QAAA,EAAU,WAAA,IAAe,CAAC,UAAU,WAAA,EAAa;AAClD,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IACpD;AACA,IAAA,gBAAA,CAAgB,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AAC/D,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEA,MAAa,cAAA,GAAsD;AAC/D,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAgB,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAA;AAEvD,IAAA,IAAI,MAAA,EAAQ,OAAO,eAAA,CAAgB,MAAM,CAAA;AAEzC,IAAA,IAAI,QAAA,GAAW,gBAAA,CAAgB,mBAAA,CAAoB,GAAA,CAAI,GAAG,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,QAAA,GAAW,IAAA,CAAK,oBAAA,EAAqB,CAAE,OAAA,CAAQ,MAAM;AACjD,QAAA,gBAAA,CAAgB,mBAAA,CAAoB,OAAO,GAAG,CAAA;AAAA,MAClD,CAAC,CAAA;AACD,MAAA,gBAAA,CAAgB,mBAAA,CAAoB,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,WAAW,MAAM,QAAA;AACvB,IAAA,OAAO,gBAAgB,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEA,OAAc,2BAA2B,OAAA,EAAc;AACnD,IAAA,MAAM,MAAM,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,GAAG,CAAA;AAChC,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,GAAG,CAAA;AAAA,EACvC;AAAA,EAEQ,oBAAoB,MAAA,EAA8C;AACtE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,OAAO,MAAA,CAAO,iBAAA;AAElB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,MAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,KAAA,CAAM,WAAW,EAAC;AACtD,MAAA,MAAM,SAAS,OAAA,GAAU,MAAA,CAAO,IAAI,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,GAAA;AACrD,MAAA,MAAM,UAAU,cAAA,GACV,MAAA,CAAO,IAAI,IAAA,CAAK,cAAc,CAAC,CAAA,GAC/B,GAAA;AAEN,MAAA,IAAI,OAAO,QAAA,CAAS,MAAM,KAAK,MAAA,GAAS,GAAA,IAAO,SAAS,IAAA,EAAM;AAC1D,QAAA,IAAA,GAAO,MAAA;AAAA,MACX;AACA,MAAA,IAAI,OAAO,QAAA,CAAS,OAAO,KAAK,OAAA,GAAU,GAAA,IAAO,UAAU,IAAA,EAAM;AAC7D,QAAA,IAAA,GAAO,OAAA;AAAA,MACX;AAAA,IACJ;AAGA,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,GAAO,GAAA;AAAA,EAC1C;AAAA,EAEA,MAAc,yBAAA,GAEZ;AACE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA;AAAA,MACpB;AAAA,KACJ;AACA,IAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,kBAAA,IAAsB,EAAC,EAAG,GAAA;AAAA,MAC3C,CAAC,MAAM,CAAA,CAAE;AAAA,KACb;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AACjB,IAAA,gBAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAC3C,IAAA,gBAAA,CAAgB,kBAAA,CAAmB,GAAA;AAAA,MAC/B,GAAA;AAAA,MACA,IAAA,CAAK,oBAAoB,MAAM;AAAA,KACnC;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,MAAc,cACV,GAAA,EACqC;AACrC,IAAA,IAAI,QAAA,GAAW,gBAAA,CAAgB,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AACrD,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,QAAA,GAAW,IAAA,CAAK,yBAAA,EAA0B,CAAE,OAAA,CAAQ,MAAM;AACtD,QAAA,gBAAA,CAAgB,cAAA,CAAe,OAAO,GAAG,CAAA;AAAA,MAC7C,CAAC,CAAA;AACD,MAAA,gBAAA,CAAgB,cAAA,CAAe,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEA,MAAa,mBAAA,GAA6D;AACtE,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AACjB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAgB,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA;AAEvD,IAAA,IAAI,MAAA,IAAU,IAAA,KAAS,MAAA,IAAa,GAAA,GAAM,IAAA,EAAM;AAC5C,MAAA,OAAO,gBAAgB,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AAC1C,IAAA,OAAO,gBAAgB,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,MAAa,wBAAA,GAEX;AACE,IAAA,MAAM,aAAa,CACfC,OAAAA,EACA,cAEAA,OAAAA,CACK,MAAA,CAAO,CAAC,KAAA,KAAU;AACf,MAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,KAAA,CAAM,OAAA;AAC1C,MAAA,MAAM,SAAS,OAAA,GAAU,MAAA,CAAO,IAAI,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,GAAA;AACrD,MAAA,MAAM,UAAU,cAAA,GACV,MAAA,CAAO,IAAI,IAAA,CAAK,cAAc,CAAC,CAAA,GAC/B,GAAA;AACN,MAAA,OACI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IACtB,MAAA,CAAO,SAAS,OAAO,CAAA,IACvB,MAAA,IAAU,SAAA,IACV,SAAA,GAAY,OAAA;AAAA,IAEpB,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,OAAA,GAAU,EAAE,OAAA,CAAQ,OAAO,CAAA,CACpD,EAAA,CAAG,EAAE,CAAA,IAAK,IAAA;AAEnB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAA,EAAoB;AAC9C,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA;AACrC,IAAA,OAAO,MAAA,GAAS,eAAA,CAAgB,MAAM,CAAA,GAAI,IAAA;AAAA,EAC9C;AAAA,EAEA,OAAc,gCAAgC,OAAA,EAAc;AACxD,IAAA,MAAM,MAAM,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,GAAG,CAAA;AAC3B,IAAA,IAAA,CAAK,cAAA,CAAe,OAAO,GAAG,CAAA;AAC9B,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,GAAG,CAAA;AAAA,EACtC;AAAA,EAEA,MAAa,uBAAA,GAAuD;AAchE,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,EAAe;AAC9C,IAAA,MAAM,aAAa,WAAA,CAAY,OAAA;AAE/B,IAAA,MAAM,sBAAA,GACF,UAAA,EAAY,cAAA,EAAgB,YAAA,EAAc,yBAAA,EACpC,kBAAA;AACV,IAAA,MAAM,YAAA,GAAe,YAAY,cAAA,EAAgB,YAAA;AAEjD,IAAA,IAAI,MAAM,OAAA,CAAQ,YAAY,CAAA,IAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AACxD,MAAA,IAAI,YAAA,GAAmC,MAAA;AACvC,MAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAC9B,QAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAC/C,QAAA,IAAI,MAAA,EAAQ,2BAA2B,kBAAA,EAAoB;AACvD,UAAA,YAAA,GACI,OAAO,yBAAA,CAA0B,kBAAA;AAAA,QACzC;AAAA,MACJ;AACA,MAAA,OAAO,YAAA,IAAgB,sBAAA;AAAA,IAC3B,OAAO,OAAO,sBAAA;AAAA,EAClB;AACJ,CAAA;AAAA;AA7QI,aAAA,CANS,gBAAA,EAMM,kBAAA,kBAAmB,IAAI,GAAA,EAGpC,CAAA;AACF,aAAA,CAVS,gBAAA,EAUM,aAAA,kBAAc,IAAI,GAAA,EAA0C,CAAA;AAAA;AAE3E,aAAA,CAZS,gBAAA,EAYM,qBAAA,kBAAsB,IAAI,GAAA,EAGvC,CAAA;AACF,aAAA,CAhBS,gBAAA,EAgBM,gBAAA,kBAAiB,IAAI,GAAA,EAGlC,CAAA;AAAA;AAEF,aAAA,CArBS,gBAAA,EAqBM,oBAAA,kBAAqB,IAAI,GAAA,EAAoB,CAAA;AArBzD,IAAM,eAAA,GAAN;ACFA,IAAM,0BAAN,MAA8B;AAAA,EAKjC,WAAA,CACI,OAAA,EACA,MAAA,EACA,OAAA,EACA,aACA,mBAAA,EACF;AAVF,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAQ,qBAAA,CAAA;AASJ,IAAA,IAAA,CAAK,mBAAA,GAAsB,mBAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,OAAA,IAAW,qCAAqC,CAAA;AACpE,IAAA,IAAA,CAAK,SAASD,6BAAAA,CAAoB;AAAA,MAC9B,SAAS,OAAA,CAAQ,IAAA;AAAA,MACjB,KAAA,EAAO,OAAO,GAAA,EAAkB,OAAA,GAAuB,EAAC,KAAM;AAC1D,QAAA,IAAI,KAAK,mBAAA,EAAqB;AAC1B,UAAA,WAAA,GAAc,OAAA,GACR,MAAM,IAAA,CAAK,mBAAA,CAAoB,qBAAoB,GACnD,MAAM,IAAA,CAAK,mBAAA,CAAoB,kBAAA,EAAmB;AAAA,QAC5D;AACA,QAAA,OAAO,MAAM,GAAA,EAAK;AAAA,UACd,GAAG,OAAA;AAAA,UACH,OAAA,EAAS;AAAA,YACL,GAAI,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,YACxB,GAAI,cACE,EAAE,aAAA,EAAe,UAAU,WAAW,CAAA,CAAA,KACtC,EAAC;AAAA,YACP,cAAA,EAAgB;AAAA;AACpB,SACH,CAAA;AAAA,MACL;AAAA,KACH,CAAA;AAAA,EACL;AAAA,EAEA,MAAa,IAAA,CACT,IAAA,EACA,IAAA,EACA,MAAA,EAI2B;AAE3B,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,WAAA,EAAa,MAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,WAAA,EAAa,IAAA,EAAM,UAAU,IAAA,EAAK,EAAG,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,GAAA,CACT,IAAA,EACA,MAAA,EAI0B;AAE1B,IAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAO;AAEzB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACR,EAAE,IAAA,EAAY,MAAA,EAAgB,QAAA,EAAU,IAAA,EAAK;AAAA,MAC7C,OAAO,IAAI,CAAA;AAAA,KACf;AACA,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.cjs","sourcesContent":["// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\n\nexport type ScanTypes = components['schemas']\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\ntype 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\ntype 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 class ScanClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n\n constructor(baseUrl: string, logger: Logger, token?: string) {\n this.logger = logger\n this.logger.debug({ baseUrl, token }, 'TokenStandardClient initialized')\n this.client = createClient<paths>({\n baseUrl,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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 public async getAmuletSynchronizerId(): Promise<string | undefined> {\n const dsoInfo = await this.get('/v0/dso')\n\n const payloadObj = JSON.parse(\n JSON.stringify(dsoInfo.amulet_rules.contract.payload)\n )\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues as []\n\n if (futureValues.length > 0) {\n let updatedValue = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan-proxy'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport type ScanProxyTypes = components['schemas']\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\ntype 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\ntype 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 class ScanProxyClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private readonly accessTokenProvider: AccessTokenProvider | undefined\n private readonly baseUrlHref: string\n // shared caches for all instances of ScanProxyClient\n private static amuletRulesCache = new Map<\n string,\n ScanProxyTypes['Contract']\n >()\n private static roundsCache = new Map<string, ScanProxyTypes['Contract'][]>()\n // one in-flight fetch per baseUrl for rules/rounds\n private static amuletRulesInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract']>\n >()\n private static roundsInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract'][]>\n >()\n // time after surpassing which mining rounds should be refreshed\n private static roundsNextChangeAt = new Map<string, number>()\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.baseUrlHref = baseUrl.href\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ScanProxyClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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 private async fetchAmuletRulesOnce(): Promise<ScanProxyTypes['Contract']> {\n const resp = await this.get('/v0/scan-proxy/amulet-rules')\n const contract = resp?.amulet_rules?.contract\n if (!contract?.contract_id || !contract?.template_id) {\n throw new Error('Malformed AmuletRules response')\n }\n ScanProxyClient.amuletRulesCache.set(this.baseUrlHref, contract)\n return contract\n }\n\n public async getAmuletRules(): Promise<ScanProxyTypes['Contract']> {\n const key = this.baseUrlHref\n\n const cached = ScanProxyClient.amuletRulesCache.get(key)\n // clone to prevent external mutation of cache by object reference\n if (cached) return structuredClone(cached)\n\n let inflight = ScanProxyClient.amuletRulesInflight.get(key)\n if (!inflight) {\n inflight = this.fetchAmuletRulesOnce().finally(() => {\n ScanProxyClient.amuletRulesInflight.delete(key)\n })\n ScanProxyClient.amuletRulesInflight.set(key, inflight)\n }\n\n const contract = await inflight\n return structuredClone(contract)\n }\n\n public static invalidateAmuletRulesCache(baseUrl: URL) {\n const key = baseUrl.href\n this.amuletRulesCache.delete(key)\n this.amuletRulesInflight.delete(key)\n }\n\n private computeNextChangeAt(rounds: ScanProxyTypes['Contract'][]): number {\n const now = Date.now()\n let next = Number.POSITIVE_INFINITY\n\n for (const round of rounds) {\n const { opensAt, targetClosesAt } = round.payload ?? {}\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n\n if (Number.isFinite(openMs) && openMs > now && openMs < next) {\n next = openMs\n }\n if (Number.isFinite(closeMs) && closeMs > now && closeMs < next) {\n next = closeMs\n }\n }\n\n // If we couldn't parse anything sensible, force an immediate refresh.\n return Number.isFinite(next) ? next : now\n }\n\n private async fetchOpenMiningRoundsOnce(): Promise<\n ScanProxyTypes['Contract'][]\n > {\n const resp = await this.get(\n '/v0/scan-proxy/open-and-issuing-mining-rounds'\n )\n const rounds = (resp.open_mining_rounds ?? []).map(\n (x) => x.contract\n ) as ScanProxyTypes['Contract'][]\n\n const key = this.baseUrlHref\n ScanProxyClient.roundsCache.set(key, rounds)\n ScanProxyClient.roundsNextChangeAt.set(\n key,\n this.computeNextChangeAt(rounds)\n )\n return rounds\n }\n\n private async refreshRounds(\n key: string\n ): Promise<ScanProxyTypes['Contract'][]> {\n let inflight = ScanProxyClient.roundsInflight.get(key)\n if (!inflight) {\n inflight = this.fetchOpenMiningRoundsOnce().finally(() => {\n ScanProxyClient.roundsInflight.delete(key)\n })\n ScanProxyClient.roundsInflight.set(key, inflight)\n }\n return inflight\n }\n\n public async getOpenMiningRounds(): Promise<ScanProxyTypes['Contract'][]> {\n const key = this.baseUrlHref\n const now = Date.now()\n const cached = ScanProxyClient.roundsCache.get(key)\n const next = ScanProxyClient.roundsNextChangeAt.get(key)\n\n if (cached && next !== undefined && now < next) {\n return structuredClone(cached)\n }\n const fresh = await this.refreshRounds(key)\n return structuredClone(fresh)\n }\n\n public async getActiveOpenMiningRound(): Promise<\n ScanProxyTypes['Contract'] | null\n > {\n const pickActive = (\n rounds: ScanProxyTypes['Contract'][],\n timestamp: number\n ) =>\n rounds\n .filter((round) => {\n const { opensAt, targetClosesAt } = round.payload\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n return (\n Number.isFinite(openMs) &&\n Number.isFinite(closeMs) &&\n openMs <= timestamp &&\n timestamp < closeMs\n )\n })\n .sort((a, b) => a.payload.opensAt - b.payload.opensAt)\n .at(-1) ?? null\n\n const now = Date.now()\n const rounds = await this.getOpenMiningRounds()\n const active = pickActive(rounds, now)\n return active ? structuredClone(active) : null\n }\n\n public static invalidateOpenMiningRoundsCache(baseUrl: URL) {\n const key = baseUrl.href\n this.roundsCache.delete(key)\n this.roundsInflight.delete(key)\n this.roundsNextChangeAt.delete(key)\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n type FutureValue = {\n decentralizedSynchronizer?: {\n activeSynchronizer?: string\n }\n }\n\n type Payload = {\n configSchedule?: {\n initialValue?: FutureValue\n futureValues?: FutureValue[]\n }\n }\n\n const amuletRules = await this.getAmuletRules()\n const payloadObj = amuletRules.payload as Payload\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues\n\n if (Array.isArray(futureValues) && futureValues.length > 0) {\n let updatedValue: string | undefined = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { paths } from './generated-clients/validator-internal'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\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\ntype 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\ntype 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 class ValidatorInternalClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private accessTokenProvider: AccessTokenProvider | undefined\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ValidatorInternalClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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"]}
package/dist/index.js CHANGED
@@ -65,14 +65,16 @@ var ScanClient = class {
65
65
  } else return initActiveSynchronizer;
66
66
  }
67
67
  };
68
- var ScanProxyClient = class {
68
+ var _ScanProxyClient = class _ScanProxyClient {
69
69
  constructor(baseUrl, logger, isAdmin, accessToken, accessTokenProvider) {
70
70
  __publicField(this, "client");
71
71
  __publicField(this, "logger");
72
72
  __publicField(this, "accessTokenProvider");
73
+ __publicField(this, "baseUrlHref");
74
+ this.baseUrlHref = baseUrl.href;
73
75
  this.accessTokenProvider = accessTokenProvider;
74
76
  this.logger = logger;
75
- this.logger.debug({ baseUrl }, "TokenStandardClient initialized");
77
+ this.logger.debug({ baseUrl }, "ScanProxyClient initialized");
76
78
  this.client = createClient({
77
79
  baseUrl: baseUrl.href,
78
80
  fetch: async (url, options = {}) => {
@@ -113,17 +115,103 @@ var ScanProxyClient = class {
113
115
  return Promise.resolve(response.data);
114
116
  }
115
117
  }
118
+ async fetchAmuletRulesOnce() {
119
+ const resp = await this.get("/v0/scan-proxy/amulet-rules");
120
+ const contract = resp?.amulet_rules?.contract;
121
+ if (!contract?.contract_id || !contract?.template_id) {
122
+ throw new Error("Malformed AmuletRules response");
123
+ }
124
+ _ScanProxyClient.amuletRulesCache.set(this.baseUrlHref, contract);
125
+ return contract;
126
+ }
116
127
  async getAmuletRules() {
117
- const amuletRules = await this.get("/v0/scan-proxy/amulet-rules");
118
- return amuletRules.amulet_rules.contract;
128
+ const key = this.baseUrlHref;
129
+ const cached = _ScanProxyClient.amuletRulesCache.get(key);
130
+ if (cached) return structuredClone(cached);
131
+ let inflight = _ScanProxyClient.amuletRulesInflight.get(key);
132
+ if (!inflight) {
133
+ inflight = this.fetchAmuletRulesOnce().finally(() => {
134
+ _ScanProxyClient.amuletRulesInflight.delete(key);
135
+ });
136
+ _ScanProxyClient.amuletRulesInflight.set(key, inflight);
137
+ }
138
+ const contract = await inflight;
139
+ return structuredClone(contract);
119
140
  }
120
- async getOpenMiningRounds() {
121
- const openAndIssuingMiningRounds = await this.get(
141
+ static invalidateAmuletRulesCache(baseUrl) {
142
+ const key = baseUrl.href;
143
+ this.amuletRulesCache.delete(key);
144
+ this.amuletRulesInflight.delete(key);
145
+ }
146
+ computeNextChangeAt(rounds) {
147
+ const now = Date.now();
148
+ let next = Number.POSITIVE_INFINITY;
149
+ for (const round of rounds) {
150
+ const { opensAt, targetClosesAt } = round.payload ?? {};
151
+ const openMs = opensAt ? Number(new Date(opensAt)) : NaN;
152
+ const closeMs = targetClosesAt ? Number(new Date(targetClosesAt)) : NaN;
153
+ if (Number.isFinite(openMs) && openMs > now && openMs < next) {
154
+ next = openMs;
155
+ }
156
+ if (Number.isFinite(closeMs) && closeMs > now && closeMs < next) {
157
+ next = closeMs;
158
+ }
159
+ }
160
+ return Number.isFinite(next) ? next : now;
161
+ }
162
+ async fetchOpenMiningRoundsOnce() {
163
+ const resp = await this.get(
122
164
  "/v0/scan-proxy/open-and-issuing-mining-rounds"
123
165
  );
124
- return openAndIssuingMiningRounds.open_mining_rounds.map(
125
- (openMiningRound) => openMiningRound.contract
166
+ const rounds = (resp.open_mining_rounds ?? []).map(
167
+ (x) => x.contract
126
168
  );
169
+ const key = this.baseUrlHref;
170
+ _ScanProxyClient.roundsCache.set(key, rounds);
171
+ _ScanProxyClient.roundsNextChangeAt.set(
172
+ key,
173
+ this.computeNextChangeAt(rounds)
174
+ );
175
+ return rounds;
176
+ }
177
+ async refreshRounds(key) {
178
+ let inflight = _ScanProxyClient.roundsInflight.get(key);
179
+ if (!inflight) {
180
+ inflight = this.fetchOpenMiningRoundsOnce().finally(() => {
181
+ _ScanProxyClient.roundsInflight.delete(key);
182
+ });
183
+ _ScanProxyClient.roundsInflight.set(key, inflight);
184
+ }
185
+ return inflight;
186
+ }
187
+ async getOpenMiningRounds() {
188
+ const key = this.baseUrlHref;
189
+ const now = Date.now();
190
+ const cached = _ScanProxyClient.roundsCache.get(key);
191
+ const next = _ScanProxyClient.roundsNextChangeAt.get(key);
192
+ if (cached && next !== void 0 && now < next) {
193
+ return structuredClone(cached);
194
+ }
195
+ const fresh = await this.refreshRounds(key);
196
+ return structuredClone(fresh);
197
+ }
198
+ async getActiveOpenMiningRound() {
199
+ const pickActive = (rounds2, timestamp) => rounds2.filter((round) => {
200
+ const { opensAt, targetClosesAt } = round.payload;
201
+ const openMs = opensAt ? Number(new Date(opensAt)) : NaN;
202
+ const closeMs = targetClosesAt ? Number(new Date(targetClosesAt)) : NaN;
203
+ return Number.isFinite(openMs) && Number.isFinite(closeMs) && openMs <= timestamp && timestamp < closeMs;
204
+ }).sort((a, b) => a.payload.opensAt - b.payload.opensAt).at(-1) ?? null;
205
+ const now = Date.now();
206
+ const rounds = await this.getOpenMiningRounds();
207
+ const active = pickActive(rounds, now);
208
+ return active ? structuredClone(active) : null;
209
+ }
210
+ static invalidateOpenMiningRoundsCache(baseUrl) {
211
+ const key = baseUrl.href;
212
+ this.roundsCache.delete(key);
213
+ this.roundsInflight.delete(key);
214
+ this.roundsNextChangeAt.delete(key);
127
215
  }
128
216
  async getAmuletSynchronizerId() {
129
217
  const amuletRules = await this.getAmuletRules();
@@ -142,6 +230,15 @@ var ScanProxyClient = class {
142
230
  } else return initActiveSynchronizer;
143
231
  }
144
232
  };
233
+ // shared caches for all instances of ScanProxyClient
234
+ __publicField(_ScanProxyClient, "amuletRulesCache", /* @__PURE__ */ new Map());
235
+ __publicField(_ScanProxyClient, "roundsCache", /* @__PURE__ */ new Map());
236
+ // one in-flight fetch per baseUrl for rules/rounds
237
+ __publicField(_ScanProxyClient, "amuletRulesInflight", /* @__PURE__ */ new Map());
238
+ __publicField(_ScanProxyClient, "roundsInflight", /* @__PURE__ */ new Map());
239
+ // time after surpassing which mining rounds should be refreshed
240
+ __publicField(_ScanProxyClient, "roundsNextChangeAt", /* @__PURE__ */ new Map());
241
+ var ScanProxyClient = _ScanProxyClient;
145
242
  var ValidatorInternalClient = class {
146
243
  constructor(baseUrl, logger, isAdmin, accessToken, accessTokenProvider) {
147
244
  __publicField(this, "client");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/scan-client.ts","../src/scan-proxy-client.ts","../src/validator-internal-client.ts"],"names":["createClient"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\n\nexport type ScanTypes = components['schemas']\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\ntype 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\ntype 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 class ScanClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n\n constructor(baseUrl: string, logger: Logger, token?: string) {\n this.logger = logger\n this.logger.debug({ baseUrl, token }, 'TokenStandardClient initialized')\n this.client = createClient<paths>({\n baseUrl,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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 public async getAmuletSynchronizerId(): Promise<string | undefined> {\n const dsoInfo = await this.get('/v0/dso')\n\n const payloadObj = JSON.parse(\n JSON.stringify(dsoInfo.amulet_rules.contract.payload)\n )\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues as []\n\n if (futureValues.length > 0) {\n let updatedValue = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan-proxy'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport type ScanProxyTypes = components['schemas']\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\ntype 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\ntype 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 class ScanProxyClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private accessTokenProvider: AccessTokenProvider | undefined\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'TokenStandardClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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 public async getAmuletRules(): Promise<ScanProxyTypes['Contract']> {\n const amuletRules = await this.get('/v0/scan-proxy/amulet-rules')\n return amuletRules.amulet_rules.contract\n }\n\n public async getOpenMiningRounds(): Promise<ScanProxyTypes['Contract'][]> {\n const openAndIssuingMiningRounds = await this.get(\n '/v0/scan-proxy/open-and-issuing-mining-rounds'\n )\n return openAndIssuingMiningRounds.open_mining_rounds.map(\n (openMiningRound) => openMiningRound.contract\n )\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n type FutureValue = {\n decentralizedSynchronizer?: {\n activeSynchronizer?: string\n }\n }\n\n type Payload = {\n configSchedule?: {\n initialValue?: FutureValue\n futureValues?: FutureValue[]\n }\n }\n\n const amuletRules = await this.getAmuletRules()\n const payloadObj = amuletRules.payload as Payload\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues\n\n if (Array.isArray(futureValues) && futureValues.length > 0) {\n let updatedValue: string | undefined = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { paths } from './generated-clients/validator-internal'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\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\ntype 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\ntype 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 class ValidatorInternalClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private accessTokenProvider: AccessTokenProvider | undefined\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ValidatorInternalClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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"]}
1
+ {"version":3,"sources":["../src/scan-client.ts","../src/scan-proxy-client.ts","../src/validator-internal-client.ts"],"names":["createClient","rounds"],"mappings":"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","file":"index.js","sourcesContent":["// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\n\nexport type ScanTypes = components['schemas']\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\ntype 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\ntype 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 class ScanClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n\n constructor(baseUrl: string, logger: Logger, token?: string) {\n this.logger = logger\n this.logger.debug({ baseUrl, token }, 'TokenStandardClient initialized')\n this.client = createClient<paths>({\n baseUrl,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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 public async getAmuletSynchronizerId(): Promise<string | undefined> {\n const dsoInfo = await this.get('/v0/dso')\n\n const payloadObj = JSON.parse(\n JSON.stringify(dsoInfo.amulet_rules.contract.payload)\n )\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues as []\n\n if (futureValues.length > 0) {\n let updatedValue = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { components, paths } from './generated-clients/scan-proxy'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\n\nexport type ScanProxyTypes = components['schemas']\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\ntype 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\ntype 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 class ScanProxyClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private readonly accessTokenProvider: AccessTokenProvider | undefined\n private readonly baseUrlHref: string\n // shared caches for all instances of ScanProxyClient\n private static amuletRulesCache = new Map<\n string,\n ScanProxyTypes['Contract']\n >()\n private static roundsCache = new Map<string, ScanProxyTypes['Contract'][]>()\n // one in-flight fetch per baseUrl for rules/rounds\n private static amuletRulesInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract']>\n >()\n private static roundsInflight = new Map<\n string,\n Promise<ScanProxyTypes['Contract'][]>\n >()\n // time after surpassing which mining rounds should be refreshed\n private static roundsNextChangeAt = new Map<string, number>()\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.baseUrlHref = baseUrl.href\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ScanProxyClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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 private async fetchAmuletRulesOnce(): Promise<ScanProxyTypes['Contract']> {\n const resp = await this.get('/v0/scan-proxy/amulet-rules')\n const contract = resp?.amulet_rules?.contract\n if (!contract?.contract_id || !contract?.template_id) {\n throw new Error('Malformed AmuletRules response')\n }\n ScanProxyClient.amuletRulesCache.set(this.baseUrlHref, contract)\n return contract\n }\n\n public async getAmuletRules(): Promise<ScanProxyTypes['Contract']> {\n const key = this.baseUrlHref\n\n const cached = ScanProxyClient.amuletRulesCache.get(key)\n // clone to prevent external mutation of cache by object reference\n if (cached) return structuredClone(cached)\n\n let inflight = ScanProxyClient.amuletRulesInflight.get(key)\n if (!inflight) {\n inflight = this.fetchAmuletRulesOnce().finally(() => {\n ScanProxyClient.amuletRulesInflight.delete(key)\n })\n ScanProxyClient.amuletRulesInflight.set(key, inflight)\n }\n\n const contract = await inflight\n return structuredClone(contract)\n }\n\n public static invalidateAmuletRulesCache(baseUrl: URL) {\n const key = baseUrl.href\n this.amuletRulesCache.delete(key)\n this.amuletRulesInflight.delete(key)\n }\n\n private computeNextChangeAt(rounds: ScanProxyTypes['Contract'][]): number {\n const now = Date.now()\n let next = Number.POSITIVE_INFINITY\n\n for (const round of rounds) {\n const { opensAt, targetClosesAt } = round.payload ?? {}\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n\n if (Number.isFinite(openMs) && openMs > now && openMs < next) {\n next = openMs\n }\n if (Number.isFinite(closeMs) && closeMs > now && closeMs < next) {\n next = closeMs\n }\n }\n\n // If we couldn't parse anything sensible, force an immediate refresh.\n return Number.isFinite(next) ? next : now\n }\n\n private async fetchOpenMiningRoundsOnce(): Promise<\n ScanProxyTypes['Contract'][]\n > {\n const resp = await this.get(\n '/v0/scan-proxy/open-and-issuing-mining-rounds'\n )\n const rounds = (resp.open_mining_rounds ?? []).map(\n (x) => x.contract\n ) as ScanProxyTypes['Contract'][]\n\n const key = this.baseUrlHref\n ScanProxyClient.roundsCache.set(key, rounds)\n ScanProxyClient.roundsNextChangeAt.set(\n key,\n this.computeNextChangeAt(rounds)\n )\n return rounds\n }\n\n private async refreshRounds(\n key: string\n ): Promise<ScanProxyTypes['Contract'][]> {\n let inflight = ScanProxyClient.roundsInflight.get(key)\n if (!inflight) {\n inflight = this.fetchOpenMiningRoundsOnce().finally(() => {\n ScanProxyClient.roundsInflight.delete(key)\n })\n ScanProxyClient.roundsInflight.set(key, inflight)\n }\n return inflight\n }\n\n public async getOpenMiningRounds(): Promise<ScanProxyTypes['Contract'][]> {\n const key = this.baseUrlHref\n const now = Date.now()\n const cached = ScanProxyClient.roundsCache.get(key)\n const next = ScanProxyClient.roundsNextChangeAt.get(key)\n\n if (cached && next !== undefined && now < next) {\n return structuredClone(cached)\n }\n const fresh = await this.refreshRounds(key)\n return structuredClone(fresh)\n }\n\n public async getActiveOpenMiningRound(): Promise<\n ScanProxyTypes['Contract'] | null\n > {\n const pickActive = (\n rounds: ScanProxyTypes['Contract'][],\n timestamp: number\n ) =>\n rounds\n .filter((round) => {\n const { opensAt, targetClosesAt } = round.payload\n const openMs = opensAt ? Number(new Date(opensAt)) : NaN\n const closeMs = targetClosesAt\n ? Number(new Date(targetClosesAt))\n : NaN\n return (\n Number.isFinite(openMs) &&\n Number.isFinite(closeMs) &&\n openMs <= timestamp &&\n timestamp < closeMs\n )\n })\n .sort((a, b) => a.payload.opensAt - b.payload.opensAt)\n .at(-1) ?? null\n\n const now = Date.now()\n const rounds = await this.getOpenMiningRounds()\n const active = pickActive(rounds, now)\n return active ? structuredClone(active) : null\n }\n\n public static invalidateOpenMiningRoundsCache(baseUrl: URL) {\n const key = baseUrl.href\n this.roundsCache.delete(key)\n this.roundsInflight.delete(key)\n this.roundsNextChangeAt.delete(key)\n }\n\n public async getAmuletSynchronizerId(): Promise<string | undefined> {\n type FutureValue = {\n decentralizedSynchronizer?: {\n activeSynchronizer?: string\n }\n }\n\n type Payload = {\n configSchedule?: {\n initialValue?: FutureValue\n futureValues?: FutureValue[]\n }\n }\n\n const amuletRules = await this.getAmuletRules()\n const payloadObj = amuletRules.payload as Payload\n\n const initActiveSynchronizer =\n payloadObj?.configSchedule?.initialValue?.decentralizedSynchronizer\n ?.activeSynchronizer\n const futureValues = payloadObj?.configSchedule?.futureValues\n\n if (Array.isArray(futureValues) && futureValues.length > 0) {\n let updatedValue: string | undefined = undefined\n for (const value of futureValues) {\n const parsed = JSON.parse(JSON.stringify(value))\n if (parsed?.decentralizedSynchronizer?.activeSynchronizer) {\n updatedValue =\n parsed.decentralizedSynchronizer.activeSynchronizer\n }\n }\n return updatedValue ?? initActiveSynchronizer\n } else return initActiveSynchronizer\n }\n}\n","// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { paths } from './generated-clients/validator-internal'\nimport createClient, { Client } from 'openapi-fetch'\nimport { Logger } from '@canton-network/core-types'\nimport { AccessTokenProvider } from '@canton-network/core-wallet-auth'\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\ntype 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\ntype 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 class ValidatorInternalClient {\n private readonly client: Client<paths>\n private readonly logger: Logger\n private accessTokenProvider: AccessTokenProvider | undefined\n\n constructor(\n baseUrl: URL,\n logger: Logger,\n isAdmin: boolean,\n accessToken?: string,\n accessTokenProvider?: AccessTokenProvider\n ) {\n this.accessTokenProvider = accessTokenProvider\n this.logger = logger\n this.logger.debug({ baseUrl }, 'ValidatorInternalClient initialized')\n this.client = createClient<paths>({\n baseUrl: baseUrl.href,\n fetch: async (url: RequestInfo, options: RequestInit = {}) => {\n if (this.accessTokenProvider) {\n accessToken = isAdmin\n ? await this.accessTokenProvider.getAdminAccessToken()\n : await this.accessTokenProvider.getUserAccessToken()\n }\n return fetch(url, {\n ...options,\n headers: {\n ...(options.headers || {}),\n ...(accessToken\n ? { Authorization: `Bearer ${accessToken}` }\n : {}),\n 'Content-Type': 'application/json',\n },\n })\n },\n })\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>\n }\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 } as any\n this.logger.debug({ requestBody: body }, `POST ${path}`)\n const resp = await this.client.POST(path, options)\n this.logger.debug({ requestBody: body, response: resp }, `POST ${path}`)\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- (cant align this with openapi-fetch generics :shrug:)\n const options = { params } as any\n\n const resp = await this.client.GET(path, options)\n this.logger.debug(\n { path: path, params: params, response: resp },\n `GET ${path}`\n )\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"]}
@@ -46,7 +46,13 @@ export type GetResponse<Path extends GetEndpoint> = paths[Path] extends {
46
46
  export declare class ScanProxyClient {
47
47
  private readonly client;
48
48
  private readonly logger;
49
- private accessTokenProvider;
49
+ private readonly accessTokenProvider;
50
+ private readonly baseUrlHref;
51
+ private static amuletRulesCache;
52
+ private static roundsCache;
53
+ private static amuletRulesInflight;
54
+ private static roundsInflight;
55
+ private static roundsNextChangeAt;
50
56
  constructor(baseUrl: URL, logger: Logger, isAdmin: boolean, accessToken?: string, accessTokenProvider?: AccessTokenProvider);
51
57
  post<Path extends PostEndpoint>(path: Path, body: PostRequest<Path>, params?: {
52
58
  path?: Record<string, string>;
@@ -57,8 +63,15 @@ export declare class ScanProxyClient {
57
63
  query?: Record<string, string>;
58
64
  }): Promise<GetResponse<Path>>;
59
65
  private valueOrError;
66
+ private fetchAmuletRulesOnce;
60
67
  getAmuletRules(): Promise<ScanProxyTypes['Contract']>;
68
+ static invalidateAmuletRulesCache(baseUrl: URL): void;
69
+ private computeNextChangeAt;
70
+ private fetchOpenMiningRoundsOnce;
71
+ private refreshRounds;
61
72
  getOpenMiningRounds(): Promise<ScanProxyTypes['Contract'][]>;
73
+ getActiveOpenMiningRound(): Promise<ScanProxyTypes['Contract'] | null>;
74
+ static invalidateOpenMiningRoundsCache(baseUrl: URL): void;
62
75
  getAmuletSynchronizerId(): Promise<string | undefined>;
63
76
  }
64
77
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"scan-proxy-client.d.ts","sourceRoot":"","sources":["../src/scan-proxy-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scan-proxy-client.d.ts","sourceRoot":"","sources":["../src/scan-proxy-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canton-network/core-splice-client",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "type": "module",
5
5
  "description": "Typescript Client for the multiple Canton Network APIs",
6
6
  "repository": "github:hyperledger-labs/splice-wallet-kernel",