@endo/pass-style
定义一个对象能力系统中的瓦特之间可以传递哪些数据.
概览
这个 @ endo/ pass 风格 软件包定义 Passable 类型和提供
passStyleOf() 根据 JavaScript 值分类函数
PassStyle。 。 。 .
这种分类决定了数值如何在孤立之间安全传递
隔间或跨越网络边界.
每个可传取值都有一套固定的传出样式 各种可能性. 关键区别在于: 通过副本 (数值本身被复制) 财务报告和审定财务报表 通过参考。 。 。 .
传递样式
| 传出样式 | 类别 | 说明 | 实例 |
|---|---|---|---|
'null' | 初级 | 无效值 | null |
'undefined' | 初级 | 未定义的值 | undefined |
'boolean' | 初级 | 布尔原始人 | true, (中文(简体) ), false |
'number' | 初级 | IEEE 754个浮点 | 42, (中文(简体) ), 3.14, (中文(简体) ), NaN, (中文(简体) ), Infinity |
'bigint' | 初级 | 任意精度整数 | 123n, (中文(简体) ), -456n |
'string' | 初级 | 结构良好的字符串 | 'hello', (中文(简体) ), '' |
'symbol' | 初级 | 注册/知名符号 | Symbol.iterator |
'copyArray' | 通过副本 | 冻结的可流性阵列 | harden([1, 2, 3]) |
'copyRecord' | 通过副本 | 冻结平原对象 | harden({ x: 10 }) |
'remotable' | 过继出席 | 远对象存在( R) | Far('Counter', {...}) |
'tagged' | 延长 | 特定领域类型 | makeTagged('copySet', [...]) |
'error' | 过继出席 | 错误对象 | harden(Error('failed')) |
'promise' | 过继出席 | 承诺对象 | Promise.resolve(42) |
核心职能
passStyleOf( 数值)
分类一个值的通过样式. 如果值不能通过,则丢出.
import { passStyleOf } from '@endo/pass-style';
passStyleOf(42); // 'number'
passStyleOf(harden([1, 2])); // 'copyArray'
passStyleOf(harden({ x: 1 })); // 'copyRecord'
passStyleOf(Promise.resolve()); // 'promise'
// Throws for non-passable values
passStyleOf({ x: 1 }); // Error: not frozen
有价( 值)
布尔测试通过性.
回返 true 如果值可以通过, false 否则.
import { isPassable } from '@endo/pass-style';
isPassable(42); // true
isPassable(harden([1, 2])); // true
isPassable({ x: 1 }); // false - not frozen
isPassable(harden({ x: 1 })); // true
使用 isPassable() 当你想要一个布尔的结果.
使用 passStyleOf() 需要特定通行证样式或需要详细信息时
错误消息 .
远(面,方法)
创建可调取的可调取对象.
import { Far } from '@endo/pass-style';
const counter = Far('Counter', {
increment() { return count += 1; },
getValue() { return count; }
});
passStyleOf(counter); // 'remotable'
说明: 远物体是可再活化的,但不验证它们的输入. 关于自动输入验证的防御性物体,见 @ endo/ exo (帮助)。 。 。 .
标记( 标记、 有效载荷)
创建 CopyTlaged 对象,特定域数据的扩展点 类型.
import { makeTagged } from '@endo/pass-style';
const tagged = makeTagged('customType', { data: 42 });
passStyleOf(tagged); // 'tagged'
标记对象由内部使用 @ endo/ patters( 签名) 执行 CopySet、 CopyBag 和 CopyMap .
可通过值
符合这些要求的值是可通行的:
- 初级 总是可以通行的(未注册的符号除外)
- 对象必须被冻结 通过
harden()从@endo/pass-style或者说ses - 无循环引用 以通过式结构(复制台、复制台、, 标记)
- 字符串必须造型良好 (没有未付代孕)
- 符号必须暂时使用
passableSymbolForName()从@endo/pass-style。 。 。 .
// Passable - frozen array of primitives
const data = harden([1, 2, 3]);
// NOT passable - not frozen
const mutable = [1, 2, 3];
// NOT passable - cyclic reference
const cyclic = harden([]);
cyclic.push(cyclic);
传-接-接-接-接-接-接
通过- 复制
值本身在通过时会被复制. 原作的修改不影响副本.
用于: 不可移动的数据、配置、消息、小结构
传出样式 : 原始、复制、记录、标记
const config = harden({
timeout: 5000,
retries: 3
});
// When passed, config is copied
// The recipient gets a separate copy
通过参考
引证相传. 该天体仍保留在原位置.
用于: 有行为、可变状态、能力、大对象的物体
传出样式 : 可恢复、承诺、错误
const service = Far('Service', {
getData() { return data; }
});
// When passed, only a reference is passed
// Method calls are forwarded to the original object
类型警卫
该套件为常见的通关样式提供类型守护:
import {
isRecord, assertRecord,
isCopyArray, assertCopyArray,
isRemotable, assertRemotable,
isAtom, assertAtom
} from '@endo/pass-style';
// Boolean checks
if (isRecord(value)) {
// value is a CopyRecord
}
// Assertions (throw if false)
assertRemotable(obj);
// obj is guaranteed to be a remotable
与 Endo 软件包集成
- 验证数字 : @ endo/ patters( 签名) - 模式匹配到 验证可通过文件
- 防御对象数字 : @ endo/ exo (帮助) - Exos结合远与 模式验证
- 通讯数字 : @ endo/ eventual- send (日语) - 发送 使用 E( ) 代理信件
- 序列化数字 : @ endo/ marshal (韩语) - 编码可通行文件 用于传输
完成教学: 见 消息传递 页:1 综合指南,说明通行证式如何与图案、外出和 最终发送.
深潜
详细执行情况: