@platforma-sdk/block-tools 2.5.91 → 2.6.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.
Files changed (36) hide show
  1. package/README.md +38 -2
  2. package/dist/cli.js +5 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/cli.mjs +208 -129
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/cmd/index.d.ts +14 -10
  7. package/dist/cmd/list-overview-snapshots.d.ts +9 -0
  8. package/dist/cmd/restore-overview-from-snapshot.d.ts +10 -0
  9. package/dist/config-DjpRXRy9.js +3 -0
  10. package/dist/config-DjpRXRy9.js.map +1 -0
  11. package/dist/config-XBQ2O39y.mjs +2020 -0
  12. package/dist/config-XBQ2O39y.mjs.map +1 -0
  13. package/dist/index.js +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/index.mjs +2 -2
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/registry_v1/config_schema.d.ts +5 -5
  18. package/dist/v2/model/block_description.d.ts +7329 -1422
  19. package/dist/v2/model/block_meta.d.ts +481 -88
  20. package/dist/v2/registry/registry.d.ts +16 -1
  21. package/dist/v2/registry/registry_reader.d.ts +2 -3
  22. package/dist/v2/registry/schema_internal.d.ts +7 -1
  23. package/package.json +5 -5
  24. package/src/cmd/index.ts +14 -10
  25. package/src/cmd/list-overview-snapshots.ts +46 -0
  26. package/src/cmd/restore-overview-from-snapshot.ts +78 -0
  27. package/src/v2/registry/registry.test.ts +176 -4
  28. package/src/v2/registry/registry.ts +146 -13
  29. package/src/v2/registry/registry_reader.ts +5 -6
  30. package/src/v2/registry/schema_internal.ts +16 -1
  31. package/src/v2/registry/schema_public.ts +5 -5
  32. package/dist/config-VnABe7ki.mjs +0 -1951
  33. package/dist/config-VnABe7ki.mjs.map +0 -1
  34. package/dist/config-t7F2nAAr.js +0 -3
  35. package/dist/config-t7F2nAAr.js.map +0 -1
  36. package/dist/v2/registry/schema_public.d.ts +0 -18475
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/v2/registry/registry_reader.ts","../src/io/folder_reader.ts"],"sourcesContent":["import {\n BlockPackId,\n BlockPackIdNoVersion,\n blockPackIdNoVersionEquals,\n BlockPackManifest,\n BlockPackMetaEmbeddedBytes,\n BlockPackMetaManifest,\n BlockPackOverview,\n UpdateSuggestions,\n SingleBlockPackOverview,\n AnyChannel\n} from '@milaboratories/pl-model-middle-layer';\nimport { FolderReader } from '../../io';\nimport canonicalize from 'canonicalize';\nimport {\n GlobalOverviewFileName,\n GlobalOverviewReg,\n MainPrefix,\n ManifestFileName,\n ManifestSuffix,\n packageContentPrefixInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\nimport semver from 'semver';\nimport { calculateSha256 } from '../../util';\nimport { retry, Retry2TimesWithDelay } from '@milaboratories/ts-helpers';\n\nexport type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;\n\nexport type RegistryV2ReaderOps = {\n /** Number of milliseconds to cache retrieved block list for */\n cacheBlockListFor: number;\n /** Number of milliseconds to keep cached retrieved block list for, if new requests returns error */\n keepStaleBlockListFor: number;\n};\n\nconst DefaultRegistryV2ReaderOps: RegistryV2ReaderOps = {\n cacheBlockListFor: 45e3, // 45 seconds\n keepStaleBlockListFor: 300e3 // 5 minutes\n};\n\n/** @param availableVersions must be reverse sorted (from highest version to lowest) */\nexport function inferUpdateSuggestions(currentVersion: string, availableVersions: string[]) {\n const nextMinor = semver.inc(currentVersion, 'minor')!;\n const nextMajor = semver.inc(currentVersion, 'major')!;\n\n // first found = the highest (given the search criteria)\n\n const suggestions: UpdateSuggestions<string> = [];\n\n const patch = availableVersions.find(\n (v) => semver.gt(v, currentVersion) && semver.lt(v, nextMinor)\n );\n const minor = availableVersions.find((v) => semver.gte(v, nextMinor) && semver.lt(v, nextMajor));\n const major = availableVersions.find((v) => semver.gte(v, nextMajor));\n\n if (patch) suggestions.push({ type: 'patch', update: patch });\n if (minor) suggestions.push({ type: 'minor', update: minor });\n if (major) suggestions.push({ type: 'major', update: major });\n\n return suggestions;\n}\n\nexport class RegistryV2Reader {\n private readonly v2RootFolderReader: FolderReader;\n private readonly ops: RegistryV2ReaderOps;\n\n constructor(\n private readonly registryReader: FolderReader,\n ops?: Partial<RegistryV2ReaderOps>\n ) {\n this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);\n this.ops = { ...DefaultRegistryV2ReaderOps, ...(ops ?? {}) };\n }\n\n /**\n * Embeds meta infromation relative to registry root.\n * Meta information that looks like:\n *\n * */\n private readonly embeddedGlobalMetaCache = new LRUCache<\n string,\n BlockPackMetaEmbeddedBytes,\n { meta: BlockPackMetaManifest; relativeTo?: BlockPackId }\n >({\n max: 500,\n fetchMethod: async (_key, _staleValue, options) =>\n await retry(async () => {\n const contentReader =\n options.context.relativeTo !== undefined\n ? this.v2RootFolderReader\n .relativeReader(packageContentPrefixInsideV2(options.context.relativeTo))\n .getContentReader()\n : this.v2RootFolderReader.getContentReader();\n return await BlockPackMetaEmbedBytes(contentReader).parseAsync(options.context.meta);\n }, Retry2TimesWithDelay)\n });\n\n private async embedMetaContent(\n id: BlockPackId,\n sha256: string,\n absolutePath: boolean,\n meta: BlockPackMetaManifest\n ): Promise<BlockPackMetaEmbeddedBytes> {\n return await this.embeddedGlobalMetaCache.forceFetch(\n canonicalize({ id, sha256, absolutePath })!,\n { context: { meta, relativeTo: absolutePath ? undefined : id } }\n );\n }\n\n private listCacheTimestamp: number = 0;\n private listCache: BlockPackOverviewNoRegLabel[] | undefined = undefined;\n\n public async listBlockPacks(): Promise<BlockPackOverviewNoRegLabel[]> {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.cacheBlockListFor\n )\n return this.listCache;\n try {\n return await retry(async () => {\n // const rootContentReader = this.v2RootFolderReader.getContentReader();\n const globalOverview = GlobalOverviewReg.parse(\n JSON.parse(\n Buffer.from(await this.v2RootFolderReader.readFile(GlobalOverviewFileName)).toString()\n )\n );\n\n const result = await Promise.all(\n globalOverview.packages.map(async (p) => {\n const byChannelEntries = await Promise.all(\n Object.entries(p.latestByChannel).map(async ([channel, data]) => [\n channel,\n {\n id: data.description.id,\n meta: await this.embedMetaContent(\n data.description.id,\n data.manifestSha256,\n true,\n data.description.meta\n ),\n featureFlags: data.description.featureFlags,\n spec: {\n type: 'from-registry-v2',\n id: data.description.id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n }\n ])\n );\n return {\n id: p.id,\n latestByChannel: Object.fromEntries(byChannelEntries),\n allVersions: p.allVersionsWithChannels\n } satisfies BlockPackOverviewNoRegLabel;\n })\n );\n\n this.listCache = result;\n this.listCacheTimestamp = Date.now();\n\n return result;\n }, Retry2TimesWithDelay);\n } catch (e: unknown) {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.keepStaleBlockListFor\n )\n return this.listCache;\n throw e;\n }\n }\n\n public async getLatestOverview(\n id: BlockPackIdNoVersion,\n channel: string\n ): Promise<SingleBlockPackOverview | undefined> {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n return overview.latestByChannel[channel];\n }\n\n public async getUpdateSuggestions(\n id: BlockPackId,\n channel: string\n ): Promise<UpdateSuggestions<string> | undefined> {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n\n const versionCandidates = overview.allVersions\n .filter((v) => channel === AnyChannel || v.channels.indexOf(channel) >= 0)\n .map((v) => v.version);\n\n // versions are sorted\n versionCandidates.reverse(); // changing sorting order to opposite\n\n return inferUpdateSuggestions(id.version, versionCandidates);\n }\n\n public async getSpecificOverview(\n id: BlockPackId,\n channel: string\n ): Promise<SingleBlockPackOverview> {\n return await retry(async () => {\n const manifestContent = await this.v2RootFolderReader.readFile(\n packageContentPrefixInsideV2(id) + ManifestSuffix\n );\n const overview = BlockPackManifest.parse(JSON.parse(Buffer.from(manifestContent).toString()));\n return {\n id: id,\n meta: await this.embedMetaContent(\n id,\n await calculateSha256(manifestContent),\n false,\n overview.description.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n };\n }, Retry2TimesWithDelay);\n }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) =>\n await retry(async () => {\n const packageFolderReader = this.v2RootFolderReader.relativeReader(\n packageContentPrefixInsideV2(id)\n );\n const manifest = BlockPackManifest.parse(\n JSON.parse(Buffer.from(await packageFolderReader.readFile(ManifestFileName)).toString())\n );\n return BlockComponentsAbsoluteUrl(packageFolderReader.rootUrl.toString()).parse(\n manifest.description.components\n );\n }, Retry2TimesWithDelay)\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Dispatcher, request } from 'undici';\nimport { RelativeContentReader } from '../v2';\nimport path from 'node:path';\nimport pathPosix from 'node:path/posix';\nimport fsp from 'node:fs/promises';\nimport { defaultHttpDispatcher } from '@milaboratories/pl-http';\n\nexport interface FolderReader {\n readonly rootUrl: URL;\n relativeReader(relativePath: string): FolderReader;\n readFile(file: string): Promise<Buffer>;\n getContentReader(relativePath?: string): RelativeContentReader;\n}\n\nclass HttpFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly httpDispatcher: Dispatcher\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetUrl = new URL(file, this.rootUrl);\n const response = await request(targetUrl, {\n dispatcher: this.httpDispatcher\n });\n return Buffer.from(await response.body.arrayBuffer());\n }\n\n public relativeReader(relativePath: string): HttpFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new HttpFolderReader(new URL(relativePath, this.rootUrl), this.httpDispatcher);\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: HttpFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nclass FSFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly root: string\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetPath = path.join(this.root, ...file.split(pathPosix.sep));\n return await fsp.readFile(targetPath);\n }\n\n public relativeReader(relativePath: string): FSFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new FSFolderReader(\n new URL(relativePath, this.rootUrl),\n path.join(this.root, ...relativePath.split(pathPosix.sep))\n );\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: FSFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nfunction posixToLocalPath(p: string): string {\n return p.split(pathPosix.sep).join(path.sep);\n}\n\nfunction localToPosix(p: string): string {\n return p.split(path.sep).join(pathPosix.sep);\n}\n\nexport function folderReaderByUrl(address: string, httpDispatcher?: Dispatcher): FolderReader {\n if (!address.endsWith('/')) address = address + '/';\n const url = new URL(address, `file:${localToPosix(path.resolve('.'))}/`);\n switch (url.protocol) {\n case 'file:':\n const rootPath = posixToLocalPath(url.pathname);\n return new FSFolderReader(url, rootPath);\n case 'https:':\n case 'http:':\n return new HttpFolderReader(url, httpDispatcher ?? defaultHttpDispatcher());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","inferUpdateSuggestions","currentVersion","availableVersions","nextMinor","semver","nextMajor","suggestions","patch","v","minor","major","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","_key","_staleValue","options","retry","contentReader","packageContentPrefixInsideV2","BlockPackMetaEmbedBytes","Retry2TimesWithDelay","key","staleValue","id","packageFolderReader","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","sha256","absolutePath","meta","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","byChannelEntries","channel","data","e","overview","blockPackIdNoVersionEquals","versionCandidates","AnyChannel","manifestContent","ManifestSuffix","calculateSha256","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","defaultHttpDispatcher"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/v2/registry/registry_reader.ts","../src/io/folder_reader.ts"],"sourcesContent":["import {\n BlockPackId,\n BlockPackIdNoVersion,\n blockPackIdNoVersionEquals,\n BlockPackManifest,\n BlockPackMetaEmbeddedBytes,\n BlockPackMetaManifest,\n BlockPackOverview,\n UpdateSuggestions,\n SingleBlockPackOverview,\n AnyChannel,\n BlockPackOverviewNoRegistryId\n} from '@milaboratories/pl-model-middle-layer';\nimport { FolderReader } from '../../io';\nimport canonicalize from 'canonicalize';\nimport {\n GlobalOverviewFileName,\n GlobalOverviewReg,\n MainPrefix,\n ManifestFileName,\n ManifestSuffix,\n packageContentPrefixInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\nimport semver from 'semver';\nimport { calculateSha256 } from '../../util';\nimport { retry, Retry2TimesWithDelay } from '@milaboratories/ts-helpers';\n\nexport type RegistryV2ReaderOps = {\n /** Number of milliseconds to cache retrieved block list for */\n cacheBlockListFor: number;\n /** Number of milliseconds to keep cached retrieved block list for, if new requests returns error */\n keepStaleBlockListFor: number;\n};\n\nconst DefaultRegistryV2ReaderOps: RegistryV2ReaderOps = {\n cacheBlockListFor: 45e3, // 45 seconds\n keepStaleBlockListFor: 300e3 // 5 minutes\n};\n\n/** @param availableVersions must be reverse sorted (from highest version to lowest) */\nexport function inferUpdateSuggestions(currentVersion: string, availableVersions: string[]) {\n const nextMinor = semver.inc(currentVersion, 'minor')!;\n const nextMajor = semver.inc(currentVersion, 'major')!;\n\n // first found = the highest (given the search criteria)\n\n const suggestions: UpdateSuggestions<string> = [];\n\n const patch = availableVersions.find(\n (v) => semver.gt(v, currentVersion) && semver.lt(v, nextMinor)\n );\n const minor = availableVersions.find((v) => semver.gte(v, nextMinor) && semver.lt(v, nextMajor));\n const major = availableVersions.find((v) => semver.gte(v, nextMajor));\n\n if (patch) suggestions.push({ type: 'patch', update: patch });\n if (minor) suggestions.push({ type: 'minor', update: minor });\n if (major) suggestions.push({ type: 'major', update: major });\n\n return suggestions;\n}\n\nexport class RegistryV2Reader {\n private readonly v2RootFolderReader: FolderReader;\n private readonly ops: RegistryV2ReaderOps;\n\n constructor(\n private readonly registryReader: FolderReader,\n ops?: Partial<RegistryV2ReaderOps>\n ) {\n this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);\n this.ops = { ...DefaultRegistryV2ReaderOps, ...(ops ?? {}) };\n }\n\n /**\n * Embeds meta infromation relative to registry root.\n * Meta information that looks like:\n *\n * */\n private readonly embeddedGlobalMetaCache = new LRUCache<\n string,\n BlockPackMetaEmbeddedBytes,\n { meta: BlockPackMetaManifest; relativeTo?: BlockPackId }\n >({\n max: 500,\n fetchMethod: async (_key, _staleValue, options) =>\n await retry(async () => {\n const contentReader =\n options.context.relativeTo !== undefined\n ? this.v2RootFolderReader\n .relativeReader(packageContentPrefixInsideV2(options.context.relativeTo))\n .getContentReader()\n : this.v2RootFolderReader.getContentReader();\n return await BlockPackMetaEmbedBytes(contentReader).parseAsync(options.context.meta);\n }, Retry2TimesWithDelay)\n });\n\n private async embedMetaContent(\n id: BlockPackId,\n sha256: string,\n absolutePath: boolean,\n meta: BlockPackMetaManifest\n ): Promise<BlockPackMetaEmbeddedBytes> {\n return await this.embeddedGlobalMetaCache.forceFetch(\n canonicalize({ id, sha256, absolutePath })!,\n { context: { meta, relativeTo: absolutePath ? undefined : id } }\n );\n }\n\n private listCacheTimestamp: number = 0;\n private listCache: BlockPackOverviewNoRegistryId[] | undefined = undefined;\n\n public async listBlockPacks(): Promise<BlockPackOverviewNoRegistryId[]> {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.cacheBlockListFor\n )\n return this.listCache;\n try {\n return await retry(async () => {\n // const rootContentReader = this.v2RootFolderReader.getContentReader();\n const globalOverview = GlobalOverviewReg.parse(\n JSON.parse(\n Buffer.from(await this.v2RootFolderReader.readFile(GlobalOverviewFileName)).toString()\n )\n );\n\n const result = await Promise.all(\n globalOverview.packages.map(async (p) => {\n const byChannelEntries = await Promise.all(\n Object.entries(p.latestByChannel).map(async ([channel, data]) => [\n channel,\n {\n id: data.description.id,\n meta: await this.embedMetaContent(\n data.description.id,\n data.manifestSha256,\n true,\n data.description.meta\n ),\n featureFlags: data.description.featureFlags,\n spec: {\n type: 'from-registry-v2',\n id: data.description.id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n }\n ])\n );\n return {\n id: p.id,\n latestByChannel: Object.fromEntries(byChannelEntries),\n allVersions: p.allVersionsWithChannels\n } satisfies BlockPackOverviewNoRegistryId;\n })\n );\n\n this.listCache = result;\n this.listCacheTimestamp = Date.now();\n\n return result;\n }, Retry2TimesWithDelay);\n } catch (e: unknown) {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.keepStaleBlockListFor\n )\n return this.listCache;\n throw e;\n }\n }\n\n public async getLatestOverview(\n id: BlockPackIdNoVersion,\n channel: string\n ): Promise<SingleBlockPackOverview | undefined> {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n return overview.latestByChannel[channel];\n }\n\n public async getUpdateSuggestions(\n id: BlockPackId,\n channel: string\n ): Promise<UpdateSuggestions<string> | undefined> {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n\n const versionCandidates = overview.allVersions\n .filter((v) => channel === AnyChannel || v.channels.indexOf(channel) >= 0)\n .map((v) => v.version);\n\n // versions are sorted\n versionCandidates.reverse(); // changing sorting order to opposite\n\n return inferUpdateSuggestions(id.version, versionCandidates);\n }\n\n public async getSpecificOverview(\n id: BlockPackId,\n channel: string\n ): Promise<SingleBlockPackOverview> {\n return await retry(async () => {\n const manifestContent = await this.v2RootFolderReader.readFile(\n packageContentPrefixInsideV2(id) + ManifestSuffix\n );\n const overview = BlockPackManifest.parse(JSON.parse(Buffer.from(manifestContent).toString()));\n return {\n id: id,\n meta: await this.embedMetaContent(\n id,\n await calculateSha256(manifestContent),\n false,\n overview.description.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n };\n }, Retry2TimesWithDelay);\n }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) =>\n await retry(async () => {\n const packageFolderReader = this.v2RootFolderReader.relativeReader(\n packageContentPrefixInsideV2(id)\n );\n const manifest = BlockPackManifest.parse(\n JSON.parse(Buffer.from(await packageFolderReader.readFile(ManifestFileName)).toString())\n );\n return BlockComponentsAbsoluteUrl(packageFolderReader.rootUrl.toString()).parse(\n manifest.description.components\n );\n }, Retry2TimesWithDelay)\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Dispatcher, request } from 'undici';\nimport { RelativeContentReader } from '../v2';\nimport path from 'node:path';\nimport pathPosix from 'node:path/posix';\nimport fsp from 'node:fs/promises';\nimport { defaultHttpDispatcher } from '@milaboratories/pl-http';\n\nexport interface FolderReader {\n readonly rootUrl: URL;\n relativeReader(relativePath: string): FolderReader;\n readFile(file: string): Promise<Buffer>;\n getContentReader(relativePath?: string): RelativeContentReader;\n}\n\nclass HttpFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly httpDispatcher: Dispatcher\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetUrl = new URL(file, this.rootUrl);\n const response = await request(targetUrl, {\n dispatcher: this.httpDispatcher\n });\n return Buffer.from(await response.body.arrayBuffer());\n }\n\n public relativeReader(relativePath: string): HttpFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new HttpFolderReader(new URL(relativePath, this.rootUrl), this.httpDispatcher);\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: HttpFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nclass FSFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly root: string\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetPath = path.join(this.root, ...file.split(pathPosix.sep));\n return await fsp.readFile(targetPath);\n }\n\n public relativeReader(relativePath: string): FSFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new FSFolderReader(\n new URL(relativePath, this.rootUrl),\n path.join(this.root, ...relativePath.split(pathPosix.sep))\n );\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: FSFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nfunction posixToLocalPath(p: string): string {\n return p.split(pathPosix.sep).join(path.sep);\n}\n\nfunction localToPosix(p: string): string {\n return p.split(path.sep).join(pathPosix.sep);\n}\n\nexport function folderReaderByUrl(address: string, httpDispatcher?: Dispatcher): FolderReader {\n if (!address.endsWith('/')) address = address + '/';\n const url = new URL(address, `file:${localToPosix(path.resolve('.'))}/`);\n switch (url.protocol) {\n case 'file:':\n const rootPath = posixToLocalPath(url.pathname);\n return new FSFolderReader(url, rootPath);\n case 'https:':\n case 'http:':\n return new HttpFolderReader(url, httpDispatcher ?? defaultHttpDispatcher());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","inferUpdateSuggestions","currentVersion","availableVersions","nextMinor","semver","nextMajor","suggestions","patch","v","minor","major","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","_key","_staleValue","options","retry","contentReader","packageContentPrefixInsideV2","BlockPackMetaEmbedBytes","Retry2TimesWithDelay","key","staleValue","id","packageFolderReader","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","sha256","absolutePath","meta","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","byChannelEntries","channel","data","e","overview","blockPackIdNoVersionEquals","versionCandidates","AnyChannel","manifestContent","ManifestSuffix","calculateSha256","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","defaultHttpDispatcher"],"mappings":"ksBAoCMA,EAAkD,CACtD,kBAAmB,KACnB,sBAAuB,GACzB,EAGO,SAASC,EAAuBC,EAAwBC,EAA6B,CAC1F,MAAMC,EAAYC,EAAAA,OAAO,IAAIH,EAAgB,OAAO,EAC9CI,EAAYD,EAAAA,OAAO,IAAIH,EAAgB,OAAO,EAI9CK,EAAyC,CAAA,EAEzCC,EAAQL,EAAkB,KAC7BM,GAAMJ,SAAO,GAAGI,EAAGP,CAAc,GAAKG,EAAAA,OAAO,GAAGI,EAAGL,CAAS,CAAA,EAEzDM,EAAQP,EAAkB,KAAMM,GAAMJ,EAAAA,OAAO,IAAII,EAAGL,CAAS,GAAKC,EAAAA,OAAO,GAAGI,EAAGH,CAAS,CAAC,EACzFK,EAAQR,EAAkB,KAAMM,GAAMJ,EAAAA,OAAO,IAAII,EAAGH,CAAS,CAAC,EAEpE,OAAIE,KAAmB,KAAK,CAAE,KAAM,QAAS,OAAQA,EAAO,EACxDE,KAAmB,KAAK,CAAE,KAAM,QAAS,OAAQA,EAAO,EACxDC,KAAmB,KAAK,CAAE,KAAM,QAAS,OAAQA,EAAO,EAErDJ,CACT,CAEO,MAAMK,CAAiB,CAI5B,YACmBC,EACjBC,EACA,CANeC,EAAA,2BACAA,EAAA,YAeAA,EAAA,+BAA0B,IAAIC,EAAAA,SAI7C,CACA,IAAK,IACL,YAAa,MAAOC,EAAMC,EAAaC,IACrC,MAAMC,EAAAA,MAAM,SAAY,CACtB,MAAMC,EACJF,EAAQ,QAAQ,aAAe,OAC3B,KAAK,mBACF,eAAeG,EAAAA,6BAA6BH,EAAQ,QAAQ,UAAU,CAAC,EACvE,mBACH,KAAK,mBAAmB,iBAAA,EAC9B,OAAO,MAAMI,EAAAA,wBAAwBF,CAAa,EAAE,WAAWF,EAAQ,QAAQ,IAAI,CACrF,EAAGK,EAAAA,oBAAoB,CAAA,CAC1B,GAcOT,EAAA,0BAA6B,GAC7BA,EAAA,kBAwHSA,EAAA,uBAAkB,IAAIC,EAAAA,SAA0D,CAC/F,IAAK,IACL,YAAa,MAAOS,EAAKC,EAAY,CAAE,QAASC,CAAA,IAC9C,MAAMP,EAAAA,MAAM,SAAY,CACtB,MAAMQ,EAAsB,KAAK,mBAAmB,eAClDN,EAAAA,6BAA6BK,CAAE,CAAA,EAE3BE,EAAWC,EAAAA,kBAAkB,MACjC,KAAK,MAAM,OAAO,KAAK,MAAMF,EAAoB,SAASG,EAAAA,gBAAgB,CAAC,EAAE,SAAA,CAAU,CAAA,EAEzF,OAAOC,EAAAA,2BAA2BJ,EAAoB,QAAQ,SAAA,CAAU,EAAE,MACxEC,EAAS,YAAY,UAAA,CAEzB,EAAGL,EAAAA,oBAAoB,CAAA,CAC1B,GAjLkB,KAAA,eAAAX,EAGjB,KAAK,mBAAqBA,EAAe,eAAeoB,EAAAA,UAAU,EAClE,KAAK,IAAM,CAAE,GAAGjC,EAA4B,GAAIc,GAAO,CAAA,CAAC,CAC1D,CAyBA,MAAc,iBACZa,EACAO,EACAC,EACAC,EACqC,CACrC,OAAO,MAAM,KAAK,wBAAwB,WACxCC,EAAa,CAAE,GAAAV,EAAI,OAAAO,EAAQ,aAAAC,EAAc,EACzC,CAAE,QAAS,CAAE,KAAAC,EAAM,WAAYD,EAAe,OAAYR,EAAG,CAAE,CAEnE,CAKA,MAAa,gBAA2D,CACtE,GACE,KAAK,YAAc,QACnB,KAAK,MAAQ,KAAK,oBAAsB,KAAK,IAAI,kBAEjD,OAAO,KAAK,UACd,GAAI,CACF,OAAO,MAAMP,EAAAA,MAAM,SAAY,CAE7B,MAAMkB,EAAiBC,EAAAA,kBAAkB,MACvC,KAAK,MACH,OAAO,KAAK,MAAM,KAAK,mBAAmB,SAASC,EAAAA,sBAAsB,CAAC,EAAE,SAAA,CAAS,CACvF,EAGIC,EAAS,MAAM,QAAQ,IAC3BH,EAAe,SAAS,IAAI,MAAOI,GAAM,CACvC,MAAMC,EAAmB,MAAM,QAAQ,IACrC,OAAO,QAAQD,EAAE,eAAe,EAAE,IAAI,MAAO,CAACE,EAASC,CAAI,IAAM,CAC/DD,EACA,CACE,GAAIC,EAAK,YAAY,GACrB,KAAM,MAAM,KAAK,iBACfA,EAAK,YAAY,GACjBA,EAAK,eACL,GACAA,EAAK,YAAY,IAAA,EAEnB,aAAcA,EAAK,YAAY,aAC/B,KAAM,CACJ,KAAM,mBACN,GAAIA,EAAK,YAAY,GACrB,YAAa,KAAK,eAAe,QAAQ,SAAA,EACzC,QAAAD,CAAA,CACF,CACF,CACD,CAAA,EAEH,MAAO,CACL,GAAIF,EAAE,GACN,gBAAiB,OAAO,YAAYC,CAAgB,EACpD,YAAaD,EAAE,uBAAA,CAEnB,CAAC,CAAA,EAGH,YAAK,UAAYD,EACjB,KAAK,mBAAqB,KAAK,IAAA,EAExBA,CACT,EAAGjB,EAAAA,oBAAoB,CACzB,OAASsB,EAAY,CACnB,GACE,KAAK,YAAc,QACnB,KAAK,MAAQ,KAAK,oBAAsB,KAAK,IAAI,sBAEjD,OAAO,KAAK,UACd,MAAMA,CACR,CACF,CAEA,MAAa,kBACXnB,EACAiB,EAC8C,CAC9C,MAAMG,GAAY,MAAM,KAAK,eAAA,GAAkB,KAAMD,GACnDE,EAAAA,2BAA2BrB,EAAImB,EAAE,EAAE,CAAA,EAErC,GAAIC,IAAa,OACjB,OAAOA,EAAS,gBAAgBH,CAAO,CACzC,CAEA,MAAa,qBACXjB,EACAiB,EACgD,CAChD,MAAMG,GAAY,MAAM,KAAK,eAAA,GAAkB,KAAMD,GACnDE,EAAAA,2BAA2BrB,EAAImB,EAAE,EAAE,CAAA,EAErC,GAAIC,IAAa,OAAW,OAE5B,MAAME,EAAoBF,EAAS,YAChC,OAAQtC,GAAMmC,IAAYM,EAAAA,YAAczC,EAAE,SAAS,QAAQmC,CAAO,GAAK,CAAC,EACxE,IAAKnC,GAAMA,EAAE,OAAO,EAGvB,OAAAwC,EAAkB,QAAA,EAEXhD,EAAuB0B,EAAG,QAASsB,CAAiB,CAC7D,CAEA,MAAa,oBACXtB,EACAiB,EACkC,CAClC,OAAO,MAAMxB,EAAAA,MAAM,SAAY,CAC7B,MAAM+B,EAAkB,MAAM,KAAK,mBAAmB,SACpD7B,EAAAA,6BAA6BK,CAAE,EAAIyB,EAAAA,cAAA,EAE/BL,EAAWjB,EAAAA,kBAAkB,MAAM,KAAK,MAAM,OAAO,KAAKqB,CAAe,EAAE,SAAA,CAAU,CAAC,EAC5F,MAAO,CACL,GAAAxB,EACA,KAAM,MAAM,KAAK,iBACfA,EACA,MAAM0B,EAAAA,gBAAgBF,CAAe,EACrC,GACAJ,EAAS,YAAY,IAAA,EAEvB,KAAM,CACJ,KAAM,mBACN,GAAApB,EACA,YAAa,KAAK,eAAe,QAAQ,SAAA,EACzC,QAAAiB,CAAA,CACF,CAEJ,EAAGpB,EAAAA,oBAAoB,CACzB,CAkBA,MAAa,cAAcG,EAAsD,CAC/E,OAAO,MAAM,KAAK,gBAAgB,WAAWU,EAAaV,CAAE,EAAI,CAAE,QAASA,EAAI,CACjF,CACF,CC5OA,MAAM2B,CAAyC,CAC7C,YACkBC,EACCC,EACjB,CAFgB,KAAA,QAAAD,EACC,KAAA,eAAAC,CAChB,CAEH,MAAa,SAASC,EAA+B,CACnD,MAAMC,EAAY,IAAI,IAAID,EAAM,KAAK,OAAO,EACtCE,EAAW,MAAMC,EAAAA,QAAQF,EAAW,CACxC,WAAY,KAAK,cAAA,CAClB,EACD,OAAO,OAAO,KAAK,MAAMC,EAAS,KAAK,aAAa,CACtD,CAEO,eAAeE,EAAwC,CAC5D,OAAKA,EAAa,SAAS,GAAG,MAAkBA,EAAe,KACxD,IAAIP,EAAiB,IAAI,IAAIO,EAAc,KAAK,OAAO,EAAG,KAAK,cAAc,CACtF,CAEO,iBAAiBA,EAA8C,CACpE,IAAIC,EAA2B,KAC/B,OAAID,IAAiB,SAAWC,EAASA,EAAO,eAAeD,CAAY,GACnEE,GAASD,EAAO,SAASC,CAAI,CACvC,CACF,CAEA,MAAMC,CAAuC,CAC3C,YACkBT,EACCU,EACjB,CAFgB,KAAA,QAAAV,EACC,KAAA,KAAAU,CAChB,CAEH,MAAa,SAASR,EAA+B,CACnD,MAAMS,EAAaH,EAAK,KAAK,KAAK,KAAM,GAAGN,EAAK,MAAMU,EAAU,GAAG,CAAC,EACpE,OAAO,MAAMC,EAAI,SAASF,CAAU,CACtC,CAEO,eAAeL,EAAsC,CAC1D,OAAKA,EAAa,SAAS,GAAG,MAAkBA,EAAe,KACxD,IAAIG,EACT,IAAI,IAAIH,EAAc,KAAK,OAAO,EAClCE,EAAK,KAAK,KAAK,KAAM,GAAGF,EAAa,MAAMM,EAAU,GAAG,CAAC,CAAA,CAE7D,CAEO,iBAAiBN,EAA8C,CACpE,IAAIC,EAAyB,KAC7B,OAAID,IAAiB,SAAWC,EAASA,EAAO,eAAeD,CAAY,GACnEE,GAASD,EAAO,SAASC,CAAI,CACvC,CACF,CAEA,SAASM,EAAiB3B,EAAmB,CAC3C,OAAOA,EAAE,MAAMyB,EAAU,GAAG,EAAE,KAAKJ,EAAK,GAAG,CAC7C,CAEA,SAASO,EAAa5B,EAAmB,CACvC,OAAOA,EAAE,MAAMqB,EAAK,GAAG,EAAE,KAAKI,EAAU,GAAG,CAC7C,CAEO,SAASI,EAAkBC,EAAiBhB,EAA2C,CACvFgB,EAAQ,SAAS,GAAG,MAAaA,EAAU,KAChD,MAAMC,EAAM,IAAI,IAAID,EAAS,QAAQF,EAAaP,EAAK,QAAQ,GAAG,CAAC,CAAC,GAAG,EACvE,OAAQU,EAAI,SAAA,CACV,IAAK,QACH,MAAMC,EAAWL,EAAiBI,EAAI,QAAQ,EAC9C,OAAO,IAAIT,EAAeS,EAAKC,CAAQ,EACzC,IAAK,SACL,IAAK,QACH,OAAO,IAAIpB,EAAiBmB,EAAKjB,GAAkBmB,EAAAA,uBAAuB,EAC5E,QACE,MAAM,IAAI,MAAM,qBAAqBF,EAAI,QAAQ,EAAE,CAAA,CAEzD"}
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  var C = Object.defineProperty;
2
2
  var P = (s, e, t) => e in s ? C(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;
3
3
  var l = (s, e, t) => P(s, typeof e != "symbol" ? e + "" : e, t);
4
- import { e as c, f as B, p as m, h as F, G as b, i as x, j as O, k as S, M as T, m as D, n as M, o as U, q as E, r as G, t as j, u as L, v as N, w as V, P as A, x as J, y as z, z as W } from "./config-VnABe7ki.mjs";
5
- import { V as ye, U as we, Z as Re, ah as Ce, X as Pe, Y as Be, Q as Fe, a as be, B as xe, T as Oe, b as Se, a3 as Te, a2 as De, F as Me, ag as Ue, ae as Ee, af as Ge, a0 as je, ad as Le, ac as Ne, aj as Ve, ai as Ae, ab as Je, a6 as ze, a1 as We, a5 as Ie, W as _e, R as qe, A as $e, S as He, E as Ye, H as Ke, D as Qe, d as Xe, I as Ze, c as et, l as tt, C as at, J as ot, aa as st, a9 as it, a4 as rt, a8 as nt, a7 as lt, _ as ct, L as pt, N as dt, O as ht, K as ft, s as mt, $ as gt } from "./config-VnABe7ki.mjs";
4
+ import { e as c, f as B, p as m, h as F, G as b, i as x, j as O, k as S, M as T, m as D, n as M, o as U, q as E, r as G, t as j, u as L, v as N, w as V, P as A, x as J, y as z, z as W } from "./config-XBQ2O39y.mjs";
5
+ import { V as ye, U as we, Z as Re, ah as Ce, X as Pe, Y as Be, Q as Fe, a as be, B as xe, T as Oe, b as Se, a3 as Te, a2 as De, F as Me, ag as Ue, ae as Ee, af as Ge, a0 as je, ad as Le, ac as Ne, aj as Ve, ai as Ae, ab as Je, a6 as ze, a1 as We, a5 as Ie, W as _e, R as qe, A as $e, S as He, E as Ye, H as Ke, D as Qe, d as Xe, I as Ze, c as et, l as tt, C as at, J as ot, aa as st, a9 as it, a4 as rt, a8 as nt, a7 as lt, _ as ct, L as pt, N as dt, O as ht, K as ft, s as mt, $ as gt } from "./config-XBQ2O39y.mjs";
6
6
  import { request as I } from "undici";
7
7
  import p from "node:path";
8
8
  import f from "node:path/posix";
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/v2/registry/registry_reader.ts","../src/io/folder_reader.ts"],"sourcesContent":["import {\n BlockPackId,\n BlockPackIdNoVersion,\n blockPackIdNoVersionEquals,\n BlockPackManifest,\n BlockPackMetaEmbeddedBytes,\n BlockPackMetaManifest,\n BlockPackOverview,\n UpdateSuggestions,\n SingleBlockPackOverview,\n AnyChannel\n} from '@milaboratories/pl-model-middle-layer';\nimport { FolderReader } from '../../io';\nimport canonicalize from 'canonicalize';\nimport {\n GlobalOverviewFileName,\n GlobalOverviewReg,\n MainPrefix,\n ManifestFileName,\n ManifestSuffix,\n packageContentPrefixInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\nimport semver from 'semver';\nimport { calculateSha256 } from '../../util';\nimport { retry, Retry2TimesWithDelay } from '@milaboratories/ts-helpers';\n\nexport type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;\n\nexport type RegistryV2ReaderOps = {\n /** Number of milliseconds to cache retrieved block list for */\n cacheBlockListFor: number;\n /** Number of milliseconds to keep cached retrieved block list for, if new requests returns error */\n keepStaleBlockListFor: number;\n};\n\nconst DefaultRegistryV2ReaderOps: RegistryV2ReaderOps = {\n cacheBlockListFor: 45e3, // 45 seconds\n keepStaleBlockListFor: 300e3 // 5 minutes\n};\n\n/** @param availableVersions must be reverse sorted (from highest version to lowest) */\nexport function inferUpdateSuggestions(currentVersion: string, availableVersions: string[]) {\n const nextMinor = semver.inc(currentVersion, 'minor')!;\n const nextMajor = semver.inc(currentVersion, 'major')!;\n\n // first found = the highest (given the search criteria)\n\n const suggestions: UpdateSuggestions<string> = [];\n\n const patch = availableVersions.find(\n (v) => semver.gt(v, currentVersion) && semver.lt(v, nextMinor)\n );\n const minor = availableVersions.find((v) => semver.gte(v, nextMinor) && semver.lt(v, nextMajor));\n const major = availableVersions.find((v) => semver.gte(v, nextMajor));\n\n if (patch) suggestions.push({ type: 'patch', update: patch });\n if (minor) suggestions.push({ type: 'minor', update: minor });\n if (major) suggestions.push({ type: 'major', update: major });\n\n return suggestions;\n}\n\nexport class RegistryV2Reader {\n private readonly v2RootFolderReader: FolderReader;\n private readonly ops: RegistryV2ReaderOps;\n\n constructor(\n private readonly registryReader: FolderReader,\n ops?: Partial<RegistryV2ReaderOps>\n ) {\n this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);\n this.ops = { ...DefaultRegistryV2ReaderOps, ...(ops ?? {}) };\n }\n\n /**\n * Embeds meta infromation relative to registry root.\n * Meta information that looks like:\n *\n * */\n private readonly embeddedGlobalMetaCache = new LRUCache<\n string,\n BlockPackMetaEmbeddedBytes,\n { meta: BlockPackMetaManifest; relativeTo?: BlockPackId }\n >({\n max: 500,\n fetchMethod: async (_key, _staleValue, options) =>\n await retry(async () => {\n const contentReader =\n options.context.relativeTo !== undefined\n ? this.v2RootFolderReader\n .relativeReader(packageContentPrefixInsideV2(options.context.relativeTo))\n .getContentReader()\n : this.v2RootFolderReader.getContentReader();\n return await BlockPackMetaEmbedBytes(contentReader).parseAsync(options.context.meta);\n }, Retry2TimesWithDelay)\n });\n\n private async embedMetaContent(\n id: BlockPackId,\n sha256: string,\n absolutePath: boolean,\n meta: BlockPackMetaManifest\n ): Promise<BlockPackMetaEmbeddedBytes> {\n return await this.embeddedGlobalMetaCache.forceFetch(\n canonicalize({ id, sha256, absolutePath })!,\n { context: { meta, relativeTo: absolutePath ? undefined : id } }\n );\n }\n\n private listCacheTimestamp: number = 0;\n private listCache: BlockPackOverviewNoRegLabel[] | undefined = undefined;\n\n public async listBlockPacks(): Promise<BlockPackOverviewNoRegLabel[]> {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.cacheBlockListFor\n )\n return this.listCache;\n try {\n return await retry(async () => {\n // const rootContentReader = this.v2RootFolderReader.getContentReader();\n const globalOverview = GlobalOverviewReg.parse(\n JSON.parse(\n Buffer.from(await this.v2RootFolderReader.readFile(GlobalOverviewFileName)).toString()\n )\n );\n\n const result = await Promise.all(\n globalOverview.packages.map(async (p) => {\n const byChannelEntries = await Promise.all(\n Object.entries(p.latestByChannel).map(async ([channel, data]) => [\n channel,\n {\n id: data.description.id,\n meta: await this.embedMetaContent(\n data.description.id,\n data.manifestSha256,\n true,\n data.description.meta\n ),\n featureFlags: data.description.featureFlags,\n spec: {\n type: 'from-registry-v2',\n id: data.description.id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n }\n ])\n );\n return {\n id: p.id,\n latestByChannel: Object.fromEntries(byChannelEntries),\n allVersions: p.allVersionsWithChannels\n } satisfies BlockPackOverviewNoRegLabel;\n })\n );\n\n this.listCache = result;\n this.listCacheTimestamp = Date.now();\n\n return result;\n }, Retry2TimesWithDelay);\n } catch (e: unknown) {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.keepStaleBlockListFor\n )\n return this.listCache;\n throw e;\n }\n }\n\n public async getLatestOverview(\n id: BlockPackIdNoVersion,\n channel: string\n ): Promise<SingleBlockPackOverview | undefined> {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n return overview.latestByChannel[channel];\n }\n\n public async getUpdateSuggestions(\n id: BlockPackId,\n channel: string\n ): Promise<UpdateSuggestions<string> | undefined> {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n\n const versionCandidates = overview.allVersions\n .filter((v) => channel === AnyChannel || v.channels.indexOf(channel) >= 0)\n .map((v) => v.version);\n\n // versions are sorted\n versionCandidates.reverse(); // changing sorting order to opposite\n\n return inferUpdateSuggestions(id.version, versionCandidates);\n }\n\n public async getSpecificOverview(\n id: BlockPackId,\n channel: string\n ): Promise<SingleBlockPackOverview> {\n return await retry(async () => {\n const manifestContent = await this.v2RootFolderReader.readFile(\n packageContentPrefixInsideV2(id) + ManifestSuffix\n );\n const overview = BlockPackManifest.parse(JSON.parse(Buffer.from(manifestContent).toString()));\n return {\n id: id,\n meta: await this.embedMetaContent(\n id,\n await calculateSha256(manifestContent),\n false,\n overview.description.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n };\n }, Retry2TimesWithDelay);\n }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) =>\n await retry(async () => {\n const packageFolderReader = this.v2RootFolderReader.relativeReader(\n packageContentPrefixInsideV2(id)\n );\n const manifest = BlockPackManifest.parse(\n JSON.parse(Buffer.from(await packageFolderReader.readFile(ManifestFileName)).toString())\n );\n return BlockComponentsAbsoluteUrl(packageFolderReader.rootUrl.toString()).parse(\n manifest.description.components\n );\n }, Retry2TimesWithDelay)\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Dispatcher, request } from 'undici';\nimport { RelativeContentReader } from '../v2';\nimport path from 'node:path';\nimport pathPosix from 'node:path/posix';\nimport fsp from 'node:fs/promises';\nimport { defaultHttpDispatcher } from '@milaboratories/pl-http';\n\nexport interface FolderReader {\n readonly rootUrl: URL;\n relativeReader(relativePath: string): FolderReader;\n readFile(file: string): Promise<Buffer>;\n getContentReader(relativePath?: string): RelativeContentReader;\n}\n\nclass HttpFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly httpDispatcher: Dispatcher\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetUrl = new URL(file, this.rootUrl);\n const response = await request(targetUrl, {\n dispatcher: this.httpDispatcher\n });\n return Buffer.from(await response.body.arrayBuffer());\n }\n\n public relativeReader(relativePath: string): HttpFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new HttpFolderReader(new URL(relativePath, this.rootUrl), this.httpDispatcher);\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: HttpFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nclass FSFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly root: string\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetPath = path.join(this.root, ...file.split(pathPosix.sep));\n return await fsp.readFile(targetPath);\n }\n\n public relativeReader(relativePath: string): FSFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new FSFolderReader(\n new URL(relativePath, this.rootUrl),\n path.join(this.root, ...relativePath.split(pathPosix.sep))\n );\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: FSFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nfunction posixToLocalPath(p: string): string {\n return p.split(pathPosix.sep).join(path.sep);\n}\n\nfunction localToPosix(p: string): string {\n return p.split(path.sep).join(pathPosix.sep);\n}\n\nexport function folderReaderByUrl(address: string, httpDispatcher?: Dispatcher): FolderReader {\n if (!address.endsWith('/')) address = address + '/';\n const url = new URL(address, `file:${localToPosix(path.resolve('.'))}/`);\n switch (url.protocol) {\n case 'file:':\n const rootPath = posixToLocalPath(url.pathname);\n return new FSFolderReader(url, rootPath);\n case 'https:':\n case 'http:':\n return new HttpFolderReader(url, httpDispatcher ?? defaultHttpDispatcher());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","inferUpdateSuggestions","currentVersion","availableVersions","nextMinor","semver","nextMajor","suggestions","patch","v","minor","major","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","_key","_staleValue","options","retry","contentReader","packageContentPrefixInsideV2","BlockPackMetaEmbedBytes","Retry2TimesWithDelay","key","staleValue","id","packageFolderReader","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","sha256","absolutePath","meta","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","byChannelEntries","channel","data","overview","e","blockPackIdNoVersionEquals","versionCandidates","AnyChannel","manifestContent","ManifestSuffix","calculateSha256","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","defaultHttpDispatcher"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/v2/registry/registry_reader.ts","../src/io/folder_reader.ts"],"sourcesContent":["import {\n BlockPackId,\n BlockPackIdNoVersion,\n blockPackIdNoVersionEquals,\n BlockPackManifest,\n BlockPackMetaEmbeddedBytes,\n BlockPackMetaManifest,\n BlockPackOverview,\n UpdateSuggestions,\n SingleBlockPackOverview,\n AnyChannel,\n BlockPackOverviewNoRegistryId\n} from '@milaboratories/pl-model-middle-layer';\nimport { FolderReader } from '../../io';\nimport canonicalize from 'canonicalize';\nimport {\n GlobalOverviewFileName,\n GlobalOverviewReg,\n MainPrefix,\n ManifestFileName,\n ManifestSuffix,\n packageContentPrefixInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\nimport semver from 'semver';\nimport { calculateSha256 } from '../../util';\nimport { retry, Retry2TimesWithDelay } from '@milaboratories/ts-helpers';\n\nexport type RegistryV2ReaderOps = {\n /** Number of milliseconds to cache retrieved block list for */\n cacheBlockListFor: number;\n /** Number of milliseconds to keep cached retrieved block list for, if new requests returns error */\n keepStaleBlockListFor: number;\n};\n\nconst DefaultRegistryV2ReaderOps: RegistryV2ReaderOps = {\n cacheBlockListFor: 45e3, // 45 seconds\n keepStaleBlockListFor: 300e3 // 5 minutes\n};\n\n/** @param availableVersions must be reverse sorted (from highest version to lowest) */\nexport function inferUpdateSuggestions(currentVersion: string, availableVersions: string[]) {\n const nextMinor = semver.inc(currentVersion, 'minor')!;\n const nextMajor = semver.inc(currentVersion, 'major')!;\n\n // first found = the highest (given the search criteria)\n\n const suggestions: UpdateSuggestions<string> = [];\n\n const patch = availableVersions.find(\n (v) => semver.gt(v, currentVersion) && semver.lt(v, nextMinor)\n );\n const minor = availableVersions.find((v) => semver.gte(v, nextMinor) && semver.lt(v, nextMajor));\n const major = availableVersions.find((v) => semver.gte(v, nextMajor));\n\n if (patch) suggestions.push({ type: 'patch', update: patch });\n if (minor) suggestions.push({ type: 'minor', update: minor });\n if (major) suggestions.push({ type: 'major', update: major });\n\n return suggestions;\n}\n\nexport class RegistryV2Reader {\n private readonly v2RootFolderReader: FolderReader;\n private readonly ops: RegistryV2ReaderOps;\n\n constructor(\n private readonly registryReader: FolderReader,\n ops?: Partial<RegistryV2ReaderOps>\n ) {\n this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);\n this.ops = { ...DefaultRegistryV2ReaderOps, ...(ops ?? {}) };\n }\n\n /**\n * Embeds meta infromation relative to registry root.\n * Meta information that looks like:\n *\n * */\n private readonly embeddedGlobalMetaCache = new LRUCache<\n string,\n BlockPackMetaEmbeddedBytes,\n { meta: BlockPackMetaManifest; relativeTo?: BlockPackId }\n >({\n max: 500,\n fetchMethod: async (_key, _staleValue, options) =>\n await retry(async () => {\n const contentReader =\n options.context.relativeTo !== undefined\n ? this.v2RootFolderReader\n .relativeReader(packageContentPrefixInsideV2(options.context.relativeTo))\n .getContentReader()\n : this.v2RootFolderReader.getContentReader();\n return await BlockPackMetaEmbedBytes(contentReader).parseAsync(options.context.meta);\n }, Retry2TimesWithDelay)\n });\n\n private async embedMetaContent(\n id: BlockPackId,\n sha256: string,\n absolutePath: boolean,\n meta: BlockPackMetaManifest\n ): Promise<BlockPackMetaEmbeddedBytes> {\n return await this.embeddedGlobalMetaCache.forceFetch(\n canonicalize({ id, sha256, absolutePath })!,\n { context: { meta, relativeTo: absolutePath ? undefined : id } }\n );\n }\n\n private listCacheTimestamp: number = 0;\n private listCache: BlockPackOverviewNoRegistryId[] | undefined = undefined;\n\n public async listBlockPacks(): Promise<BlockPackOverviewNoRegistryId[]> {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.cacheBlockListFor\n )\n return this.listCache;\n try {\n return await retry(async () => {\n // const rootContentReader = this.v2RootFolderReader.getContentReader();\n const globalOverview = GlobalOverviewReg.parse(\n JSON.parse(\n Buffer.from(await this.v2RootFolderReader.readFile(GlobalOverviewFileName)).toString()\n )\n );\n\n const result = await Promise.all(\n globalOverview.packages.map(async (p) => {\n const byChannelEntries = await Promise.all(\n Object.entries(p.latestByChannel).map(async ([channel, data]) => [\n channel,\n {\n id: data.description.id,\n meta: await this.embedMetaContent(\n data.description.id,\n data.manifestSha256,\n true,\n data.description.meta\n ),\n featureFlags: data.description.featureFlags,\n spec: {\n type: 'from-registry-v2',\n id: data.description.id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n }\n ])\n );\n return {\n id: p.id,\n latestByChannel: Object.fromEntries(byChannelEntries),\n allVersions: p.allVersionsWithChannels\n } satisfies BlockPackOverviewNoRegistryId;\n })\n );\n\n this.listCache = result;\n this.listCacheTimestamp = Date.now();\n\n return result;\n }, Retry2TimesWithDelay);\n } catch (e: unknown) {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.keepStaleBlockListFor\n )\n return this.listCache;\n throw e;\n }\n }\n\n public async getLatestOverview(\n id: BlockPackIdNoVersion,\n channel: string\n ): Promise<SingleBlockPackOverview | undefined> {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n return overview.latestByChannel[channel];\n }\n\n public async getUpdateSuggestions(\n id: BlockPackId,\n channel: string\n ): Promise<UpdateSuggestions<string> | undefined> {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n\n const versionCandidates = overview.allVersions\n .filter((v) => channel === AnyChannel || v.channels.indexOf(channel) >= 0)\n .map((v) => v.version);\n\n // versions are sorted\n versionCandidates.reverse(); // changing sorting order to opposite\n\n return inferUpdateSuggestions(id.version, versionCandidates);\n }\n\n public async getSpecificOverview(\n id: BlockPackId,\n channel: string\n ): Promise<SingleBlockPackOverview> {\n return await retry(async () => {\n const manifestContent = await this.v2RootFolderReader.readFile(\n packageContentPrefixInsideV2(id) + ManifestSuffix\n );\n const overview = BlockPackManifest.parse(JSON.parse(Buffer.from(manifestContent).toString()));\n return {\n id: id,\n meta: await this.embedMetaContent(\n id,\n await calculateSha256(manifestContent),\n false,\n overview.description.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n };\n }, Retry2TimesWithDelay);\n }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) =>\n await retry(async () => {\n const packageFolderReader = this.v2RootFolderReader.relativeReader(\n packageContentPrefixInsideV2(id)\n );\n const manifest = BlockPackManifest.parse(\n JSON.parse(Buffer.from(await packageFolderReader.readFile(ManifestFileName)).toString())\n );\n return BlockComponentsAbsoluteUrl(packageFolderReader.rootUrl.toString()).parse(\n manifest.description.components\n );\n }, Retry2TimesWithDelay)\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Dispatcher, request } from 'undici';\nimport { RelativeContentReader } from '../v2';\nimport path from 'node:path';\nimport pathPosix from 'node:path/posix';\nimport fsp from 'node:fs/promises';\nimport { defaultHttpDispatcher } from '@milaboratories/pl-http';\n\nexport interface FolderReader {\n readonly rootUrl: URL;\n relativeReader(relativePath: string): FolderReader;\n readFile(file: string): Promise<Buffer>;\n getContentReader(relativePath?: string): RelativeContentReader;\n}\n\nclass HttpFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly httpDispatcher: Dispatcher\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetUrl = new URL(file, this.rootUrl);\n const response = await request(targetUrl, {\n dispatcher: this.httpDispatcher\n });\n return Buffer.from(await response.body.arrayBuffer());\n }\n\n public relativeReader(relativePath: string): HttpFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new HttpFolderReader(new URL(relativePath, this.rootUrl), this.httpDispatcher);\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: HttpFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nclass FSFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly root: string\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetPath = path.join(this.root, ...file.split(pathPosix.sep));\n return await fsp.readFile(targetPath);\n }\n\n public relativeReader(relativePath: string): FSFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new FSFolderReader(\n new URL(relativePath, this.rootUrl),\n path.join(this.root, ...relativePath.split(pathPosix.sep))\n );\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: FSFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nfunction posixToLocalPath(p: string): string {\n return p.split(pathPosix.sep).join(path.sep);\n}\n\nfunction localToPosix(p: string): string {\n return p.split(path.sep).join(pathPosix.sep);\n}\n\nexport function folderReaderByUrl(address: string, httpDispatcher?: Dispatcher): FolderReader {\n if (!address.endsWith('/')) address = address + '/';\n const url = new URL(address, `file:${localToPosix(path.resolve('.'))}/`);\n switch (url.protocol) {\n case 'file:':\n const rootPath = posixToLocalPath(url.pathname);\n return new FSFolderReader(url, rootPath);\n case 'https:':\n case 'http:':\n return new HttpFolderReader(url, httpDispatcher ?? defaultHttpDispatcher());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","inferUpdateSuggestions","currentVersion","availableVersions","nextMinor","semver","nextMajor","suggestions","patch","v","minor","major","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","_key","_staleValue","options","retry","contentReader","packageContentPrefixInsideV2","BlockPackMetaEmbedBytes","Retry2TimesWithDelay","key","staleValue","id","packageFolderReader","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","sha256","absolutePath","meta","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","byChannelEntries","channel","data","overview","e","blockPackIdNoVersionEquals","versionCandidates","AnyChannel","manifestContent","ManifestSuffix","calculateSha256","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","defaultHttpDispatcher"],"mappings":"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"}
@@ -19,8 +19,8 @@ export declare const PlPackageConfigData: z.ZodObject<{
19
19
  [k: string]: unknown;
20
20
  };
21
21
  package: string;
22
- version?: string | undefined;
23
22
  files?: Record<string, string> | undefined;
23
+ version?: string | undefined;
24
24
  }>;
25
25
  export declare const PlRegCommonConfigData: z.ZodObject<{
26
26
  registries: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
@@ -36,9 +36,9 @@ export type PlRegCommonConfigData = z.infer<typeof PlRegCommonConfigData>;
36
36
  export declare const PlRegFullPackageConfigData: z.ZodObject<{
37
37
  organization: z.ZodString;
38
38
  meta: z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>;
39
+ files: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
39
40
  version: z.ZodString;
40
41
  registry: z.ZodString;
41
- files: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
42
42
  package: z.ZodString;
43
43
  registries: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
44
44
  }, "strip", z.ZodTypeAny, {
@@ -46,9 +46,9 @@ export declare const PlRegFullPackageConfigData: z.ZodObject<{
46
46
  meta: {} & {
47
47
  [k: string]: unknown;
48
48
  };
49
+ files: Record<string, string>;
49
50
  version: string;
50
51
  registry: string;
51
- files: Record<string, string>;
52
52
  package: string;
53
53
  registries: Record<string, string>;
54
54
  }, {
@@ -66,9 +66,9 @@ export type PlRegFullPackageConfigData = z.infer<typeof PlRegFullPackageConfigDa
66
66
  export declare const PlRegPackageConfigDataShard: z.ZodObject<{
67
67
  organization: z.ZodOptional<z.ZodString>;
68
68
  meta: z.ZodOptional<z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>>;
69
+ files: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
69
70
  version: z.ZodOptional<z.ZodString>;
70
71
  registry: z.ZodOptional<z.ZodString>;
71
- files: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
72
72
  package: z.ZodOptional<z.ZodString>;
73
73
  registries: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
74
74
  }, "strip", z.ZodTypeAny, {
@@ -82,9 +82,9 @@ export declare const PlRegPackageConfigDataShard: z.ZodObject<{
82
82
  }, {
83
83
  organization?: string | undefined;
84
84
  meta?: z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
85
+ files?: Record<string, string> | undefined;
85
86
  version?: string | undefined;
86
87
  registry?: string | undefined;
87
- files?: Record<string, string> | undefined;
88
88
  package?: string | undefined;
89
89
  registries?: Record<string, string> | undefined;
90
90
  }>;