跳转到内容

encode

encode 函数用于将 JavaScript 值编码为 CBOR 格式的 Uint8Array

导入

import { encode } from "@tai-kun/surrealdb/cbor";

语法

function encode(value: unknown, options?: EncodeOptions): Uint8Array;

参数

value

要编码为 CBOR 格式 Uint8Array 的 JavaScript 值。value 可以是以下 JavaScript 值:

  • 原始值
  • number
  • bigint
  • string
  • boolean
  • null
  • undefined
  • 具有 .toCBOR() 方法的对象
  • 数组或 Set
  • 普通对象或 Map
  • Uint8Array
  • Simple 对象
  • 可以使用可选的 replacer 替换的值

如果值不是原始值,并且具有 toCBOR 属性且该属性为函数,则优先调用该函数。

options

编码选项。

replacer?: Replacer | Replacer[]
编码器默认情况下可以将大多数值编码为 CBOR,但对于不符合此规则的特殊值,可以将其替换为可编码的值。此选项允许通过指定函数或函数数组来实现替换处理。如果函数返回 Symbol.for("@tai-kun/surrealdb/cbor/continue") 获得的 CONTINUE 符号,则将调用后续函数。如果没有任何替换发生,则会抛出 SurrealTypeError
isSafeMapKey?: (key: unknown, map: ReadonlyMap<unknown, unknown>) => boolean
此选项是一个函数,用于验证 Map 对象的键是否安全。该函数接收两个参数 keymapkey 是键的值,map 是正在验证的 Map 对象。如果此函数返回 false,则会抛出 CborUnsafeMapKeyError。默认情况下,它将 "__proto__""constructor" 视为不安全的键。请注意,指定此选项将完全覆盖默认验证。如果您想在默认验证的基础上添加自己的验证,则也应该将 "__proto__""constructor" 视为不安全的键。
isSafeObjectKey?: (key: unknown, obj: { readonly [p: string]: unknown }) => boolean
此选项是一个函数,用于验证普通对象的键是否安全。该函数接收两个参数 keyobjkey 是键的值,obj 是正在验证的普通对象。如果此函数返回 false,则会抛出 CborUnsafeMapKeyError。默认情况下,它将 "__proto__""constructor" 视为不安全的键。请注意,指定此选项将完全覆盖默认验证。如果您想在默认验证的基础上添加自己的验证,则也应该将 "__proto__""constructor" 视为不安全的键。
maxDepth?: number
指定对象的最大深度。每次进入对象或数组时,深度都会增加 1。默认值为 64。虽然编码未使用递归处理,因此深度没有上限,但建议不要设置过大的值。

返回值

将 JavaScript 值编码为 CBOR 格式的 Uint8Array

例子

使用 isSafeObjectKey 保护对象键

import { encode } from "@tai-kun/surrealdb/cbor";
encode(
{
"API_KEY": "***"
},
{
isSafeObjectKey: k => !["constructor", "__proto__", "API_KEY"].includes(k),
}
); // throws CborUnsafeMapKeyError

使用 replacer 替换符号

import { CONTINUE, encode } from "@tai-kun/surrealdb/cbor";
const bytes = encode(Symbol.for("ID"), {
replacer(o) {
switch (o) {
case Symbol.for("ID"):
return "ID";
default:
return CONTINUE;
}
},
});
console.log(bytes); // Uint8Array(3) [ 98, 73, 68 ]

使用 maxDepth 限制最大深度

import { encode } from "@tai-kun/surrealdb/cbor";
encode(
{
// depth: 1
a: new Map([
// depth: 2
["b", [
// depth: 3
new Set([
// depth: 4
]),
]],
]),
},
{
maxDepth: 3,
},
); // throws CborMaxDepthReachedError