解码
同步解码
decode
函数用于将 CBOR 格式的 Uint8Array
解码为 JavaScript 值。
导入
import { decode } from "@tai-kun/surrealdb/cbor";
语法
function decode(input: Uint8Array, options?: DecodeOptions): unknown;
参数
input
用于解码为 JavaScript 值的 CBOR 格式的 Uint8Array
。
options
解码选项。
mapType?: "Object" | "Map"
- 此选项用于选择将键值对对象解码为 JavaScript 普通对象还是
Map
。选择"Object"
将解码为普通对象,选择"Map"
将解码为Map
类实例。默认为"Object"
。普通对象的键只能接受字符串或数字(即string | number
),但如果将此选项设置为"Map"
进行解码,则键可以接受所有解码后的值。 reviver?: Reviver | ReviverObject | (Reviver | ReviverObject)[]
- 此选项用于将 CBOR 的简单数据项或带标签的数据项转换为 JavaScript 值。简单数据项限于 0 到 19 和 32 到 255 的值。带标签的数据项的标签是 0 到 2^64-1 之间的
number
或bigint
。如果函数返回Symbol.for("@tai-kun/surrealdb/cbor/continue")
获得的CONTINUE
符号,则会调用后续函数。如果无法转换任何内容,则会抛出SurrealTypeError
。 isSafeMapKey?: (key: unknown, map: Map<unknown, unknown>) => boolean
- 此选项是一个函数,用于验证
Map
对象的键是否安全。该函数接收两个参数key
和map
。key
是键的值,map
是正在验证的Map
对象。如果此函数返回false
,则会抛出CborUnsafeMapKeyError
。默认情况下,它将"__proto__"
或"constructor"
判定为不安全的键。请注意,指定此选项会完全覆盖默认验证。如果您想在默认验证的基础上添加自己的验证,则也应该将"__proto__"
或"constructor"
判定为不安全的键。 isSafeObjectKey?: (key: unknown, obj: Record<string | number, unknown>) => boolean
- 此选项是一个函数,用于验证普通对象的键是否安全。该函数接收两个参数
key
和obj
。key
是键的值,obj
是正在验证的普通对象。如果此函数返回false
,则会抛出CborUnsafeMapKeyError
。默认情况下,它将"__proto__"
或"constructor"
判定为不安全的键。请注意,指定此选项会完全覆盖默认验证。如果您想在默认验证的基础上添加自己的验证,则也应该将"__proto__"
或"constructor"
判定为不安全的键。 maxDepth?: number
- 指定对象的最大深度。进入对象或数组时,深度增加 1。默认值为
64
。解码不使用递归处理,因此深度没有上限,但不建议设置过大的值。
返回值
从 CBOR 格式的 Uint8Array
解码得到的 JavaScript 值。
例子
使用 Map
对象解码
import { decode } from "@tai-kun/surrealdb/cbor";
const cbor = new Uint8Array([ 0xa1, // mt: 5, ai: 1 // key 0x00, // mt: 0, ai: 0 // value 0x00, // mt: 0, ai: 0]);
const value = decode(bytes, { mapType: "Map" });
console.log(value); // Map(1) { [ 0 ] => 0 }
异步解码
decodeStream
函数用于将 CBOR 格式的 Uint8Array
解码为 JavaScript 值。
导入
import { decodeStream } from "@tai-kun/surrealdb/cbor";
语法
function decodeStream( input: ReadableStream<Uint8Array>, options?: DecodeStreamOptions,): unknown;
参数
input
Uint8Array
的可读流。Fetch API 可能会根据请求在 Response
对象的 body
属性中提供此流。
options
除了同步解码的选项外,还可以指定以下选项:
signal?: AbortSignal
- 用于中断流的取消信号。
返回值
一个以 JavaScript 值为结果的 StatefulPromise
。
例子
Fetch API
import { decodeStream } from "@tai-kun/surrealdb/cbor";
const response = await fetch("http://localhost:8000/rpc", { method: "POST", headers: { Accept: "application/cbor", // ... more headers }, // ... more properties})
const result = await decodeStream(resp.body);