@ 7mind.io/baboon (韩语)
JavaScript 为 Baboon 编译器和运行时编码器绑定.
Baboon允许您在紧凑的DSL中定义数据模型,生成多种语言的源代码,并用有版本意识的解码器来编码/解码有效载荷.
安装
npm install @7mind.io/baboon
使用量
import { BaboonCompiler } from "@7mind.io/baboon";
const model = `
model example.npm
version "1.0.0"
root data User {
name: str
age: i32
}
`;
const inputs = [{ path: "model.baboon", content: model }];
const result = await BaboonCompiler.compile({
inputs,
targets: [
{
language: "cs",
generic: {
generateTests: false,
generateFixtures: false
},
cs: {
generateJsonCodecs: true,
generateUebaCodecs: true,
deduplicate: true
}
}
],
debug: false
});
if (!result.success) {
throw new Error(result.errors?.join("\n") ?? "Compilation failed");
}
const files = { "model.baboon": model };
// Type identifiers follow `<pkg>/<owner>#<name>`, with `:` for top-level types.
const typeId = "example.npm/:#User";
const encoded = await BaboonCompiler.encode(
files,
"example.npm",
"1.0.0",
typeId,
JSON.stringify({ name: "Ada", age: 42 }),
false
);
if (!encoded.success || !encoded.data) {
throw new Error(encoded.error ?? "Encoding failed");
}
const decoded = await BaboonCompiler.decode(
files,
"example.npm",
"1.0.0",
typeId,
encoded.data
);
if (!decoded.success || !decoded.json) {
throw new Error(decoded.error ?? "Decoding failed");
}
console.log(JSON.parse(decoded.json));
环境
软件包是普通ES模块,没有运行时间依赖性:编译器是单一的
main.js,而它不需要主机提供的全域,所以在节点运行相同的文件,在
浏览器和网络工人.
在网络工作者中运行
一个模型的装入和类型检查是同步的, CPU 绑定: 大型多版本
归档可以让一条线程忙上几秒钟 。 要保持页面响应, 请运行编译器
在网络工人. worker.js 是一个现成的模块-工人条目 connectBaboonWorker
给予主线程的方法与 BaboonCompiler每个返回一个 Promise· ;
主线程从未下载或解析编译器捆绑 :
// baboon.worker.js — the worker's entry, one line:
import "@7mind.io/baboon/worker.js";
import { connectBaboonWorker } from "@7mind.io/baboon/worker-client.js";
// `new Worker(new URL("./x.js", import.meta.url), { type: "module" })` is the form bundlers
// document for emitting a module worker with its dependencies.
const worker = new Worker(new URL("./baboon.worker.js", import.meta.url), { type: "module" });
const baboon = connectBaboonWorker(worker);
const model = await baboon.loadMany({ bytes }); // runs in the worker
const result = await baboon.decodeEnvelopeLoaded(model, envelope);
await baboon.release(model); // frees it in the worker
没有捆绑器,就把工人指向包裹本身
(单位:千美元)new Worker("/node_modules/@7mind.io/baboon/worker.js", { type: "module" }),或者无论它在哪里
(已送达).
- 模型留在工人体内;主线有不透明的手柄,只能通过
装入它们的连接,直到
release(model)。 。 。 . - 参数和结果被复制到结构组合算法( 不传输) : 呼叫者保持缓冲.
- 工人一方的失败以同样的信息拒绝电话,如果 工人脚本无法加载或崩溃,待发和后发的电话拒绝.
- 在另一港口服务(a)
MessagePort,节点的worker_threads),电话serveBaboon(port)从@7mind.io/baboon/worker-server.js在工人和connectBaboonWorker(otherPort)在另一边.
API 表面
BaboonCompiler.compile(options)→Promise<{ success, files?, errors? }>BaboonCompiler.load(files)→Promise<BaboonLoadedModel>BaboonCompiler.loadMany({ bytes } | { base64 })→Promise<BaboonLoadedModel>BaboonCompiler.listTypes(model)→BaboonTypeInfo[]BaboonCompiler.generateRandom(model, pkg, version, idString)→{ success, json?, error? }BaboonCompiler.encode(files, pkg, version, idString, json, indexed)→Promise<{ success, data?, error? }>BaboonCompiler.encodeLoaded(model, pkg, version, idString, json, indexed)→Promise<{ success, data?, error? }>BaboonCompiler.decode(files, pkg, version, idString, data)→Promise<{ success, json?, error? }>BaboonCompiler.decodeLoaded(model, pkg, version, idString, data)→Promise<{ success, json?, error? }>BaboonCompiler.encodedEnvelopeLoaded(model, jsonEnvelope, { envelopeVersion, indexed })→Promise<{ success, data?, error? }>BaboonCompiler.decodeEnvelopeLoaded(model, uebaEnvelope)→Promise<{ success, json?, error? }>BaboonCompiler.cleanupScheme(files, domain, version)编号 :cleanupSchemeLoaded(model, domain, version)→Promise<{ success, content?, error? }>
load 财务报告和审定财务报表 loadMany 拒绝 Error 其信息从 Loading failed:· ;
模型问题与它们来自的文件(或档案条目)的路径一起列出.
装入计划归档
loadMany 加载一个 schema 归档的每个计划( 常规的 ZIP 文件) *.bsm(中文(简体) )
在记忆中一起通过与 load,并返回相同的手柄 :
// e.g. written by: baboon --model-dir ./models :scheme --domains="*@*" --zip-output=schemas.bsm
const model = await BaboonCompiler.loadMany({ bytes: new Uint8Array(await response.arrayBuffer()) });
const same = await BaboonCompiler.loadMany({ base64: "UEsDBAoAAAg..." }); // plain base64, not a data: URL
正好通过一个 bytes 联合国 Uint8Array,节点的 Buffer 列入)或 base64 (单位:千美元)
标准字母; 无 data: 前缀,没有空白。 存档合同 :
- 条目必须存储(方法 0, 什么
baboon :scheme --zip-output写)或 解缩(方法8, 缩放工具默认写作); 其他方法, 加密和 拒绝ZIP64; - 输入路径必须是相对的
/-没有空的分离路径,.或者说..部分, 后鞭打或驱动前缀,并具有独特性; - 目录条目被忽略 ;
*.baboon条目是计划(UTF-8,至少一个);*.bmo仅可供include,其路径解决旁边 包括首先输入,然后与归档根相对;拒绝任何其他条目; - 已核实CRC-32核对和.
档案在记忆中读取,没有额外的依赖性,在节点和浏览器中都一样.
正在转换信封
生成的运行时间的外观将值包裹在一个命名的顶级信封中
域、版本和类型(docs/spec/codec-envelope.md) (中文(简体) ). encodedEnvelopeLoaded 转弯
jSON信封装入二进制的UEBA; decodeEnvelopeLoaded 反向显示 :
const json = JSON.stringify({ $mv: 1, $d: "example.npm", $v: "1.0.0", $t: typeId, $c: { name: "Ada", age: 42 } });
const bin = await BaboonCompiler.encodedEnvelopeLoaded(model, json, { envelopeVersion: 1, indexed: false });
const back = await BaboonCompiler.decodeEnvelopeLoaded(model, bin.data); // back.json === json
- 需要两种选择:
envelopeVersion是二进制布局( e)1外观 默认,带有一个相容性约束;2两者兼具,而且只能由 当前运行时间),indexeduEBA指数模式(默认为紧凑,false) (中文(简体) ). 二进制输入是自我描述(v1或v2,收缩或索引),因此解码不需要选项. - 这是格式转换,而不是迁移:域、版本和完整的类型标识符
(单位:千美元)
pkg/:#Name, (中文(简体) ),pkg/ns#Name, (中文(简体) ),pkg/[pkg/:#Adt]#Branch)从输入中取出并保存. 有效载荷与该确切版本一并阅读。 一个比每个装入的版本更新的作者是 只有当其信封证明有效载荷字节与装入的版本相同时才转换 (单位:千美元)$uv,或二进制 v2minCompat; 二进制 v1 信封无法证明, 被拒绝 . - 兼容性边界从已装入的模型中重新计算输出格式: JSON
$rv(json-additive)和 二进制readableMin(前缀-compact / 前缀- any-mode) 承诺 不同的东西, 从来没有复制过。 从模型中计算出的 只有部分域名的分界线是保守的. - 错误报告于
error: 不正确或短发的信封, 不支持metaVersion或旗帜, 超出顺序, 未知域, 版本或类型, JSON 字段中,该类型不声明,跟踪字节,并值运行时编码器不能 转换( e)any字段,不含rt绘制地图)。 贾森$mv也许就是 编号1或遗留字符串"1"或缺席.
性能优化
对于重复操作,一次装入模型并再用. 此跳过每次呼叫的解析和验证步骤 :
// 1. Load model once
const model = await BaboonCompiler.load(files);
// 2. Encode/Decode multiple times efficiently
const encoded = await BaboonCompiler.encodeLoaded(
model,
"example.npm",
"1.0.0",
typeId,
jsonPayload,
false
);
const decoded = await BaboonCompiler.decodeLoaded(
model,
"example.npm",
"1.0.0",
typeId,
encoded.data
);
许可证
BSD-2- 标签