@platforma-sdk/block-tools 2.4.5 → 2.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var f=Object.defineProperty;var u=(i,t,a)=>t in i?f(i,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[t]=a;var l=(i,t,a)=>u(i,typeof t!="symbol"?t+"":t,a);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./config-ClvGIy46.js"),h=require("undici"),n=require("node:path"),c=require("node:path/posix"),B=require("node:fs/promises"),d=require("@milaboratories/pl-model-middle-layer"),g=require("canonicalize");require("zod");require("mime-types");require("tar");require("@milaboratories/resolve-helper");const v=require("lru-cache"),C={cacheBlockListFor:45e3,keepStaleBlockListFor:3e5};class m{constructor(t,a){l(this,"v2RootFolderReader");l(this,"ops");l(this,"embeddedGlobalMetaCache",new v.LRUCache({max:500,fetchMethod:async(t,a,o)=>{const r=o.context.relativeTo!==void 0?this.v2RootFolderReader.relativeReader(e.packageContentPrefixInsideV2(o.context.relativeTo)).getContentReader():this.v2RootFolderReader.getContentReader();return await e.BlockPackMetaEmbedBytes(r).parseAsync(o.context.meta)}}));l(this,"listCacheTimestamp",0);l(this,"listCache");l(this,"componentsCache",new v.LRUCache({max:500,fetchMethod:async(t,a,{context:o})=>{const r=this.v2RootFolderReader.relativeReader(e.packageContentPrefixInsideV2(o)),s=d.BlockPackManifest.parse(JSON.parse(Buffer.from(await r.readFile(e.ManifestFileName)).toString()));return e.BlockComponentsAbsoluteUrl(r.rootUrl.toString()).parse(s.description.components)}}));this.registryReader=t,this.v2RootFolderReader=t.relativeReader(e.MainPrefix),this.ops={...C,...a??{}}}async embedMetaContent(t,a,o,r){return await this.embeddedGlobalMetaCache.forceFetch(g({id:t,sha256:a,absolutePath:o}),{context:{meta:r,relativeTo:o?void 0:t}})}async listBlockPacks(){if(this.listCache!==void 0&&Date.now()-this.listCacheTimestamp<=this.ops.cacheBlockListFor)return this.listCache;try{const t=e.GlobalOverviewReg.parse(JSON.parse(Buffer.from(await this.v2RootFolderReader.readFile(e.GlobalOverviewFileName)).toString())),a=await Promise.all(t.packages.map(async o=>{const r=await Promise.all(Object.entries(o.latestByChannel).map(async([s,P])=>[s,{id:P.description.id,meta:await this.embedMetaContent(o.latest.id,o.latestManifestSha256,!0,o.latest.meta),spec:{type:"from-registry-v2",id:o.latest.id,registryUrl:this.registryReader.rootUrl.toString(),channel:s}}]));return{id:o.id,latestByChannel:Object.fromEntries(r),allVersions:o.allVersionsWithChannels}}));return this.listCache=a,this.listCacheTimestamp=Date.now(),a}catch(t){if(this.listCache!==void 0&&Date.now()-this.listCacheTimestamp<=this.ops.keepStaleBlockListFor)return this.listCache;throw t}}async getLatestOverview(t,a){const o=(await this.listBlockPacks()).find(r=>d.blockPackIdNoVersionEquals(t,r.id));if(o!==void 0)return o.latestByChannel[a]}async getSpecificOverview(t){const a=await this.v2RootFolderReader.readFile(e.packageOverviewPathInsideV2(t)),o=d.BlockPackManifest.parse(JSON.parse(Buffer.from(a).toString()));return{id:t,meta:await this.embedMetaContent(t,await e.calculateSha256(a),!1,o.description.meta),spec:{type:"from-registry-v2",id:t,registryUrl:this.registryReader.rootUrl.toString()}}}async getComponents(t){return await this.componentsCache.forceFetch(g(t),{context:t})}}class p{constructor(t,a){this.rootUrl=t,this.httpDispatcher=a}async readFile(t){const a=new URL(t,this.rootUrl),o=await h.request(a,{dispatcher:this.httpDispatcher});return Buffer.from(await o.body.arrayBuffer())}relativeReader(t){return t.endsWith("/")||(t=t+"/"),new p(new URL(t,this.rootUrl),this.httpDispatcher)}getContentReader(t){let a=this;return t!==void 0&&(a=a.relativeReader(t)),o=>a.readFile(o)}}class k{constructor(t,a){this.rootUrl=t,this.root=a}async readFile(t){const a=n.join(this.root,...t.split(c.sep));return await B.readFile(a)}relativeReader(t){return t.endsWith("/")||(t=t+"/"),new k(new URL(t,this.rootUrl),n.join(this.root,...t.split(c.sep)))}getContentReader(t){let a=this;return t!==void 0&&(a=a.relativeReader(t)),o=>a.readFile(o)}}function w(i){return i.split(c.sep).join(n.sep)}function y(i){return i.split(n.sep).join(c.sep)}function R(i,t){i.endsWith("/")||(i=i+"/");const a=new URL(i,`file:${y(n.resolve("."))}/`);switch(a.protocol){case"file:":const o=w(a.pathname);return new k(a,o);case"https:":case"http:":return new p(a,t??new h.Agent);default:throw new Error(`Unknown protocol: ${a.protocol}`)}}const b=Object.freeze(Object.defineProperty({__proto__:null,GlobalOverviewPath:e.GlobalOverviewPath,MetaFile:e.MetaFile,PlPackageConfigData:e.PlPackageConfigData,PlPackageJsonConfigFile:e.PlPackageJsonConfigFile,PlPackageYamlConfigFile:e.PlPackageYamlConfigFile,PlRegCommonConfigData:e.PlRegCommonConfigData,PlRegFullPackageConfigData:e.PlRegFullPackageConfigData,PlRegPackageConfig:e.PlRegPackageConfig,PlRegPackageConfigDataShard:e.PlRegPackageConfigDataShard,packageContentPrefix:e.packageContentPrefix,packageOverviewPath:e.packageOverviewPath,payloadFilePath:e.payloadFilePath},Symbol.toStringTag,{value:"Module"}));exports.BlockComponentsAbsoluteUrl=e.BlockComponentsAbsoluteUrl;exports.BlockComponentsConsolidate=e.BlockComponentsConsolidate;exports.BlockComponentsDescription=e.BlockComponentsDescription;exports.BlockDescriptionPackageJsonField=e.BlockDescriptionPackageJsonField;exports.BlockDescriptionToExplicitBinaryBytes=e.BlockDescriptionToExplicitBinaryBytes;exports.BlockPackDescriptionConsolidateToFolder=e.BlockPackDescriptionConsolidateToFolder;exports.BlockPackDescriptionManifestAddRelativePathPrefix=e.BlockPackDescriptionManifestAddRelativePathPrefix;exports.BlockPackMetaConsolidate=e.BlockPackMetaConsolidate;exports.BlockPackMetaDescription=e.BlockPackMetaDescription;exports.BlockPackMetaEmbedAbsoluteBase64=e.BlockPackMetaEmbedAbsoluteBase64;exports.BlockPackMetaEmbedAbsoluteBytes=e.BlockPackMetaEmbedAbsoluteBytes;exports.BlockPackMetaEmbedBytes=e.BlockPackMetaEmbedBytes;exports.BlockRegistryV2=e.BlockRegistryV2;exports.ChannelNameRegexp=e.ChannelNameRegexp;exports.ChannelsFolder=e.ChannelsFolder;exports.FSStorage=e.FSStorage;exports.GlobalOverview=e.GlobalOverview;exports.GlobalOverviewEntry=e.GlobalOverviewEntry;exports.GlobalOverviewEntryReg=e.GlobalOverviewEntryReg;exports.GlobalOverviewFileName=e.GlobalOverviewFileName;exports.GlobalOverviewPath=e.GlobalOverviewPath$1;exports.GlobalOverviewReg=e.GlobalOverviewReg;exports.GlobalOverviewToExplicitBinaryBase64=e.GlobalOverviewToExplicitBinaryBase64;exports.GlobalOverviewToExplicitBinaryBytes=e.GlobalOverviewToExplicitBinaryBytes;exports.MainPrefix=e.MainPrefix;exports.ManifestFileName=e.ManifestFileName;exports.ManifestSuffix=e.ManifestSuffix;exports.PackageOverview=e.PackageOverview;exports.PackageOverviewFileName=e.PackageOverviewFileName;exports.PackageOverviewVersionEntry=e.PackageOverviewVersionEntry;exports.ResolvedBlockPackDescriptionFromPackageJson=e.ResolvedBlockPackDescriptionFromPackageJson;exports.ResolvedModuleFile=e.ResolvedModuleFile;exports.ResolvedModuleFolder=e.ResolvedModuleFolder;exports.S3Storage=e.S3Storage;exports.absoluteToBase64=e.absoluteToBase64;exports.absoluteToBytes=e.absoluteToBytes;exports.absoluteToString=e.absoluteToString;exports.buildBlockPackDist=e.buildBlockPackDist;exports.cpAbsoluteToRelative=e.cpAbsoluteToRelative;exports.loadPackDescription=e.loadPackDescription;exports.loadPackDescriptionRaw=e.loadPackDescriptionRaw;exports.mapLocalToAbsolute=e.mapLocalToAbsolute;exports.packFolderToRelativeTgz=e.packFolderToRelativeTgz;exports.packageChannelPrefix=e.packageChannelPrefix;exports.packageChannelPrefixInsideV2=e.packageChannelPrefixInsideV2;exports.packageContentPrefix=e.packageContentPrefix$1;exports.packageContentPrefixInsideV2=e.packageContentPrefixInsideV2;exports.packageOverviewPath=e.packageOverviewPath$1;exports.packageOverviewPathInsideV2=e.packageOverviewPathInsideV2;exports.parsePackageName=e.parsePackageName;exports.relativeToContentString=e.relativeToContentString;exports.relativeToExplicitBinary64=e.relativeToExplicitBinary64;exports.relativeToExplicitBytes=e.relativeToExplicitBytes;exports.relativeToExplicitString=e.relativeToExplicitString;exports.storageByUrl=e.storageByUrl;exports.tryLoadPackDescription=e.tryLoadPackDescription;exports.RegistryV1=b;exports.RegistryV2Reader=m;exports.folderReaderByUrl=R;
1
+ "use strict";var f=Object.defineProperty;var u=(i,t,a)=>t in i?f(i,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[t]=a;var l=(i,t,a)=>u(i,typeof t!="symbol"?t+"":t,a);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./config-ClvGIy46.js"),h=require("undici"),n=require("node:path"),c=require("node:path/posix"),B=require("node:fs/promises"),d=require("@milaboratories/pl-model-middle-layer"),g=require("canonicalize");require("zod");require("mime-types");require("tar");require("@milaboratories/resolve-helper");const v=require("lru-cache"),C={cacheBlockListFor:45e3,keepStaleBlockListFor:3e5};class m{constructor(t,a){l(this,"v2RootFolderReader");l(this,"ops");l(this,"embeddedGlobalMetaCache",new v.LRUCache({max:500,fetchMethod:async(t,a,o)=>{const r=o.context.relativeTo!==void 0?this.v2RootFolderReader.relativeReader(e.packageContentPrefixInsideV2(o.context.relativeTo)).getContentReader():this.v2RootFolderReader.getContentReader();return await e.BlockPackMetaEmbedBytes(r).parseAsync(o.context.meta)}}));l(this,"listCacheTimestamp",0);l(this,"listCache");l(this,"componentsCache",new v.LRUCache({max:500,fetchMethod:async(t,a,{context:o})=>{const r=this.v2RootFolderReader.relativeReader(e.packageContentPrefixInsideV2(o)),s=d.BlockPackManifest.parse(JSON.parse(Buffer.from(await r.readFile(e.ManifestFileName)).toString()));return e.BlockComponentsAbsoluteUrl(r.rootUrl.toString()).parse(s.description.components)}}));this.registryReader=t,this.v2RootFolderReader=t.relativeReader(e.MainPrefix),this.ops={...C,...a??{}}}async embedMetaContent(t,a,o,r){return await this.embeddedGlobalMetaCache.forceFetch(g({id:t,sha256:a,absolutePath:o}),{context:{meta:r,relativeTo:o?void 0:t}})}async listBlockPacks(){if(this.listCache!==void 0&&Date.now()-this.listCacheTimestamp<=this.ops.cacheBlockListFor)return this.listCache;try{const t=e.GlobalOverviewReg.parse(JSON.parse(Buffer.from(await this.v2RootFolderReader.readFile(e.GlobalOverviewFileName)).toString())),a=await Promise.all(t.packages.map(async o=>{const r=await Promise.all(Object.entries(o.latestByChannel).map(async([s,P])=>[s,{id:P.description.id,meta:await this.embedMetaContent(o.latest.id,o.latestManifestSha256,!0,o.latest.meta),spec:{type:"from-registry-v2",id:o.latest.id,registryUrl:this.registryReader.rootUrl.toString(),channel:s}}]));return{id:o.id,latestByChannel:Object.fromEntries(r),allVersions:o.allVersionsWithChannels}}));return this.listCache=a,this.listCacheTimestamp=Date.now(),a}catch(t){if(this.listCache!==void 0&&Date.now()-this.listCacheTimestamp<=this.ops.keepStaleBlockListFor)return this.listCache;throw t}}async getLatestOverview(t,a){const o=(await this.listBlockPacks()).find(r=>d.blockPackIdNoVersionEquals(t,r.id));if(o!==void 0)return o.latestByChannel[a]}async getSpecificOverview(t,a){const o=await this.v2RootFolderReader.readFile(e.packageContentPrefixInsideV2(t)+e.ManifestSuffix),r=d.BlockPackManifest.parse(JSON.parse(Buffer.from(o).toString()));return{id:t,meta:await this.embedMetaContent(t,await e.calculateSha256(o),!1,r.description.meta),spec:{type:"from-registry-v2",id:t,registryUrl:this.registryReader.rootUrl.toString(),channel:a}}}async getComponents(t){return await this.componentsCache.forceFetch(g(t),{context:t})}}class p{constructor(t,a){this.rootUrl=t,this.httpDispatcher=a}async readFile(t){const a=new URL(t,this.rootUrl),o=await h.request(a,{dispatcher:this.httpDispatcher});return Buffer.from(await o.body.arrayBuffer())}relativeReader(t){return t.endsWith("/")||(t=t+"/"),new p(new URL(t,this.rootUrl),this.httpDispatcher)}getContentReader(t){let a=this;return t!==void 0&&(a=a.relativeReader(t)),o=>a.readFile(o)}}class k{constructor(t,a){this.rootUrl=t,this.root=a}async readFile(t){const a=n.join(this.root,...t.split(c.sep));return await B.readFile(a)}relativeReader(t){return t.endsWith("/")||(t=t+"/"),new k(new URL(t,this.rootUrl),n.join(this.root,...t.split(c.sep)))}getContentReader(t){let a=this;return t!==void 0&&(a=a.relativeReader(t)),o=>a.readFile(o)}}function y(i){return i.split(c.sep).join(n.sep)}function R(i){return i.split(n.sep).join(c.sep)}function w(i,t){i.endsWith("/")||(i=i+"/");const a=new URL(i,`file:${R(n.resolve("."))}/`);switch(a.protocol){case"file:":const o=y(a.pathname);return new k(a,o);case"https:":case"http:":return new p(a,t??new h.Agent);default:throw new Error(`Unknown protocol: ${a.protocol}`)}}const b=Object.freeze(Object.defineProperty({__proto__:null,GlobalOverviewPath:e.GlobalOverviewPath,MetaFile:e.MetaFile,PlPackageConfigData:e.PlPackageConfigData,PlPackageJsonConfigFile:e.PlPackageJsonConfigFile,PlPackageYamlConfigFile:e.PlPackageYamlConfigFile,PlRegCommonConfigData:e.PlRegCommonConfigData,PlRegFullPackageConfigData:e.PlRegFullPackageConfigData,PlRegPackageConfig:e.PlRegPackageConfig,PlRegPackageConfigDataShard:e.PlRegPackageConfigDataShard,packageContentPrefix:e.packageContentPrefix,packageOverviewPath:e.packageOverviewPath,payloadFilePath:e.payloadFilePath},Symbol.toStringTag,{value:"Module"}));exports.BlockComponentsAbsoluteUrl=e.BlockComponentsAbsoluteUrl;exports.BlockComponentsConsolidate=e.BlockComponentsConsolidate;exports.BlockComponentsDescription=e.BlockComponentsDescription;exports.BlockDescriptionPackageJsonField=e.BlockDescriptionPackageJsonField;exports.BlockDescriptionToExplicitBinaryBytes=e.BlockDescriptionToExplicitBinaryBytes;exports.BlockPackDescriptionConsolidateToFolder=e.BlockPackDescriptionConsolidateToFolder;exports.BlockPackDescriptionManifestAddRelativePathPrefix=e.BlockPackDescriptionManifestAddRelativePathPrefix;exports.BlockPackMetaConsolidate=e.BlockPackMetaConsolidate;exports.BlockPackMetaDescription=e.BlockPackMetaDescription;exports.BlockPackMetaEmbedAbsoluteBase64=e.BlockPackMetaEmbedAbsoluteBase64;exports.BlockPackMetaEmbedAbsoluteBytes=e.BlockPackMetaEmbedAbsoluteBytes;exports.BlockPackMetaEmbedBytes=e.BlockPackMetaEmbedBytes;exports.BlockRegistryV2=e.BlockRegistryV2;exports.ChannelNameRegexp=e.ChannelNameRegexp;exports.ChannelsFolder=e.ChannelsFolder;exports.FSStorage=e.FSStorage;exports.GlobalOverview=e.GlobalOverview;exports.GlobalOverviewEntry=e.GlobalOverviewEntry;exports.GlobalOverviewEntryReg=e.GlobalOverviewEntryReg;exports.GlobalOverviewFileName=e.GlobalOverviewFileName;exports.GlobalOverviewPath=e.GlobalOverviewPath$1;exports.GlobalOverviewReg=e.GlobalOverviewReg;exports.GlobalOverviewToExplicitBinaryBase64=e.GlobalOverviewToExplicitBinaryBase64;exports.GlobalOverviewToExplicitBinaryBytes=e.GlobalOverviewToExplicitBinaryBytes;exports.MainPrefix=e.MainPrefix;exports.ManifestFileName=e.ManifestFileName;exports.ManifestSuffix=e.ManifestSuffix;exports.PackageOverview=e.PackageOverview;exports.PackageOverviewFileName=e.PackageOverviewFileName;exports.PackageOverviewVersionEntry=e.PackageOverviewVersionEntry;exports.ResolvedBlockPackDescriptionFromPackageJson=e.ResolvedBlockPackDescriptionFromPackageJson;exports.ResolvedModuleFile=e.ResolvedModuleFile;exports.ResolvedModuleFolder=e.ResolvedModuleFolder;exports.S3Storage=e.S3Storage;exports.absoluteToBase64=e.absoluteToBase64;exports.absoluteToBytes=e.absoluteToBytes;exports.absoluteToString=e.absoluteToString;exports.buildBlockPackDist=e.buildBlockPackDist;exports.cpAbsoluteToRelative=e.cpAbsoluteToRelative;exports.loadPackDescription=e.loadPackDescription;exports.loadPackDescriptionRaw=e.loadPackDescriptionRaw;exports.mapLocalToAbsolute=e.mapLocalToAbsolute;exports.packFolderToRelativeTgz=e.packFolderToRelativeTgz;exports.packageChannelPrefix=e.packageChannelPrefix;exports.packageChannelPrefixInsideV2=e.packageChannelPrefixInsideV2;exports.packageContentPrefix=e.packageContentPrefix$1;exports.packageContentPrefixInsideV2=e.packageContentPrefixInsideV2;exports.packageOverviewPath=e.packageOverviewPath$1;exports.packageOverviewPathInsideV2=e.packageOverviewPathInsideV2;exports.parsePackageName=e.parsePackageName;exports.relativeToContentString=e.relativeToContentString;exports.relativeToExplicitBinary64=e.relativeToExplicitBinary64;exports.relativeToExplicitBytes=e.relativeToExplicitBytes;exports.relativeToExplicitString=e.relativeToExplicitString;exports.storageByUrl=e.storageByUrl;exports.tryLoadPackDescription=e.tryLoadPackDescription;exports.RegistryV1=b;exports.RegistryV2Reader=m;exports.folderReaderByUrl=w;
2
2
  //# sourceMappingURL=index.js.map
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 SingleBlockPackOverview\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 packageContentPrefixInsideV2,\n packageOverviewPathInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\nimport { calculateSha256 } from '../../util';\n\nexport type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;\nexport type SingleBlockPackOverviewNoRegLabel = Omit<SingleBlockPackOverview, '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\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 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 }\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 // 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 p.latest.id,\n p.latestManifestSha256,\n true,\n p.latest.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id: p.latest.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 } 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<SingleBlockPackOverviewNoRegLabel | 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 getSpecificOverview(id: BlockPackId): Promise<SingleBlockPackOverviewNoRegLabel> {\n const overviewContent = await this.v2RootFolderReader.readFile(packageOverviewPathInsideV2(id));\n const overview = BlockPackManifest.parse(JSON.parse(Buffer.from(overviewContent).toString()));\n return {\n id: id,\n meta: await this.embedMetaContent(\n id,\n await calculateSha256(overviewContent),\n false,\n overview.description.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id,\n registryUrl: this.registryReader.rootUrl.toString()\n }\n };\n }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) => {\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 }\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Agent, 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';\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 ?? new Agent());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","_key","_staleValue","options","contentReader","packageContentPrefixInsideV2","BlockPackMetaEmbedBytes","key","staleValue","id","packageFolderReader","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","sha256","absolutePath","meta","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","byChannelEntries","channel","data","e","overview","blockPackIdNoVersionEquals","overviewContent","packageOverviewPathInsideV2","calculateSha256","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","Agent"],"mappings":"0kBAkCMA,EAAkD,CACtD,kBAAmB,KACnB,sBAAuB,GACzB,EAEO,MAAMC,CAAiB,CAI5B,YACmBC,EACjBC,EACA,CANeC,EAAA,2BACAA,EAAA,YAeAA,EAAA,+BAA0B,IAAIC,EAAAA,SAI7C,CACA,IAAK,IACL,YAAa,MAAOC,EAAMC,EAAaC,IAAY,CACjD,MAAMC,EACJD,EAAQ,QAAQ,aAAe,OAC3B,KAAK,mBACF,eAAeE,EAAA,6BAA6BF,EAAQ,QAAQ,UAAU,CAAC,EACvE,mBACH,KAAK,mBAAmB,iBAAiB,EAC/C,OAAO,MAAMG,EAAwB,wBAAAF,CAAa,EAAE,WAAWD,EAAQ,QAAQ,IAAI,CAAA,CACrF,CACD,GAcOJ,EAAA,0BAA6B,GAC7BA,EAAA,kBA0FSA,EAAA,uBAAkB,IAAIC,EAAAA,SAA0D,CAC/F,IAAK,IACL,YAAa,MAAOO,EAAKC,EAAY,CAAE,QAASC,KAAS,CACjD,MAAAC,EAAsB,KAAK,mBAAmB,eAClDL,EAAAA,6BAA6BI,CAAE,CACjC,EACME,EAAWC,EAAAA,kBAAkB,MACjC,KAAK,MAAM,OAAO,KAAK,MAAMF,EAAoB,SAASG,EAAAA,gBAAgB,CAAC,EAAE,SAAU,CAAA,CACzF,EACA,OAAOC,EAA2B,2BAAAJ,EAAoB,QAAQ,SAAA,CAAU,EAAE,MACxEC,EAAS,YAAY,UACvB,CAAA,CACF,CACD,GAjJkB,KAAA,eAAAd,EAGZ,KAAA,mBAAqBA,EAAe,eAAekB,EAAAA,UAAU,EAClE,KAAK,IAAM,CAAE,GAAGpB,EAA4B,GAAIG,GAAO,CAAA,CAAI,CAAA,CAyB7D,MAAc,iBACZW,EACAO,EACAC,EACAC,EACqC,CAC9B,OAAA,MAAM,KAAK,wBAAwB,WACxCC,EAAa,CAAE,GAAAV,EAAI,OAAAO,EAAQ,aAAAC,EAAc,EACzC,CAAE,QAAS,CAAE,KAAAC,EAAM,WAAYD,EAAe,OAAYR,CAAK,CAAA,CACjE,CAAA,CAMF,MAAa,gBAAyD,CAElE,GAAA,KAAK,YAAc,QACnB,KAAK,IAAQ,EAAA,KAAK,oBAAsB,KAAK,IAAI,kBAEjD,OAAO,KAAK,UACV,GAAA,CAEF,MAAMW,EAAiBC,EAAAA,kBAAkB,MACvC,KAAK,MACH,OAAO,KAAK,MAAM,KAAK,mBAAmB,SAASC,EAAAA,sBAAsB,CAAC,EAAE,SAAS,CAAA,CAEzF,EAEMC,EAAS,MAAM,QAAQ,IAC3BH,EAAe,SAAS,IAAI,MAAOI,GAAM,CACjC,MAAAC,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,iBACfH,EAAE,OAAO,GACTA,EAAE,qBACF,GACAA,EAAE,OAAO,IACX,EACA,KAAM,CACJ,KAAM,mBACN,GAAIA,EAAE,OAAO,GACb,YAAa,KAAK,eAAe,QAAQ,SAAS,EAClD,QAAAE,CAAA,CACF,CAEH,CAAA,CACH,EACO,MAAA,CACL,GAAIF,EAAE,GACN,gBAAiB,OAAO,YAAYC,CAAgB,EACpD,YAAaD,EAAE,uBACjB,CACD,CAAA,CACH,EAEA,YAAK,UAAYD,EACZ,KAAA,mBAAqB,KAAK,IAAI,EAE5BA,QACAK,EAAY,CAEjB,GAAA,KAAK,YAAc,QACnB,KAAK,IAAQ,EAAA,KAAK,oBAAsB,KAAK,IAAI,sBAEjD,OAAO,KAAK,UACR,MAAAA,CAAA,CACR,CAGF,MAAa,kBACXnB,EACAiB,EACwD,CACxD,MAAMG,GAAY,MAAM,KAAK,eAAkB,GAAA,KAAMD,GACnDE,EAAAA,2BAA2BrB,EAAImB,EAAE,EAAE,CACrC,EACI,GAAAC,IAAa,OACV,OAAAA,EAAS,gBAAgBH,CAAO,CAAA,CAGzC,MAAa,oBAAoBjB,EAA6D,CAC5F,MAAMsB,EAAkB,MAAM,KAAK,mBAAmB,SAASC,EAAAA,4BAA4BvB,CAAE,CAAC,EACxFoB,EAAWjB,EAAAA,kBAAkB,MAAM,KAAK,MAAM,OAAO,KAAKmB,CAAe,EAAE,SAAU,CAAA,CAAC,EACrF,MAAA,CACL,GAAAtB,EACA,KAAM,MAAM,KAAK,iBACfA,EACA,MAAMwB,EAAAA,gBAAgBF,CAAe,EACrC,GACAF,EAAS,YAAY,IACvB,EACA,KAAM,CACJ,KAAM,mBACN,GAAApB,EACA,YAAa,KAAK,eAAe,QAAQ,SAAS,CAAA,CAEtD,CAAA,CAkBF,MAAa,cAAcA,EAAsD,CACxE,OAAA,MAAM,KAAK,gBAAgB,WAAWU,EAAaV,CAAE,EAAI,CAAE,QAASA,EAAI,CAAA,CAEnF,CCrLA,MAAMyB,CAAyC,CAC7C,YACkBC,EACCC,EACjB,CAFgB,KAAA,QAAAD,EACC,KAAA,eAAAC,CAAA,CAGnB,MAAa,SAASC,EAA+B,CACnD,MAAMC,EAAY,IAAI,IAAID,EAAM,KAAK,OAAO,EACtCE,EAAW,MAAMC,EAAA,QAAQF,EAAW,CACxC,WAAY,KAAK,cAAA,CAClB,EACD,OAAO,OAAO,KAAK,MAAMC,EAAS,KAAK,aAAa,CAAA,CAG/C,eAAeE,EAAwC,CAC5D,OAAKA,EAAa,SAAS,GAAG,MAAkBA,EAAe,KACxD,IAAIP,EAAiB,IAAI,IAAIO,EAAc,KAAK,OAAO,EAAG,KAAK,cAAc,CAAA,CAG/E,iBAAiBA,EAA8C,CACpE,IAAIC,EAA2B,KAC/B,OAAID,IAAiB,SAAoBC,EAAAA,EAAO,eAAeD,CAAY,GACnEE,GAASD,EAAO,SAASC,CAAI,CAAA,CAEzC,CAEA,MAAMC,CAAuC,CAC3C,YACkBT,EACCU,EACjB,CAFgB,KAAA,QAAAV,EACC,KAAA,KAAAU,CAAA,CAGnB,MAAa,SAASR,EAA+B,CAC7C,MAAAS,EAAaH,EAAK,KAAK,KAAK,KAAM,GAAGN,EAAK,MAAMU,EAAU,GAAG,CAAC,EAC7D,OAAA,MAAMC,EAAI,SAASF,CAAU,CAAA,CAG/B,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,CAC3D,CAAA,CAGK,iBAAiBN,EAA8C,CACpE,IAAIC,EAAyB,KAC7B,OAAID,IAAiB,SAAoBC,EAAAA,EAAO,eAAeD,CAAY,GACnEE,GAASD,EAAO,SAASC,CAAI,CAAA,CAEzC,CAEA,SAASM,EAAiBzB,EAAmB,CAC3C,OAAOA,EAAE,MAAMuB,EAAU,GAAG,EAAE,KAAKJ,EAAK,GAAG,CAC7C,CAEA,SAASO,EAAa1B,EAAmB,CACvC,OAAOA,EAAE,MAAMmB,EAAK,GAAG,EAAE,KAAKI,EAAU,GAAG,CAC7C,CAEgB,SAAAI,EAAkBC,EAAiBhB,EAA2C,CACvFgB,EAAQ,SAAS,GAAG,MAAaA,EAAU,KAC1C,MAAAC,EAAM,IAAI,IAAID,EAAS,QAAQF,EAAaP,EAAK,QAAQ,GAAG,CAAC,CAAC,GAAG,EACvE,OAAQU,EAAI,SAAU,CACpB,IAAK,QACG,MAAAC,EAAWL,EAAiBI,EAAI,QAAQ,EACvC,OAAA,IAAIT,EAAeS,EAAKC,CAAQ,EACzC,IAAK,SACL,IAAK,QACH,OAAO,IAAIpB,EAAiBmB,EAAKjB,GAAkB,IAAImB,OAAO,EAChE,QACE,MAAM,IAAI,MAAM,qBAAqBF,EAAI,QAAQ,EAAE,CAAA,CAEzD"}
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 SingleBlockPackOverview\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 packageOverviewPathInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\nimport { calculateSha256 } from '../../util';\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\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 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 }\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 // 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 p.latest.id,\n p.latestManifestSha256,\n true,\n p.latest.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id: p.latest.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 } 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 getSpecificOverview(\n id: BlockPackId,\n channel: string\n ): Promise<SingleBlockPackOverview> {\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 }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) => {\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 }\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Agent, 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';\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 ?? new Agent());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","_key","_staleValue","options","contentReader","packageContentPrefixInsideV2","BlockPackMetaEmbedBytes","key","staleValue","id","packageFolderReader","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","sha256","absolutePath","meta","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","byChannelEntries","channel","data","e","overview","blockPackIdNoVersionEquals","manifestContent","ManifestSuffix","calculateSha256","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","Agent"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
- var g = Object.defineProperty;
2
- var k = (o, e, a) => e in o ? g(o, e, { enumerable: !0, configurable: !0, writable: !0, value: a }) : o[e] = a;
1
+ var v = Object.defineProperty;
2
+ var k = (o, e, a) => e in o ? v(o, e, { enumerable: !0, configurable: !0, writable: !0, value: a }) : o[e] = a;
3
3
  var r = (o, e, a) => k(o, typeof e != "symbol" ? e + "" : e, a);
4
- import { e as u, p as d, f as w, G as R, h as y, i as C, j as P, M as B, k as F, m as b, n as x, o as O, q as S, r as T, t as D, u as M, v as U, P as E, w as L, x as V, y as G } from "./config-MTiP2z4I.mjs";
5
- import { U as ce, T as pe, Y as de, ad as he, W as fe, X as me, O as ve, a as ge, B as ke, Q as ue, b as we, a1 as Re, a0 as ye, F as Ce, ac as Pe, aa as Be, ab as Fe, a9 as be, af as xe, ae as Oe, a3 as Se, a5 as Te, $ as De, a4 as Me, V as Ue, R as Ee, z as Le, S as Ve, D as Ge, E as Ne, C as je, d as Ae, H as Je, c as Ie, l as We, A as _e, I as ze, a8 as qe, a7 as $e, a2 as Ye, a6 as He, Z as Ke, K as Qe, L as Xe, N as Ze, J as ea, s as aa, _ as ta } from "./config-MTiP2z4I.mjs";
4
+ import { e as u, p as c, f as w, G as R, h as y, i as C, j as P, M as B, k as F, m as b, n as x, o as O, q as S, r as T, t as D, u as M, v as U, P as E, w as L, x as V, y as G } from "./config-dqDSqXfz.mjs";
5
+ import { U as ce, T as pe, Y as de, ad as he, W as fe, X as me, O as ge, a as ve, B as ke, Q as ue, b as we, a1 as Re, a0 as ye, F as Ce, ac as Pe, aa as Be, ab as Fe, a9 as be, af as xe, ae as Oe, a4 as Se, $ as Te, a3 as De, V as Me, R as Ue, z as Ee, S as Le, D as Ve, E as Ge, C as Ne, d as je, H as Ae, c as Je, l as Ie, A as We, I as _e, a8 as ze, a7 as qe, a2 as $e, a6 as Ye, a5 as He, Z as Ke, K as Qe, L as Xe, N as Ze, J as ea, s as aa, _ as ta } from "./config-dqDSqXfz.mjs";
6
6
  import { Agent as N, request as j } from "undici";
7
7
  import i from "node:path";
8
8
  import l from "node:path/posix";
@@ -32,7 +32,7 @@ class se {
32
32
  r(this, "embeddedGlobalMetaCache", new m({
33
33
  max: 500,
34
34
  fetchMethod: async (e, a, t) => {
35
- const s = t.context.relativeTo !== void 0 ? this.v2RootFolderReader.relativeReader(d(t.context.relativeTo)).getContentReader() : this.v2RootFolderReader.getContentReader();
35
+ const s = t.context.relativeTo !== void 0 ? this.v2RootFolderReader.relativeReader(c(t.context.relativeTo)).getContentReader() : this.v2RootFolderReader.getContentReader();
36
36
  return await w(s).parseAsync(t.context.meta);
37
37
  }
38
38
  }));
@@ -42,7 +42,7 @@ class se {
42
42
  max: 500,
43
43
  fetchMethod: async (e, a, { context: t }) => {
44
44
  const s = this.v2RootFolderReader.relativeReader(
45
- d(t)
45
+ c(t)
46
46
  ), n = h.parse(
47
47
  JSON.parse(Buffer.from(await s.readFile(B)).toString())
48
48
  );
@@ -70,10 +70,10 @@ class se {
70
70
  ), a = await Promise.all(
71
71
  e.packages.map(async (t) => {
72
72
  const s = await Promise.all(
73
- Object.entries(t.latestByChannel).map(async ([n, v]) => [
73
+ Object.entries(t.latestByChannel).map(async ([n, g]) => [
74
74
  n,
75
75
  {
76
- id: v.description.id,
76
+ id: g.description.id,
77
77
  meta: await this.embedMetaContent(
78
78
  t.latest.id,
79
79
  t.latestManifestSha256,
@@ -110,20 +110,23 @@ class se {
110
110
  if (t !== void 0)
111
111
  return t.latestByChannel[a];
112
112
  }
113
- async getSpecificOverview(e) {
114
- const a = await this.v2RootFolderReader.readFile(C(e)), t = h.parse(JSON.parse(Buffer.from(a).toString()));
113
+ async getSpecificOverview(e, a) {
114
+ const t = await this.v2RootFolderReader.readFile(
115
+ c(e) + C
116
+ ), s = h.parse(JSON.parse(Buffer.from(t).toString()));
115
117
  return {
116
118
  id: e,
117
119
  meta: await this.embedMetaContent(
118
120
  e,
119
- await P(a),
121
+ await P(t),
120
122
  !1,
121
- t.description.meta
123
+ s.description.meta
122
124
  ),
123
125
  spec: {
124
126
  type: "from-registry-v2",
125
127
  id: e,
126
- registryUrl: this.registryReader.rootUrl.toString()
128
+ registryUrl: this.registryReader.rootUrl.toString(),
129
+ channel: a
127
130
  }
128
131
  };
129
132
  }
@@ -131,7 +134,7 @@ class se {
131
134
  return await this.componentsCache.forceFetch(f(e), { context: e });
132
135
  }
133
136
  }
134
- class c {
137
+ class p {
135
138
  constructor(e, a) {
136
139
  this.rootUrl = e, this.httpDispatcher = a;
137
140
  }
@@ -142,14 +145,14 @@ class c {
142
145
  return Buffer.from(await t.body.arrayBuffer());
143
146
  }
144
147
  relativeReader(e) {
145
- return e.endsWith("/") || (e = e + "/"), new c(new URL(e, this.rootUrl), this.httpDispatcher);
148
+ return e.endsWith("/") || (e = e + "/"), new p(new URL(e, this.rootUrl), this.httpDispatcher);
146
149
  }
147
150
  getContentReader(e) {
148
151
  let a = this;
149
152
  return e !== void 0 && (a = a.relativeReader(e)), (t) => a.readFile(t);
150
153
  }
151
154
  }
152
- class p {
155
+ class d {
153
156
  constructor(e, a) {
154
157
  this.rootUrl = e, this.root = a;
155
158
  }
@@ -158,7 +161,7 @@ class p {
158
161
  return await A.readFile(a);
159
162
  }
160
163
  relativeReader(e) {
161
- return e.endsWith("/") || (e = e + "/"), new p(
164
+ return e.endsWith("/") || (e = e + "/"), new d(
162
165
  new URL(e, this.rootUrl),
163
166
  i.join(this.root, ...e.split(l.sep))
164
167
  );
@@ -180,10 +183,10 @@ function re(o, e) {
180
183
  switch (a.protocol) {
181
184
  case "file:":
182
185
  const t = W(a.pathname);
183
- return new p(a, t);
186
+ return new d(a, t);
184
187
  case "https:":
185
188
  case "http:":
186
- return new c(a, e ?? new N());
189
+ return new p(a, e ?? new N());
187
190
  default:
188
191
  throw new Error(`Unknown protocol: ${a.protocol}`);
189
192
  }
@@ -211,8 +214,8 @@ export {
211
214
  he as BlockDescriptionToExplicitBinaryBytes,
212
215
  fe as BlockPackDescriptionConsolidateToFolder,
213
216
  me as BlockPackDescriptionManifestAddRelativePathPrefix,
214
- ve as BlockPackMetaConsolidate,
215
- ge as BlockPackMetaDescription,
217
+ ge as BlockPackMetaConsolidate,
218
+ ve as BlockPackMetaDescription,
216
219
  ke as BlockPackMetaEmbedAbsoluteBase64,
217
220
  ue as BlockPackMetaEmbedAbsoluteBytes,
218
221
  w as BlockPackMetaEmbedBytes,
@@ -230,32 +233,32 @@ export {
230
233
  Oe as GlobalOverviewToExplicitBinaryBytes,
231
234
  u as MainPrefix,
232
235
  B as ManifestFileName,
233
- Se as ManifestSuffix,
234
- Te as PackageOverview,
235
- De as PackageOverviewFileName,
236
- Me as PackageOverviewVersionEntry,
236
+ C as ManifestSuffix,
237
+ Se as PackageOverview,
238
+ Te as PackageOverviewFileName,
239
+ De as PackageOverviewVersionEntry,
237
240
  ie as RegistryV1,
238
241
  se as RegistryV2Reader,
239
- Ue as ResolvedBlockPackDescriptionFromPackageJson,
240
- Ee as ResolvedModuleFile,
241
- Le as ResolvedModuleFolder,
242
- Ve as S3Storage,
243
- Ge as absoluteToBase64,
244
- Ne as absoluteToBytes,
245
- je as absoluteToString,
246
- Ae as buildBlockPackDist,
247
- Je as cpAbsoluteToRelative,
242
+ Me as ResolvedBlockPackDescriptionFromPackageJson,
243
+ Ue as ResolvedModuleFile,
244
+ Ee as ResolvedModuleFolder,
245
+ Le as S3Storage,
246
+ Ve as absoluteToBase64,
247
+ Ge as absoluteToBytes,
248
+ Ne as absoluteToString,
249
+ je as buildBlockPackDist,
250
+ Ae as cpAbsoluteToRelative,
248
251
  re as folderReaderByUrl,
249
- Ie as loadPackDescription,
250
- We as loadPackDescriptionRaw,
251
- _e as mapLocalToAbsolute,
252
- ze as packFolderToRelativeTgz,
253
- qe as packageChannelPrefix,
254
- $e as packageChannelPrefixInsideV2,
255
- Ye as packageContentPrefix,
256
- d as packageContentPrefixInsideV2,
257
- He as packageOverviewPath,
258
- C as packageOverviewPathInsideV2,
252
+ Je as loadPackDescription,
253
+ Ie as loadPackDescriptionRaw,
254
+ We as mapLocalToAbsolute,
255
+ _e as packFolderToRelativeTgz,
256
+ ze as packageChannelPrefix,
257
+ qe as packageChannelPrefixInsideV2,
258
+ $e as packageContentPrefix,
259
+ c as packageContentPrefixInsideV2,
260
+ Ye as packageOverviewPath,
261
+ He as packageOverviewPathInsideV2,
259
262
  Ke as parsePackageName,
260
263
  Qe as relativeToContentString,
261
264
  Xe as relativeToExplicitBinary64,
@@ -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 SingleBlockPackOverview\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 packageContentPrefixInsideV2,\n packageOverviewPathInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\nimport { calculateSha256 } from '../../util';\n\nexport type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;\nexport type SingleBlockPackOverviewNoRegLabel = Omit<SingleBlockPackOverview, '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\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 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 }\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 // 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 p.latest.id,\n p.latestManifestSha256,\n true,\n p.latest.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id: p.latest.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 } 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<SingleBlockPackOverviewNoRegLabel | 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 getSpecificOverview(id: BlockPackId): Promise<SingleBlockPackOverviewNoRegLabel> {\n const overviewContent = await this.v2RootFolderReader.readFile(packageOverviewPathInsideV2(id));\n const overview = BlockPackManifest.parse(JSON.parse(Buffer.from(overviewContent).toString()));\n return {\n id: id,\n meta: await this.embedMetaContent(\n id,\n await calculateSha256(overviewContent),\n false,\n overview.description.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id,\n registryUrl: this.registryReader.rootUrl.toString()\n }\n };\n }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) => {\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 }\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Agent, 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';\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 ?? new Agent());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","_key","_staleValue","options","contentReader","packageContentPrefixInsideV2","BlockPackMetaEmbedBytes","key","staleValue","id","packageFolderReader","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","sha256","absolutePath","meta","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","byChannelEntries","channel","data","overview","e","blockPackIdNoVersionEquals","overviewContent","packageOverviewPathInsideV2","calculateSha256","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","Agent"],"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 SingleBlockPackOverview\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 packageOverviewPathInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\nimport { calculateSha256 } from '../../util';\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\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 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 }\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 // 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 p.latest.id,\n p.latestManifestSha256,\n true,\n p.latest.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id: p.latest.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 } 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 getSpecificOverview(\n id: BlockPackId,\n channel: string\n ): Promise<SingleBlockPackOverview> {\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 }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) => {\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 }\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Agent, 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';\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 ?? new Agent());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","_key","_staleValue","options","contentReader","packageContentPrefixInsideV2","BlockPackMetaEmbedBytes","key","staleValue","id","packageFolderReader","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","sha256","absolutePath","meta","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","byChannelEntries","channel","data","overview","e","blockPackIdNoVersionEquals","manifestContent","ManifestSuffix","calculateSha256","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","Agent"],"mappings":"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"}
@@ -2,7 +2,6 @@ import { BlockPackId, BlockPackIdNoVersion, BlockPackOverview, SingleBlockPackOv
2
2
  import { FolderReader } from '../../io';
3
3
  import { BlockComponentsAbsoluteUrl } from '../model';
4
4
  export type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;
5
- export type SingleBlockPackOverviewNoRegLabel = Omit<SingleBlockPackOverview, 'registryId'>;
6
5
  export type RegistryV2ReaderOps = {
7
6
  /** Number of milliseconds to cache retrieved block list for */
8
7
  cacheBlockListFor: number;
@@ -24,8 +23,8 @@ export declare class RegistryV2Reader {
24
23
  private listCacheTimestamp;
25
24
  private listCache;
26
25
  listBlockPacks(): Promise<BlockPackOverviewNoRegLabel[]>;
27
- getLatestOverview(id: BlockPackIdNoVersion, channel: string): Promise<SingleBlockPackOverviewNoRegLabel | undefined>;
28
- getSpecificOverview(id: BlockPackId): Promise<SingleBlockPackOverviewNoRegLabel>;
26
+ getLatestOverview(id: BlockPackIdNoVersion, channel: string): Promise<SingleBlockPackOverview | undefined>;
27
+ getSpecificOverview(id: BlockPackId, channel: string): Promise<SingleBlockPackOverview>;
29
28
  private readonly componentsCache;
30
29
  getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl>;
31
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry_reader.d.ts","sourceRoot":"","sources":["../../../src/v2/registry/registry_reader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,oBAAoB,EAKpB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAUxC,OAAO,EAAE,0BAA0B,EAA2B,MAAM,UAAU,CAAC;AAI/E,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAChF,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAAC,uBAAuB,EAAE,YAAY,CAAC,CAAC;AAE5F,MAAM,MAAM,mBAAmB,GAAG;IAChC,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oGAAoG;IACpG,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAOF,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAe;IAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;gBAGvB,cAAc,EAAE,YAAY,EAC7C,GAAG,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAMpC;;;;SAIK;IACL,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAerC;YAEW,gBAAgB;IAY9B,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,SAAS,CAAwD;IAE5D,cAAc,IAAI,OAAO,CAAC,2BAA2B,EAAE,CAAC;IA0DxD,iBAAiB,CAC5B,EAAE,EAAE,oBAAoB,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iCAAiC,GAAG,SAAS,CAAC;IAQ5C,mBAAmB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,iCAAiC,CAAC;IAmB7F,OAAO,CAAC,QAAQ,CAAC,eAAe,CAa7B;IAEU,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,0BAA0B,CAAC;CAGjF"}
1
+ {"version":3,"file":"registry_reader.d.ts","sourceRoot":"","sources":["../../../src/v2/registry/registry_reader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,oBAAoB,EAKpB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAWxC,OAAO,EAAE,0BAA0B,EAA2B,MAAM,UAAU,CAAC;AAI/E,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oGAAoG;IACpG,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAOF,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAe;IAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;gBAGvB,cAAc,EAAE,YAAY,EAC7C,GAAG,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAMpC;;;;SAIK;IACL,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAerC;YAEW,gBAAgB;IAY9B,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,SAAS,CAAwD;IAE5D,cAAc,IAAI,OAAO,CAAC,2BAA2B,EAAE,CAAC;IA0DxD,iBAAiB,CAC5B,EAAE,EAAE,oBAAoB,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAQlC,mBAAmB,CAC9B,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,CAAC;IAsBnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAa7B;IAEU,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,0BAA0B,CAAC;CAGjF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/block-tools",
3
- "version": "2.4.5",
3
+ "version": "2.4.7",
4
4
  "description": "Utility to manipulate Platforma Blocks and Block Registry",
5
5
  "types": "./dist/lib.d.ts",
6
6
  "main": "./dist/index.js",
@@ -33,10 +33,10 @@
33
33
  "tar": "^7.4.3",
34
34
  "yaml": "^2.6.1",
35
35
  "zod": "^3.23.8",
36
- "@milaboratories/ts-helpers-oclif": "^1.1.11",
37
- "@milaboratories/pl-model-middle-layer": "^1.6.3",
38
36
  "@milaboratories/resolve-helper": "^1.0.2",
39
- "@milaboratories/ts-helpers": "^1.1.2"
37
+ "@milaboratories/ts-helpers": "^1.1.2",
38
+ "@milaboratories/ts-helpers-oclif": "^1.1.11",
39
+ "@milaboratories/pl-model-middle-layer": "^1.6.4"
40
40
  },
41
41
  "devDependencies": {
42
42
  "typescript": "~5.5.4",
@@ -30,4 +30,4 @@ test('test getting components from global registry', async () => {
30
30
  expect(
31
31
  (await (await request(components.workflow.main.url)).body.arrayBuffer()).byteLength
32
32
  ).toBeGreaterThan(100);
33
- });
33
+ }, 10000);
@@ -15,6 +15,7 @@ import {
15
15
  GlobalOverviewReg,
16
16
  MainPrefix,
17
17
  ManifestFileName,
18
+ ManifestSuffix,
18
19
  packageContentPrefixInsideV2,
19
20
  packageOverviewPathInsideV2
20
21
  } from './schema_public';
@@ -23,7 +24,6 @@ import { LRUCache } from 'lru-cache';
23
24
  import { calculateSha256 } from '../../util';
24
25
 
25
26
  export type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;
26
- export type SingleBlockPackOverviewNoRegLabel = Omit<SingleBlockPackOverview, 'registryId'>;
27
27
 
28
28
  export type RegistryV2ReaderOps = {
29
29
  /** Number of milliseconds to cache retrieved block list for */
@@ -147,7 +147,7 @@ export class RegistryV2Reader {
147
147
  public async getLatestOverview(
148
148
  id: BlockPackIdNoVersion,
149
149
  channel: string
150
- ): Promise<SingleBlockPackOverviewNoRegLabel | undefined> {
150
+ ): Promise<SingleBlockPackOverview | undefined> {
151
151
  const overview = (await this.listBlockPacks()).find((e) =>
152
152
  blockPackIdNoVersionEquals(id, e.id)
153
153
  );
@@ -155,21 +155,27 @@ export class RegistryV2Reader {
155
155
  return overview.latestByChannel[channel];
156
156
  }
157
157
 
158
- public async getSpecificOverview(id: BlockPackId): Promise<SingleBlockPackOverviewNoRegLabel> {
159
- const overviewContent = await this.v2RootFolderReader.readFile(packageOverviewPathInsideV2(id));
160
- const overview = BlockPackManifest.parse(JSON.parse(Buffer.from(overviewContent).toString()));
158
+ public async getSpecificOverview(
159
+ id: BlockPackId,
160
+ channel: string
161
+ ): Promise<SingleBlockPackOverview> {
162
+ const manifestContent = await this.v2RootFolderReader.readFile(
163
+ packageContentPrefixInsideV2(id) + ManifestSuffix
164
+ );
165
+ const overview = BlockPackManifest.parse(JSON.parse(Buffer.from(manifestContent).toString()));
161
166
  return {
162
167
  id: id,
163
168
  meta: await this.embedMetaContent(
164
169
  id,
165
- await calculateSha256(overviewContent),
170
+ await calculateSha256(manifestContent),
166
171
  false,
167
172
  overview.description.meta
168
173
  ),
169
174
  spec: {
170
175
  type: 'from-registry-v2',
171
176
  id,
172
- registryUrl: this.registryReader.rootUrl.toString()
177
+ registryUrl: this.registryReader.rootUrl.toString(),
178
+ channel
173
179
  }
174
180
  };
175
181
  }