@milaboratories/pl-middle-layer 1.59.9 → 1.59.11
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/block_registry/registry.cjs +8 -5
- package/dist/block_registry/registry.cjs.map +1 -1
- package/dist/block_registry/registry.d.ts +3 -1
- package/dist/block_registry/registry.d.ts.map +1 -1
- package/dist/block_registry/registry.js +8 -5
- package/dist/block_registry/registry.js.map +1 -1
- package/package.json +10 -10
- package/src/block_registry/registry.ts +13 -8
|
@@ -47,13 +47,16 @@ var BlockPackRegistry = class {
|
|
|
47
47
|
this.registries = registries;
|
|
48
48
|
this.http = http;
|
|
49
49
|
}
|
|
50
|
-
async getPackagesForRoot(regEntry) {
|
|
50
|
+
async getPackagesForRoot(regEntry, options) {
|
|
51
51
|
const result = [];
|
|
52
52
|
const regSpec = regEntry.spec;
|
|
53
53
|
switch (regSpec.type) {
|
|
54
54
|
case "remote-v1": {
|
|
55
55
|
const httpOptions = this.http !== void 0 ? { dispatcher: this.http } : {};
|
|
56
|
-
const overview = await (await (0, undici.request)(`${regSpec.url}/${_platforma_sdk_block_tools.RegistryV1.GlobalOverviewPath}`,
|
|
56
|
+
const overview = await (await (0, undici.request)(`${regSpec.url}/${_platforma_sdk_block_tools.RegistryV1.GlobalOverviewPath}`, {
|
|
57
|
+
...httpOptions,
|
|
58
|
+
signal: options?.signal
|
|
59
|
+
})).body.json();
|
|
57
60
|
for (const overviewEntry of overview) {
|
|
58
61
|
const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;
|
|
59
62
|
const id = {
|
|
@@ -92,7 +95,7 @@ var BlockPackRegistry = class {
|
|
|
92
95
|
}
|
|
93
96
|
return result;
|
|
94
97
|
}
|
|
95
|
-
case "remote-v2": return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks()).map((e) => ({
|
|
98
|
+
case "remote-v2": return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks({ signal: options?.signal })).map((e) => ({
|
|
96
99
|
...e,
|
|
97
100
|
registryId: regEntry.id
|
|
98
101
|
}));
|
|
@@ -170,7 +173,7 @@ var BlockPackRegistry = class {
|
|
|
170
173
|
default: return (0, _milaboratories_ts_helpers.assertNever)(regSpec);
|
|
171
174
|
}
|
|
172
175
|
}
|
|
173
|
-
async listBlockPacks() {
|
|
176
|
+
async listBlockPacks(options) {
|
|
174
177
|
const blockPacks = [];
|
|
175
178
|
const registries = [];
|
|
176
179
|
for (const regSpecs of this.registries) {
|
|
@@ -178,7 +181,7 @@ var BlockPackRegistry = class {
|
|
|
178
181
|
...regSpecs,
|
|
179
182
|
status: "online"
|
|
180
183
|
});
|
|
181
|
-
blockPacks.push(...await this.getPackagesForRoot(regSpecs));
|
|
184
|
+
blockPacks.push(...await this.getPackagesForRoot(regSpecs, options));
|
|
182
185
|
}
|
|
183
186
|
return {
|
|
184
187
|
registries,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.cjs","names":["fs","LegacyDevBlockPackFiles","path","RegistryV1","AnyChannel","StableChannel","YAML","BlockPackMetaEmbedAbsoluteBytes"],"sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport type { BlockPackDescriptionAbsolute } from \"@platforma-sdk/block-tools\";\nimport { BlockPackMetaEmbedAbsoluteBytes, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport { LegacyDevBlockPackFiles } from \"../dev_env\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { AnyChannel, StableChannel } from \"@milaboratories/pl-model-middle-layer\";\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, \"utf8\");\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case \"remote-v1\": {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (latestMeta[\"title\"] as string | undefined) ?? \"No title\",\n description: (latestMeta[\"description\"] as string | undefined) ?? \"No Description\",\n organization: {\n name: organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"from-registry-v1\",\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case \"remote-v2\":\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks()).map((e) => ({\n ...e,\n registryId: regEntry.id,\n }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case \"local-dev\":\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: \"DEV\",\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta[\"title\"] as string) ?? \"No title\",\n description: (config.meta[\"description\"] as string) ?? \"No Description\",\n organization: {\n name: config.organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"dev-v2\",\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of [\"block\", \"meta\"]) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: \"dev-v2\",\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: \"online\" });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== \"remote-v2\")\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.cjs","names":["fs","LegacyDevBlockPackFiles","path","RegistryV1","AnyChannel","StableChannel","YAML","BlockPackMetaEmbedAbsoluteBytes"],"sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport type { BlockPackDescriptionAbsolute } from \"@platforma-sdk/block-tools\";\nimport { BlockPackMetaEmbedAbsoluteBytes, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport { LegacyDevBlockPackFiles } from \"../dev_env\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { AnyChannel, StableChannel } from \"@milaboratories/pl-model-middle-layer\";\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, \"utf8\");\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(\n regEntry: RegistryEntry,\n options?: { signal?: AbortSignal },\n ): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case \"remote-v1\": {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(`${regSpec.url}/${RegistryV1.GlobalOverviewPath}`, {\n ...httpOptions,\n signal: options?.signal,\n });\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (latestMeta[\"title\"] as string | undefined) ?? \"No title\",\n description: (latestMeta[\"description\"] as string | undefined) ?? \"No Description\",\n organization: {\n name: organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"from-registry-v1\",\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case \"remote-v2\":\n return (\n await this.v2Provider.getRegistry(regSpec.url).listBlockPacks({ signal: options?.signal })\n ).map((e) => ({\n ...e,\n registryId: regEntry.id,\n }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case \"local-dev\":\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: \"DEV\",\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta[\"title\"] as string) ?? \"No title\",\n description: (config.meta[\"description\"] as string) ?? \"No Description\",\n organization: {\n name: config.organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"dev-v2\",\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of [\"block\", \"meta\"]) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: \"dev-v2\",\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(options?: { signal?: AbortSignal }): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: \"online\" });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs, options)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== \"remote-v2\")\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"mappings":"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"}
|
|
@@ -12,7 +12,9 @@ declare class BlockPackRegistry {
|
|
|
12
12
|
private readonly http?;
|
|
13
13
|
constructor(v2Provider: V2RegistryProvider, registries: RegistryEntry[], http?: Dispatcher | undefined);
|
|
14
14
|
private getPackagesForRoot;
|
|
15
|
-
listBlockPacks(
|
|
15
|
+
listBlockPacks(options?: {
|
|
16
|
+
signal?: AbortSignal;
|
|
17
|
+
}): Promise<BlockPackListing>;
|
|
16
18
|
getOverview(registryId: string, blockId: BlockPackId, channel: string): Promise<SingleBlockPackOverview>;
|
|
17
19
|
}
|
|
18
20
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/block_registry/registry.ts"],"mappings":";;;;;;iBA2CsB,mBAAA,CAAoB,OAAA,WAAkB,OAAA;AAAA,iBAWtC,mBAAA,CACpB,WAAA,EAAa,4BAAA,GACZ,OAAA;AAAA,cAQU,iBAAA;EAAA,iBAEQ,UAAA;EAAA,iBACA,UAAA;EAAA,iBACA,IAAA;cAFA,UAAA,EAAY,kBAAA,EACZ,UAAA,EAAY,aAAA,IACZ,IAAA,GAAO,UAAA;EAAA,QAGZ,kBAAA;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/block_registry/registry.ts"],"mappings":";;;;;;iBA2CsB,mBAAA,CAAoB,OAAA,WAAkB,OAAA;AAAA,iBAWtC,mBAAA,CACpB,WAAA,EAAa,4BAAA,GACZ,OAAA;AAAA,cAQU,iBAAA;EAAA,iBAEQ,UAAA;EAAA,iBACA,UAAA;EAAA,iBACA,IAAA;cAFA,UAAA,EAAY,kBAAA,EACZ,UAAA,EAAY,aAAA,IACZ,IAAA,GAAO,UAAA;EAAA,QAGZ,kBAAA;EAyKD,cAAA,CAAe,OAAA;IAAY,MAAA,GAAS,WAAA;EAAA,IAAgB,OAAA,CAAQ,gBAAA;EAU5D,WAAA,CACX,UAAA,UACA,OAAA,EAAS,WAAA,EACT,OAAA,WACC,OAAA,CAAQ,uBAAA;AAAA"}
|
|
@@ -43,13 +43,16 @@ var BlockPackRegistry = class {
|
|
|
43
43
|
this.registries = registries;
|
|
44
44
|
this.http = http;
|
|
45
45
|
}
|
|
46
|
-
async getPackagesForRoot(regEntry) {
|
|
46
|
+
async getPackagesForRoot(regEntry, options) {
|
|
47
47
|
const result = [];
|
|
48
48
|
const regSpec = regEntry.spec;
|
|
49
49
|
switch (regSpec.type) {
|
|
50
50
|
case "remote-v1": {
|
|
51
51
|
const httpOptions = this.http !== void 0 ? { dispatcher: this.http } : {};
|
|
52
|
-
const overview = await (await request(`${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,
|
|
52
|
+
const overview = await (await request(`${regSpec.url}/${RegistryV1.GlobalOverviewPath}`, {
|
|
53
|
+
...httpOptions,
|
|
54
|
+
signal: options?.signal
|
|
55
|
+
})).body.json();
|
|
53
56
|
for (const overviewEntry of overview) {
|
|
54
57
|
const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;
|
|
55
58
|
const id = {
|
|
@@ -88,7 +91,7 @@ var BlockPackRegistry = class {
|
|
|
88
91
|
}
|
|
89
92
|
return result;
|
|
90
93
|
}
|
|
91
|
-
case "remote-v2": return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks()).map((e) => ({
|
|
94
|
+
case "remote-v2": return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks({ signal: options?.signal })).map((e) => ({
|
|
92
95
|
...e,
|
|
93
96
|
registryId: regEntry.id
|
|
94
97
|
}));
|
|
@@ -166,7 +169,7 @@ var BlockPackRegistry = class {
|
|
|
166
169
|
default: return assertNever(regSpec);
|
|
167
170
|
}
|
|
168
171
|
}
|
|
169
|
-
async listBlockPacks() {
|
|
172
|
+
async listBlockPacks(options) {
|
|
170
173
|
const blockPacks = [];
|
|
171
174
|
const registries = [];
|
|
172
175
|
for (const regSpecs of this.registries) {
|
|
@@ -174,7 +177,7 @@ var BlockPackRegistry = class {
|
|
|
174
177
|
...regSpecs,
|
|
175
178
|
status: "online"
|
|
176
179
|
});
|
|
177
|
-
blockPacks.push(...await this.getPackagesForRoot(regSpecs));
|
|
180
|
+
blockPacks.push(...await this.getPackagesForRoot(regSpecs, options));
|
|
178
181
|
}
|
|
179
182
|
return {
|
|
180
183
|
registries,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","names":[],"sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport type { BlockPackDescriptionAbsolute } from \"@platforma-sdk/block-tools\";\nimport { BlockPackMetaEmbedAbsoluteBytes, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport { LegacyDevBlockPackFiles } from \"../dev_env\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { AnyChannel, StableChannel } from \"@milaboratories/pl-model-middle-layer\";\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, \"utf8\");\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case \"remote-v1\": {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (latestMeta[\"title\"] as string | undefined) ?? \"No title\",\n description: (latestMeta[\"description\"] as string | undefined) ?? \"No Description\",\n organization: {\n name: organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"from-registry-v1\",\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case \"remote-v2\":\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks()).map((e) => ({\n ...e,\n registryId: regEntry.id,\n }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case \"local-dev\":\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: \"DEV\",\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta[\"title\"] as string) ?? \"No title\",\n description: (config.meta[\"description\"] as string) ?? \"No Description\",\n organization: {\n name: config.organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"dev-v2\",\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of [\"block\", \"meta\"]) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: \"dev-v2\",\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: \"online\" });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== \"remote-v2\")\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.js","names":[],"sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from \"undici\";\nimport { request } from \"undici\";\nimport type { BlockPackDescriptionAbsolute } from \"@platforma-sdk/block-tools\";\nimport { BlockPackMetaEmbedAbsoluteBytes, RegistryV1 } from \"@platforma-sdk/block-tools\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { assertNever } from \"@milaboratories/ts-helpers\";\nimport { LegacyDevBlockPackFiles } from \"../dev_env\";\nimport { tryLoadPackDescription } from \"@platforma-sdk/block-tools\";\nimport type { V2RegistryProvider } from \"./registry-v2-provider\";\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { AnyChannel, StableChannel } from \"@milaboratories/pl-model-middle-layer\";\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, \"utf8\");\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(\n regEntry: RegistryEntry,\n options?: { signal?: AbortSignal },\n ): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case \"remote-v1\": {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(`${regSpec.url}/${RegistryV1.GlobalOverviewPath}`, {\n ...httpOptions,\n signal: options?.signal,\n });\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (latestMeta[\"title\"] as string | undefined) ?? \"No title\",\n description: (latestMeta[\"description\"] as string | undefined) ?? \"No Description\",\n organization: {\n name: organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"from-registry-v1\",\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case \"remote-v2\":\n return (\n await this.v2Provider.getRegistry(regSpec.url).listBlockPacks({ signal: options?.signal })\n ).map((e) => ({\n ...e,\n registryId: regEntry.id,\n }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case \"local-dev\":\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: \"DEV\",\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta[\"title\"] as string) ?? \"No title\",\n description: (config.meta[\"description\"] as string) ?? \"No Description\",\n organization: {\n name: config.organization,\n url: \"https://unknown.com\",\n },\n },\n spec: {\n type: \"dev-v2\",\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of [\"block\", \"meta\"]) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: \"dev-v2\",\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(options?: { signal?: AbortSignal }): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: \"online\" });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs, options)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== \"remote-v2\")\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milaboratories/pl-middle-layer",
|
|
3
|
-
"version": "1.59.
|
|
3
|
+
"version": "1.59.11",
|
|
4
4
|
"description": "Pl Middle Layer",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -30,23 +30,23 @@
|
|
|
30
30
|
"utility-types": "^3.11.0",
|
|
31
31
|
"yaml": "^2.8.0",
|
|
32
32
|
"zod": "~3.25.76",
|
|
33
|
-
"@milaboratories/computable": "2.9.4",
|
|
34
33
|
"@milaboratories/helpers": "1.14.2",
|
|
35
34
|
"@milaboratories/pf-driver": "1.4.10",
|
|
36
|
-
"@milaboratories/
|
|
35
|
+
"@milaboratories/computable": "2.9.4",
|
|
37
36
|
"@milaboratories/pf-spec-driver": "1.3.15",
|
|
38
37
|
"@milaboratories/pl-client": "3.4.1",
|
|
38
|
+
"@milaboratories/pl-deployments": "2.17.16",
|
|
39
39
|
"@milaboratories/pl-drivers": "1.14.5",
|
|
40
|
-
"@milaboratories/pl-model-backend": "1.2.27",
|
|
41
40
|
"@milaboratories/pl-errors": "1.4.5",
|
|
42
41
|
"@milaboratories/pl-http": "1.2.4",
|
|
43
|
-
"@milaboratories/pl-model-common": "1.41.2",
|
|
44
42
|
"@milaboratories/pl-model-middle-layer": "1.19.3",
|
|
45
|
-
"@milaboratories/
|
|
43
|
+
"@milaboratories/pl-model-backend": "1.2.27",
|
|
46
44
|
"@milaboratories/pl-tree": "1.10.5",
|
|
45
|
+
"@milaboratories/pl-model-common": "1.41.2",
|
|
46
|
+
"@milaboratories/ts-helpers": "1.8.2",
|
|
47
47
|
"@milaboratories/resolve-helper": "1.1.3",
|
|
48
|
-
"@platforma-sdk/block-tools": "2.7.
|
|
49
|
-
"@platforma-sdk/model": "1.75.
|
|
48
|
+
"@platforma-sdk/block-tools": "2.7.24",
|
|
49
|
+
"@platforma-sdk/model": "1.75.10",
|
|
50
50
|
"@platforma-sdk/workflow-tengo": "5.21.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
@@ -56,9 +56,9 @@
|
|
|
56
56
|
"semver": "^7.7.2",
|
|
57
57
|
"typescript": "~5.9.3",
|
|
58
58
|
"vitest": "^4.1.3",
|
|
59
|
-
"@milaboratories/
|
|
59
|
+
"@milaboratories/ts-configs": "1.2.3",
|
|
60
60
|
"@milaboratories/ts-builder": "1.4.0",
|
|
61
|
-
"@milaboratories/
|
|
61
|
+
"@milaboratories/build-configs": "2.0.0"
|
|
62
62
|
},
|
|
63
63
|
"engines": {
|
|
64
64
|
"node": ">=22.19.0"
|
|
@@ -69,17 +69,20 @@ export class BlockPackRegistry {
|
|
|
69
69
|
private readonly http?: Dispatcher,
|
|
70
70
|
) {}
|
|
71
71
|
|
|
72
|
-
private async getPackagesForRoot(
|
|
72
|
+
private async getPackagesForRoot(
|
|
73
|
+
regEntry: RegistryEntry,
|
|
74
|
+
options?: { signal?: AbortSignal },
|
|
75
|
+
): Promise<BlockPackOverview[]> {
|
|
73
76
|
const result: BlockPackOverview[] = [];
|
|
74
77
|
const regSpec = regEntry.spec;
|
|
75
78
|
switch (regSpec.type) {
|
|
76
79
|
case "remote-v1": {
|
|
77
80
|
const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};
|
|
78
81
|
|
|
79
|
-
const overviewResponse = await request(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
);
|
|
82
|
+
const overviewResponse = await request(`${regSpec.url}/${RegistryV1.GlobalOverviewPath}`, {
|
|
83
|
+
...httpOptions,
|
|
84
|
+
signal: options?.signal,
|
|
85
|
+
});
|
|
83
86
|
const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;
|
|
84
87
|
for (const overviewEntry of overview) {
|
|
85
88
|
const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;
|
|
@@ -118,7 +121,9 @@ export class BlockPackRegistry {
|
|
|
118
121
|
}
|
|
119
122
|
|
|
120
123
|
case "remote-v2":
|
|
121
|
-
return (
|
|
124
|
+
return (
|
|
125
|
+
await this.v2Provider.getRegistry(regSpec.url).listBlockPacks({ signal: options?.signal })
|
|
126
|
+
).map((e) => ({
|
|
122
127
|
...e,
|
|
123
128
|
registryId: regEntry.id,
|
|
124
129
|
}));
|
|
@@ -233,12 +238,12 @@ export class BlockPackRegistry {
|
|
|
233
238
|
}
|
|
234
239
|
}
|
|
235
240
|
|
|
236
|
-
public async listBlockPacks(): Promise<BlockPackListing> {
|
|
241
|
+
public async listBlockPacks(options?: { signal?: AbortSignal }): Promise<BlockPackListing> {
|
|
237
242
|
const blockPacks: BlockPackOverview[] = [];
|
|
238
243
|
const registries: RegistryStatus[] = [];
|
|
239
244
|
for (const regSpecs of this.registries) {
|
|
240
245
|
registries.push({ ...regSpecs, status: "online" });
|
|
241
|
-
blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));
|
|
246
|
+
blockPacks.push(...(await this.getPackagesForRoot(regSpecs, options)));
|
|
242
247
|
}
|
|
243
248
|
return { registries, blockPacks };
|
|
244
249
|
}
|