这些实用函数是您从远程源获取、处理和验证 Blocklet 元数据的工具包。无论您是从商店 URL 还是本地文件路径解析 Blocklet,这些助手对于任何需要与本地不可用的 Blocklet 交互的工具或应用程序(如启动器、开发工具或注册表服务)都至关重要。
它们旨在处理网络请求、缓存、验证的复杂性,甚至在有多个可用源时提供容错能力。
核心获取函数
这些函数是从一个或多个 URL 检索 Blocklet 元数据的核心。
getBlockletMetaByUrl
这是一个基础函数,用于从单个 URL 获取原始的 blocklet.json 内容。它支持 http(s):// 和 file:// 协议。为提高性能,成功获取的结果会使用 LRU 缓存在内存中。
参数
- url
string(required) — 指向 blocklet.json 文件的 URL(http、https 或 file)。
返回
- ****
Promise<TBlockletMeta>— 一个解析为已解析的 Blocklet 元数据对象(TBlockletMeta)的 Promise。如果 URL 无法访问或内容不是有效的 JSON,则会抛出错误。
示例
获取原始元数据
import { getBlockletMetaByUrl } from '@blocklet/meta';
async function fetchMeta() {
const metaUrl = 'https://store.blocklet.dev/api/blocklets/z8ia2vL3A9ACu4p2f2iF9yQWc9BvCzaWwx57p/blocklet.json';
try {
const meta = await getBlockletMetaByUrl(metaUrl);
console.log(`成功获取元数据:${meta.name}`);
return meta;
} catch (error) {
console.error('获取元数据失败:', error.message);
}
}
fetchMeta();getBlockletMetaFromUrl
这是一个更高级、更健壮的实用程序,它建立在 getBlockletMetaByUrl 的基础上。它不仅获取元数据,还执行验证、清理数据(例如,移除 htmlAst),并可选地确保关联的 dist.tarball URL 有效且可访问。这是大多数用例的推荐函数。
参数
- url
string(required) — blocklet.json 文件的 URL。 - options
object— 一个可选的配置对象。- validateFn
Function(default:validateBlockletMeta) — 一个用于验证所获取元数据的自定义函数。 - returnUrl
boolean(default:false) — 如果为 true,函数返回一个对象 { meta, url }。 - ensureTarball
boolean(default:true) — 如果为 true,函数通过发出 HEAD 请求来验证 dist.tarball URL。 - logger
object— 一个用于调试的日志记录器实例(例如 console)。
- validateFn
返回
- ****
Promise<any>— 一个解析为已验证的 TBlockletMeta 对象的 Promise。如果 returnUrl 为 true,它将解析为 { meta: TBlockletMeta, url: string }。
示例
获取并验证元数据
import { getBlockletMetaFromUrl } from '@blocklet/meta';
async function fetchAndValidateMeta() {
const metaUrl = 'https://store.blocklet.dev/api/blocklets/z8ia2vL3A9ACu4p2f2iF9yQWc9BvCzaWwx57p/blocklet.json';
try {
const meta = await getBlockletMetaFromUrl(metaUrl, { ensureTarball: true });
console.log(`成功验证元数据:${meta.name}`);
console.log(`Tarball URL 有效:${meta.dist.tarball}`);
} catch (error) {
console.error('获取或验证元数据失败:', error.message);
}
}
fetchAndValidateMeta();getBlockletMetaFromUrls
此函数通过接受一个 URL 数组来提供容错能力。它尝试并发地从每个 URL 获取元数据,并返回第一个成功的结果,利用了 Promise.any。当一个 Blocklet 的元数据可能托管在多个位置时(例如一个主注册表和一个备份注册表),这非常有用。
参数
- urls
string[](required) — 一个尝试从中获取的 URL 数组。 - options
object— 与 getBlockletMetaFromUrl 相同的选项对象。
返回
- ****
Promise<any>— 一个使用首次成功获取的结果进行解析的 Promise。如果所有 URL 都失败,则该 Promise 将被拒绝,并带有一个包含每次失败原因的聚合错误。
示例
使用冗余获取
import { getBlockletMetaFromUrls } from '@blocklet/meta';
async function fetchWithFallback() {
const metaUrls = [
'https://invalid-registry.com/blocklet.json', // 这将失败
'https://store.blocklet.dev/api/blocklets/z8ia2vL3A9ACu4p2f2iF9yQWc9BvCzaWwx57p/blocklet.json' // 这将成功
];
try {
const { meta, url } = await getBlockletMetaFromUrls(metaUrls, { returnUrl: true });
console.log(`成功从 ${url} 获取 ${meta.name} 的元数据`);
} catch (error) {
console.error('所有 URL 都失败了:', error.message);
}
}
fetchWithFallback();组合助手
这些助手用于在组合应用程序中解析子 Blocklet 的元数据。
getSourceUrlsFromConfig
这个实用程序对于 Blocklet 组合至关重要。当一个 Blocklet 定义了 components 时,此函数会解析组件的配置,以生成一个潜在的 blocklet.json URL 列表。它可以解释各种源声明,包括直接 URL、Blocklet Store 标识符和已解析的 URL。
参数
- config
object(required) — 来自 blocklet.yml 文件中 components 部分的组件配置对象。
返回
- ****
string[]— 指定组件的潜在元数据 URL 数组。
示例
解析组件元数据 URL
import { getSourceUrlsFromConfig } from '@blocklet/meta';
// 来自父 Blocklet 元数据的示例组件配置
const componentConfig = {
name: 'my-child-blocklet',
source: {
store: ['https://store.blocklet.dev/api', 'https://backup-store.com/api'],
version: '1.2.0'
}
};
const urls = getSourceUrlsFromConfig(componentConfig);
console.log(urls);
/* 输出 (DID 是从名称派生的):
[
'https://store.blocklet.dev/api/blocklets/z2qa.../1.2.0/blocklet.json',
'https://backup-store.com/api/blocklets/z2qa.../1.2.0/blocklet.json'
]
*/验证实用程序
本节包含核心获取函数所使用的底层实用程序。
validateUrl
这是一个通用实用程序,用于检查 URL 是否有效且可访问。它通过检查文件是否存在来支持 file://,并通过发出 HEAD 请求来验证可访问性以及(可选地)content-type 头部来支持 http(s)://。此函数的结果也会被缓存。
参数
- url
string(required) — 要验证的 URL。 - expectedHttpResTypes
string[](default:['application/json', 'text/plain']) — 一个可接受的 HTTP 请求 content-type 值数组。
返回
- ****
Promise<boolean>— 一个在 URL 有效时解析为 true 的 Promise。如果验证失败(例如,文件未找到、网络错误、意外的内容类型),则会抛出错误。
示例
验证远程资产
import { validateUrl } from '@blocklet/meta';
async function checkTarball(url) {
try {
await validateUrl(url, ['application/octet-stream', 'application/x-gzip']);
console.log(`Tarball URL 有效且内容类型正确: ${url}`);
return true;
} catch (error) {
console.error(`Tarball URL 验证失败: ${error.message}`);
return false;
}
}
checkTarball('https://some-cdn.com/blocklet.tar.gz');