amf-ts 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/amf.js CHANGED
@@ -28,8 +28,8 @@ class u {
28
28
  * @param serializableName - 对象的类名(可选)
29
29
  * @param dynamic - 是否为动态对象(可选,默认 true)
30
30
  */
31
- constructor(e = "", t = !0) {
32
- this.__class = e, this.__dynamic = t;
31
+ constructor(e, t) {
32
+ this.__class = e ?? "", this.__dynamic = t ?? !0;
33
33
  }
34
34
  }
35
35
  class E extends u {
@@ -600,8 +600,8 @@ const w = class w extends b {
600
600
  return this.amf3ObjectReferences.push(c), c;
601
601
  }
602
602
  const r = new u(
603
- t.name || void 0,
604
- t.dynamic || !0
603
+ t.name,
604
+ t.dynamic
605
605
  );
606
606
  this.amf3ObjectReferences.push(r);
607
607
  for (let n = 0; n < t.staticFields.length; n++) {
package/dist/amf.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"amf.js","sources":["../src/classes.ts","../src/types.ts","../src/reader.ts","../src/decoder.ts","../src/writer.ts","../src/encoder.ts"],"sourcesContent":["/**\r\n * AMF 辅助类模块\r\n *\r\n * 本模块定义了 AMF 序列化过程中使用的辅助类\r\n * 包括强制类型值、对象特征、可序列化对象和可外部化对象\r\n */\r\n\r\nimport type { AMFType } from './types.js';\r\nimport type { AMFEncoder } from './encoder.js';\r\nimport type { AMFDecoder } from './decoder.js';\r\n\r\n/**\r\n * 强制类型值类\r\n *\r\n * 允许用户强制指定一个值应该被编码为特定的 AMF 类型\r\n * 而不是由编码器自动推断类型\r\n *\r\n * @example\r\n * ```typescript\r\n * // 强制将数字编码为 AMF3 的 DOUBLE 类型而不是 INTEGER\r\n * const forcedDouble = new ForcedTypeValue(42, AMF3.DOUBLE);\r\n * encoder.writeObject(forcedDouble);\r\n * ```\r\n */\r\nexport class ForcedTypeValue {\r\n /** 实际要编码的值 */\r\n public value: any;\r\n\r\n /** 强制使用的 AMF 类型 */\r\n public type: AMFType;\r\n\r\n /**\r\n * 创建一个强制类型值\r\n *\r\n * @param value - 实际要编码的值\r\n * @param type - 强制使用的 AMF 类型\r\n */\r\n constructor(value: any, type: AMFType) {\r\n this.value = value;\r\n this.type = type;\r\n }\r\n}\r\n\r\n/**\r\n * AMF3 对象特征类\r\n *\r\n * 用于描述 AMF3 对象的元数据信息\r\n * 包括类名、是否为动态对象、是否可外部化、以及静态字段列表\r\n *\r\n * 在 AMF3 中,对象特征可以被引用以减少数据大小\r\n * 当多个相同类型的对象被序列化时,只需要序列化一次特征信息\r\n */\r\nexport class AMFTrait {\r\n /** 对象的类名(可以为空表示匿名对象) */\r\n public name: string;\r\n\r\n /**\r\n * 是否为动态对象\r\n * 动态对象可以有任意的属性,而非动态对象只能有预定义的静态属性\r\n */\r\n public dynamic: boolean;\r\n\r\n /**\r\n * 是否可外部化\r\n * 可外部化对象需要自己控制序列化和反序列化过程\r\n */\r\n public externalizable: boolean;\r\n\r\n /** 静态字段名列表 */\r\n public staticFields: string[];\r\n\r\n /**\r\n * 创建一个 AMF3 对象特征\r\n *\r\n * @param name - 对象的类名\r\n * @param dynamic - 是否为动态对象\r\n * @param externalizable - 是否可外部化\r\n */\r\n constructor(name: string, dynamic: boolean, externalizable: boolean) {\r\n this.name = name;\r\n this.dynamic = dynamic;\r\n this.externalizable = externalizable;\r\n this.staticFields = [];\r\n }\r\n}\r\n\r\n/**\r\n * 可序列化对象基类\r\n *\r\n * JavaScript 对象或类如果想要被序列化为\"命名对象\"(带有类名的对象),\r\n * 应该继承这个类。\r\n *\r\n * 编码器会序列化对象的所有字段,除非:\r\n * 1. 字段名以双下划线(__)开头\r\n * 2. 对象定义了 getSerializableFields() 方法来指定要序列化的字段\r\n *\r\n * @example\r\n * ```typescript\r\n * class User extends Serializable {\r\n * public name: string;\r\n * public age: number;\r\n * private __password: string; // 不会被序列化\r\n *\r\n * constructor() {\r\n * super('com.example.User');\r\n * this.name = '';\r\n * this.age = 0;\r\n * this.__password = '';\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class Serializable {\r\n /**\r\n * 对象的类名\r\n * 如果为空或未定义,对象将被视为匿名对象\r\n */\r\n public __class?: string;\r\n\r\n /**\r\n * 是否为动态对象\r\n * - true 或 undefined: 动态编码(key-value 交替写入)\r\n * - false: 静态编码(先写所有 key,再写所有 value)\r\n */\r\n public __dynamic?: boolean;\r\n\r\n /**\r\n * 创建一个可序列化对象\r\n *\r\n * @param serializableName - 对象的类名(可选)\r\n * @param dynamic - 是否为动态对象(可选,默认 true)\r\n */\r\n constructor(serializableName: string = '', dynamic: boolean = true) {\r\n this.__class = serializableName;\r\n this.__dynamic = dynamic;\r\n }\r\n\r\n /**\r\n * 获取应该被序列化的字段列表\r\n *\r\n * 子类可以覆盖此方法来控制哪些字段会被序列化\r\n * 注意:即使字段在此列表中,以双下划线开头的字段仍然会被忽略\r\n *\r\n * @returns 要序列化的字段名数组,如果返回 undefined 则序列化所有字段\r\n *\r\n * @example\r\n * ```typescript\r\n * getSerializableFields(): string[] {\r\n * return ['name', 'age', 'email'];\r\n * }\r\n * ```\r\n */\r\n getSerializableFields?(): string[];\r\n}\r\n\r\n/**\r\n * 可外部化对象基类\r\n *\r\n * 继承此类的对象可以完全控制自己的序列化和反序列化过程。\r\n * 必须实现 write() 实例方法和 read() 静态方法。\r\n *\r\n * 可外部化对象需要通过 AMFDecoder.register() 注册,\r\n * 以便解码器知道如何反序列化它们。\r\n *\r\n * @example\r\n * ```typescript\r\n * class CustomData extends Externalizable {\r\n * public data: Uint8Array;\r\n *\r\n * constructor() {\r\n * super('com.example.CustomData');\r\n * this.data = new Uint8Array(0);\r\n * }\r\n *\r\n * // 自定义序列化\r\n * write(encoder: AMFEncoder): void {\r\n * encoder.writeObject(this.data.length);\r\n * for (const byte of this.data) {\r\n * encoder.writeObject(byte);\r\n * }\r\n * }\r\n *\r\n * // 自定义反序列化(静态方法)\r\n * static read(decoder: AMFDecoder): CustomData {\r\n * const instance = new CustomData();\r\n * const length = decoder.decode();\r\n * instance.data = new Uint8Array(length);\r\n * for (let i = 0; i < length; i++) {\r\n * instance.data[i] = decoder.decode();\r\n * }\r\n * return instance;\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class Externalizable extends Serializable {\r\n /**\r\n * 创建一个可外部化对象\r\n *\r\n * @param externalizableName - 对象的类名\r\n */\r\n constructor(externalizableName?: string) {\r\n super(externalizableName);\r\n }\r\n\r\n /**\r\n * 将对象写入编码器\r\n *\r\n * 子类必须覆盖此方法来实现自定义的序列化逻辑。\r\n * 写入的数据必须能够被对应的 read() 静态方法正确读取。\r\n *\r\n * @param encoder - AMF 编码器实例\r\n * @throws 如果子类没有实现此方法\r\n */\r\n write(encoder: AMFEncoder): void {\r\n throw new Error(`可外部化对象 ${this.__class} 没有定义 write 方法!`);\r\n }\r\n\r\n /**\r\n * 从解码器读取并创建对象实例\r\n *\r\n * 子类必须定义一个同名的静态方法来实现自定义的反序列化逻辑。\r\n * 此方法应该读取 write() 方法写入的数据并返回新的对象实例。\r\n *\r\n * 注意:这是一个静态方法,子类需要像这样定义:\r\n * static read(decoder: AMFDecoder): YourClass { ... }\r\n *\r\n * @param decoder - AMF 解码器实例\r\n * @returns 反序列化后的对象实例\r\n * @throws 如果子类没有实现此方法\r\n */\r\n static read(decoder: AMFDecoder): Externalizable {\r\n throw new Error('可外部化对象没有定义 read 方法!');\r\n }\r\n}\r\n","/**\r\n * AMF 类型定义模块\r\n *\r\n * 本模块定义了 AMF0 和 AMF3 协议中所有的数据类型\r\n * AMF (Action Message Format) 是 Adobe 开发的一种二进制数据序列化格式\r\n * 主要用于 Flash/Flex 应用与服务器之间的数据交换\r\n */\r\n\r\nimport { ForcedTypeValue, Serializable, Externalizable } from './classes';\r\n\r\n/**\r\n * AMF 类型基类\r\n *\r\n * 每种 AMF 数据类型都由这个类的实例表示\r\n * 包含类型的 ID、名称、是否可引用等信息\r\n * 以及编码和解码的方法\r\n */\r\nexport class AMFType {\r\n /** 类型的数字标识符 */\r\n public id: number;\r\n\r\n /** 类型的名称(用于调试和错误信息) */\r\n public name: string;\r\n\r\n /**\r\n * 是否可引用\r\n * 某些复杂类型(如对象、数组)在 AMF 中可以被引用\r\n * 以避免重复序列化相同的对象\r\n */\r\n public referencable: boolean;\r\n\r\n /**\r\n * 编码函数\r\n * 由具体的类型实现设置\r\n * this 上下文指向 AMFEncoder 实例\r\n */\r\n public encode: (this: any, value: any) => void = () => {\r\n throw new Error(`没有为类型 ${this.name} 定义编码器`);\r\n };\r\n\r\n /**\r\n * 解码函数\r\n * 由具体的类型实现设置\r\n * this 上下文指向 AMFDecoder 实例\r\n */\r\n public decode: (this: any) => any = () => {\r\n throw new Error(`没有为类型 ${this.name} 定义解码器`);\r\n };\r\n\r\n /**\r\n * 创建一个新的 AMF 类型\r\n *\r\n * @param id - 类型的数字标识符\r\n * @param name - 类型的名称\r\n * @param referencable - 是否可引用,默认为 false\r\n */\r\n constructor(id: number, name: string, referencable: boolean = false) {\r\n this.id = id;\r\n this.name = name;\r\n this.referencable = referencable;\r\n }\r\n}\r\n\r\n/**\r\n * AMF0 类型定义\r\n *\r\n * AMF0 是 AMF 协议的第一个版本\r\n * 支持基本的数据类型如数字、字符串、对象、数组等\r\n */\r\nexport const AMF0 = {\r\n /**\r\n * 根据 JavaScript 值推断对应的 AMF0 类型\r\n *\r\n * @param value - 要推断类型的值\r\n * @returns 对应的 AMF0 类型\r\n * @throws 如果无法推断类型则抛出错误\r\n */\r\n infer(value: any): AMFType {\r\n const type = typeof value;\r\n\r\n // null 类型\r\n if (value === null) {\r\n return AMF0.NULL;\r\n }\r\n\r\n // undefined 类型\r\n if (type === 'undefined') {\r\n return AMF0.UNDEFINED;\r\n }\r\n\r\n // 强制类型值 - 使用用户指定的类型\r\n if (value instanceof ForcedTypeValue) {\r\n return value.type;\r\n }\r\n\r\n // 数字类型\r\n if (type === 'number') {\r\n return AMF0.NUMBER;\r\n }\r\n\r\n // 布尔类型\r\n if (type === 'boolean') {\r\n return AMF0.BOOLEAN;\r\n }\r\n\r\n // 长字符串(超过 65535 字节)\r\n if (type === 'string' && value.length >= 0xFFFF) {\r\n return AMF0.LONG_STRING;\r\n }\r\n\r\n // 普通字符串\r\n if (type === 'string') {\r\n return AMF0.STRING;\r\n }\r\n\r\n // 日期类型\r\n if (Object.prototype.toString.call(value) === '[object Date]') {\r\n return AMF0.DATE;\r\n }\r\n\r\n // 数组类型\r\n if (value instanceof Array) {\r\n return AMF0.STRICT_ARRAY;\r\n }\r\n\r\n // 可序列化对象(有类名)\r\n if (value instanceof Serializable) {\r\n if (!value.__class || value.__class === '') {\r\n return AMF0.OBJECT;\r\n }\r\n return AMF0.TYPED_OBJECT;\r\n }\r\n\r\n // 普通对象(作为 ECMA 数组处理)\r\n if (type === 'object') {\r\n return AMF0.ECMA_ARRAY;\r\n }\r\n\r\n throw new Error(`无法推断值的 AMF0 类型: ${JSON.stringify(value)}`);\r\n },\r\n\r\n /**\r\n * 根据类型 ID 获取对应的 AMF0 类型\r\n *\r\n * @param id - 类型的数字标识符\r\n * @returns 对应的 AMF0 类型\r\n * @throws 如果找不到对应的类型则抛出错误\r\n */\r\n fromId(id: number): AMFType {\r\n for (const key of Object.keys(AMF0)) {\r\n const type = (AMF0 as any)[key];\r\n if (type instanceof AMFType && type.id === id) {\r\n return type;\r\n }\r\n }\r\n throw new Error(`没有 ID 为 ${id} 的 AMF0 类型`);\r\n },\r\n\r\n /** 数字类型 (0x00) - 64位双精度浮点数 */\r\n NUMBER: new AMFType(0x00, 'NUMBER'),\r\n\r\n /** 布尔类型 (0x01) */\r\n BOOLEAN: new AMFType(0x01, 'BOOLEAN'),\r\n\r\n /** 字符串类型 (0x02) - 最大 65535 字节 */\r\n STRING: new AMFType(0x02, 'STRING'),\r\n\r\n /** 对象类型 (0x03) - 匿名对象 */\r\n OBJECT: new AMFType(0x03, 'OBJECT', true),\r\n\r\n /** MovieClip 类型 (0x04) - Flash 专用,通常不使用 */\r\n MOVIECLIP: new AMFType(0x04, 'MOVIECLIP'),\r\n\r\n /** 空值类型 (0x05) */\r\n NULL: new AMFType(0x05, 'NULL'),\r\n\r\n /** 未定义类型 (0x06) */\r\n UNDEFINED: new AMFType(0x06, 'UNDEFINED'),\r\n\r\n /** 引用类型 (0x07) - 引用之前序列化的对象 */\r\n REFERENCE: new AMFType(0x07, 'REFERENCE'),\r\n\r\n /** ECMA 数组类型 (0x08) - 关联数组/对象 */\r\n ECMA_ARRAY: new AMFType(0x08, 'ECMA_ARRAY', true),\r\n\r\n /** 对象结束标记 (0x09) */\r\n OBJECT_END: new AMFType(0x09, 'OBJECT_END'),\r\n\r\n /** 严格数组类型 (0x0A) - 数字索引数组 */\r\n STRICT_ARRAY: new AMFType(0x0A, 'STRICT_ARRAY', true),\r\n\r\n /** 日期类型 (0x0B) */\r\n DATE: new AMFType(0x0B, 'DATE'),\r\n\r\n /** 长字符串类型 (0x0C) - 超过 65535 字节的字符串 */\r\n LONG_STRING: new AMFType(0x0C, 'LONG_STRING'),\r\n\r\n /** 不支持的类型 (0x0D) */\r\n UNSUPPORTED: new AMFType(0x0D, 'UNSUPPORTED'),\r\n\r\n /** XML 类型 (0x0F) */\r\n XML: new AMFType(0x0F, 'XML'),\r\n\r\n /** 类型化对象 (0x10) - 有类名的对象 */\r\n TYPED_OBJECT: new AMFType(0x10, 'TYPED_OBJECT', true),\r\n\r\n /** AMF3 对象标记 (0x11) - 表示后续数据使用 AMF3 格式 */\r\n AMF3_OBJECT: new AMFType(0x11, 'AMF3_OBJECT')\r\n};\r\n\r\n/**\r\n * AMF3 类型定义\r\n *\r\n * AMF3 是 AMF 协议的第三个版本(跳过了 AMF2)\r\n * 相比 AMF0,它更加紧凑,支持更多的数据类型\r\n * 包括字节数组、向量等\r\n */\r\nexport const AMF3 = {\r\n /**\r\n * 根据 JavaScript 值推断对应的 AMF3 类型\r\n *\r\n * @param value - 要推断类型的值\r\n * @returns 对应的 AMF3 类型\r\n * @throws 如果无法推断类型则抛出错误\r\n */\r\n infer(value: any): AMFType {\r\n const type = typeof value;\r\n\r\n // null 类型\r\n if (value === null) {\r\n return AMF3.NULL;\r\n }\r\n\r\n // undefined 类型\r\n if (type === 'undefined') {\r\n return AMF3.UNDEFINED;\r\n }\r\n\r\n // 强制类型值 - 使用用户指定的类型\r\n if (value instanceof ForcedTypeValue) {\r\n return value.type;\r\n }\r\n\r\n // 布尔类型 - AMF3 中 true 和 false 是不同的类型\r\n if (type === 'boolean' && !value) {\r\n return AMF3.FALSE;\r\n }\r\n if (type === 'boolean') {\r\n return AMF3.TRUE;\r\n }\r\n\r\n // 字符串类型\r\n if (type === 'string') {\r\n return AMF3.STRING;\r\n }\r\n\r\n // 整数类型(29位有符号整数范围内)\r\n // AMF3 INTEGER 范围: -268435456 到 536870911\r\n if (type === 'number'\r\n && isFinite(value)\r\n && value % 1 === 0\r\n && value < 536870911\r\n && value > -268435456) {\r\n return AMF3.INTEGER;\r\n }\r\n\r\n // 双精度浮点数\r\n if (type === 'number') {\r\n return AMF3.DOUBLE;\r\n }\r\n\r\n // 日期类型\r\n if (Object.prototype.toString.call(value) === '[object Date]') {\r\n return AMF3.DATE;\r\n }\r\n\r\n // 字节数组(Uint8Array 在浏览器中替代 Node.js 的 Buffer)\r\n if (value instanceof Uint8Array) {\r\n return AMF3.BYTE_ARRAY;\r\n }\r\n\r\n // 数组类型\r\n if (value instanceof Array) {\r\n return AMF3.ARRAY;\r\n }\r\n\r\n // 可序列化对象或可外部化对象\r\n if (value instanceof Serializable || value instanceof Externalizable) {\r\n return AMF3.OBJECT;\r\n }\r\n\r\n // 普通对象(作为关联数组处理)\r\n if (type === 'object') {\r\n return AMF3.ARRAY;\r\n }\r\n\r\n throw new Error(`无法推断值的 AMF3 类型: ${JSON.stringify(value)}`);\r\n },\r\n\r\n /**\r\n * 根据类型 ID 获取对应的 AMF3 类型\r\n *\r\n * @param id - 类型的数字标识符\r\n * @returns 对应的 AMF3 类型\r\n * @throws 如果找不到对应的类型则抛出错误\r\n */\r\n fromId(id: number): AMFType {\r\n for (const key of Object.keys(AMF3)) {\r\n const type = (AMF3 as any)[key];\r\n if (type instanceof AMFType && type.id === id) {\r\n return type;\r\n }\r\n }\r\n throw new Error(`没有 ID 为 ${id} 的 AMF3 类型`);\r\n },\r\n\r\n /** 未定义类型 (0x00) */\r\n UNDEFINED: new AMFType(0x00, 'UNDEFINED'),\r\n\r\n /** 空值类型 (0x01) */\r\n NULL: new AMFType(0x01, 'NULL'),\r\n\r\n /** 布尔假值 (0x02) */\r\n FALSE: new AMFType(0x02, 'FALSE'),\r\n\r\n /** 布尔真值 (0x03) */\r\n TRUE: new AMFType(0x03, 'TRUE'),\r\n\r\n /** 整数类型 (0x04) - 29位有符号整数 */\r\n INTEGER: new AMFType(0x04, 'INTEGER'),\r\n\r\n /** 双精度浮点数类型 (0x05) */\r\n DOUBLE: new AMFType(0x05, 'DOUBLE'),\r\n\r\n /** 字符串类型 (0x06) */\r\n STRING: new AMFType(0x06, 'STRING', true),\r\n\r\n /** XML 文档类型 (0x07) */\r\n XML_DOC: new AMFType(0x07, 'XML_DOC', true),\r\n\r\n /** 日期类型 (0x08) */\r\n DATE: new AMFType(0x08, 'DATE', true),\r\n\r\n /** 数组类型 (0x09) */\r\n ARRAY: new AMFType(0x09, 'ARRAY', true),\r\n\r\n /** 对象类型 (0x0A) */\r\n OBJECT: new AMFType(0x0A, 'OBJECT', true),\r\n\r\n /** XML 类型 (0x0B) */\r\n XML: new AMFType(0x0B, 'XML', true),\r\n\r\n /** 字节数组类型 (0x0C) */\r\n BYTE_ARRAY: new AMFType(0x0C, 'BYTE_ARRAY', true),\r\n\r\n /** 整数向量类型 (0x0D) */\r\n VECTOR_INT: new AMFType(0x0D, 'VECTOR_INT', true),\r\n\r\n /** 无符号整数向量类型 (0x0E) */\r\n VECTOR_UINT: new AMFType(0x0E, 'VECTOR_UINT', true),\r\n\r\n /** 双精度浮点数向量类型 (0x0F) */\r\n VECTOR_DOUBLE: new AMFType(0x0F, 'VECTOR_DOUBLE', true),\r\n\r\n /** 对象向量类型 (0x10) */\r\n VECTOR_OBJECT: new AMFType(0x10, 'VECTOR_OBJECT', true),\r\n\r\n /** 字典类型 (0x11) */\r\n DICTIONARY: new AMFType(0x11, 'DICTIONARY', true)\r\n};\r\n","/**\r\n * 二进制数据读取器模块\r\n *\r\n * 本模块提供了从二进制数据中读取各种数据类型的功能\r\n * 专为浏览器环境设计,使用 Uint8Array 和 DataView 替代 Node.js 的 Buffer\r\n */\r\n\r\n/**\r\n * AMF 头部信息接口\r\n *\r\n * 在 AMF3 中,许多类型使用一个特殊的头部来表示是定义还是引用\r\n */\r\nexport interface AMFHeader {\r\n /** 是否是定义(true)还是引用(false) */\r\n isDef: boolean;\r\n\r\n /** 头部的值(引用索引或数据长度) */\r\n value: number;\r\n}\r\n\r\n/**\r\n * 二进制数据读取器类\r\n *\r\n * 提供从 Uint8Array 中读取各种二进制数据类型的方法\r\n * 所有多字节数据都使用大端序(Big Endian)读取,这是 AMF 协议的要求\r\n *\r\n * @example\r\n * ```typescript\r\n * const data = new Uint8Array([0x00, 0x01, 0x02, 0x03]);\r\n * const reader = new Reader(data);\r\n * const byte = reader.readByte(); // 0x00\r\n * const uint16 = reader.readUInt16BE(); // 0x0102\r\n * ```\r\n */\r\nexport class Reader {\r\n /** 要读取的二进制数据 */\r\n protected data: Uint8Array;\r\n\r\n /** 用于读取多字节数据的 DataView */\r\n protected view: DataView;\r\n\r\n /** 当前读取位置 */\r\n protected position: number;\r\n\r\n /**\r\n * 创建一个新的读取器\r\n *\r\n * @param data - 要读取的二进制数据\r\n */\r\n constructor(data: Uint8Array) {\r\n this.data = data;\r\n this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n this.position = 0;\r\n }\r\n\r\n /**\r\n * 获取当前读取位置\r\n *\r\n * @returns 当前位置(字节偏移量)\r\n */\r\n getPosition(): number {\r\n return this.position;\r\n }\r\n\r\n /**\r\n * 设置读取位置\r\n *\r\n * @param pos - 新的位置\r\n */\r\n setPosition(pos: number): void {\r\n this.position = pos;\r\n }\r\n\r\n /**\r\n * 获取剩余可读字节数\r\n *\r\n * @returns 剩余字节数\r\n */\r\n getBytesAvailable(): number {\r\n return this.data.length - this.position;\r\n }\r\n\r\n /**\r\n * 检查是否还有足够的字节可读\r\n *\r\n * @param length - 需要的字节数\r\n * @throws 如果剩余字节不足\r\n */\r\n private checkAvailable(length: number): void {\r\n if (this.position + length > this.data.length) {\r\n throw new Error(`没有足够的 ${length} 字节可读,当前位置: ${this.position},总长度: ${this.data.length}`);\r\n }\r\n }\r\n\r\n /**\r\n * 读取一个或多个字节\r\n *\r\n * @param length - 要读取的字节数,默认为 1\r\n * @param alwaysReturnArray - 即使只读取一个字节也返回 Uint8Array\r\n * @returns 如果 length 为 1 且 alwaysReturnArray 为 false,返回单个数字;否则返回 Uint8Array\r\n */\r\n readByte(length: number = 1, alwaysReturnArray: boolean = false): number | Uint8Array {\r\n this.checkAvailable(length);\r\n\r\n if (length === 1 && !alwaysReturnArray) {\r\n // 读取单个字节,返回数字\r\n return this.data[this.position++];\r\n }\r\n\r\n // 读取多个字节,返回 Uint8Array\r\n const result = this.data.slice(this.position, this.position + length);\r\n this.position += length;\r\n return result;\r\n }\r\n\r\n /**\r\n * 读取一个无符号 8 位整数\r\n *\r\n * @returns 0-255 范围内的整数\r\n */\r\n readUInt8(): number {\r\n this.checkAvailable(1);\r\n return this.data[this.position++];\r\n }\r\n\r\n /**\r\n * 读取一个有符号 8 位整数\r\n *\r\n * @returns -128 到 127 范围内的整数\r\n */\r\n readInt8(): number {\r\n const value = this.readUInt8();\r\n return value > 127 ? value - 256 : value;\r\n }\r\n\r\n /**\r\n * 读取一个大端序无符号 16 位整数\r\n *\r\n * @returns 0-65535 范围内的整数\r\n */\r\n readUInt16BE(): number {\r\n this.checkAvailable(2);\r\n const value = this.view.getUint16(this.position, false); // false = 大端序\r\n this.position += 2;\r\n return value;\r\n }\r\n\r\n /**\r\n * 读取一个大端序有符号 16 位整数\r\n *\r\n * @returns -32768 到 32767 范围内的整数\r\n */\r\n readInt16BE(): number {\r\n this.checkAvailable(2);\r\n const value = this.view.getInt16(this.position, false);\r\n this.position += 2;\r\n return value;\r\n }\r\n\r\n /**\r\n * 读取一个大端序无符号 32 位整数\r\n *\r\n * @returns 0-4294967295 范围内的整数\r\n */\r\n readUInt32BE(): number {\r\n this.checkAvailable(4);\r\n const value = this.view.getUint32(this.position, false);\r\n this.position += 4;\r\n return value;\r\n }\r\n\r\n /**\r\n * 读取一个大端序有符号 32 位整数\r\n *\r\n * @returns -2147483648 到 2147483647 范围内的整数\r\n */\r\n readInt32BE(): number {\r\n this.checkAvailable(4);\r\n const value = this.view.getInt32(this.position, false);\r\n this.position += 4;\r\n return value;\r\n }\r\n\r\n /**\r\n * 读取一个大端序 64 位双精度浮点数\r\n *\r\n * @returns 双精度浮点数\r\n */\r\n readDoubleBE(): number {\r\n this.checkAvailable(8);\r\n const value = this.view.getFloat64(this.position, false);\r\n this.position += 8;\r\n return value;\r\n }\r\n\r\n /**\r\n * 读取一个 AMF0 格式的字符串\r\n *\r\n * AMF0 字符串格式:2字节长度 + UTF-8 编码的字符串数据\r\n *\r\n * @returns 解码后的字符串\r\n */\r\n readString(): string {\r\n const length = this.readUInt16BE();\r\n if (length === 0) {\r\n return '';\r\n }\r\n return this.readUTF8String(length);\r\n }\r\n\r\n /**\r\n * 读取指定长度的 UTF-8 字符串\r\n *\r\n * @param length - 字符串的字节长度\r\n * @returns 解码后的字符串\r\n */\r\n readUTF8String(length: number): string {\r\n this.checkAvailable(length);\r\n const bytes = this.data.slice(this.position, this.position + length);\r\n this.position += length;\r\n\r\n // 使用 TextDecoder 将 UTF-8 字节解码为字符串\r\n const decoder = new TextDecoder('utf-8');\r\n return decoder.decode(bytes);\r\n }\r\n\r\n /**\r\n * 读取 AMF3 的变长整数(Int29)\r\n *\r\n * AMF3 使用一种可变长度编码来表示 29 位有符号整数\r\n * 每个字节的最高位表示是否还有更多字节:\r\n * - 0xxxxxxx: 单字节,值 0-127\r\n * - 1xxxxxxx 0xxxxxxx: 双字节\r\n * - 1xxxxxxx 1xxxxxxx 0xxxxxxx: 三字节\r\n * - 1xxxxxxx 1xxxxxxx 1xxxxxxx xxxxxxxx: 四字节(最后一个字节使用全部 8 位)\r\n *\r\n * @returns 29 位有符号整数,范围 -268435456 到 536870911\r\n */\r\n readInt29(): number {\r\n let total = 0;\r\n let byte = this.readUInt8();\r\n\r\n // 第一个字节\r\n if (byte < 128) {\r\n return byte;\r\n }\r\n\r\n // 第二个字节\r\n total = (byte & 0x7f) << 7;\r\n byte = this.readUInt8();\r\n\r\n if (byte < 128) {\r\n total |= byte;\r\n } else {\r\n // 第三个字节\r\n total = (total | (byte & 0x7f)) << 7;\r\n byte = this.readUInt8();\r\n\r\n if (byte < 128) {\r\n total |= byte;\r\n } else {\r\n // 第四个字节(使用全部 8 位)\r\n total = (total | (byte & 0x7f)) << 8;\r\n total |= this.readUInt8();\r\n }\r\n }\r\n\r\n // 处理符号位(29 位有符号整数)\r\n // 如果第 29 位是 1,则是负数\r\n return -(total & (1 << 28)) | total;\r\n }\r\n\r\n /**\r\n * 读取 AMF3 头部信息\r\n *\r\n * AMF3 中很多类型使用一个头部来区分是定义还是引用:\r\n * - 最低位为 0: 这是一个引用,高位存储引用索引\r\n * - 最低位为 1: 这是一个定义,高位存储数据长度或其他信息\r\n *\r\n * @returns AMF 头部信息对象\r\n */\r\n readAMFHeader(): AMFHeader {\r\n const handle = this.readInt29();\r\n const isDef = (handle & 1) !== 0;\r\n const value = handle >> 1;\r\n\r\n return {\r\n isDef,\r\n value\r\n };\r\n }\r\n}\r\n","/**\n * AMF3 解码器模块\n *\n * 仅实现 AMF3,并使用类方法进行分发解码(不依赖给类型对象动态挂方法)。\n * 全部基于浏览器可用的 Uint8Array / TextDecoder。\n */\n\nimport { AMFType } from './types';\nimport { AMFTrait, Serializable } from './classes';\nimport { Reader } from './reader';\n\n/**\n * 可外部化对象静态读取接口\n */\ninterface ExternalizableReader {\n read(decoder: AMFDecoder): any;\n}\n\n/**\n * AMF3 解码器\n */\nexport class AMFDecoder extends Reader {\n /** AMF3 外部化对象注册表 */\n static amf3Externalizables: Record<string, ExternalizableReader> = {};\n\n /** AMF3 字符串引用表 */\n private amf3StringReferences: string[];\n\n /** AMF3 对象引用表 */\n private amf3ObjectReferences: any[];\n\n /** AMF3 Trait 引用表 */\n private amf3TraitReferences: AMFTrait[];\n\n /**\n * 注册外部化类型\n */\n static register(className: string, cls: ExternalizableReader): void {\n this.amf3Externalizables[className] = cls;\n }\n\n constructor(data: Uint8Array) {\n super(data);\n this.amf3StringReferences = [];\n this.amf3ObjectReferences = [];\n this.amf3TraitReferences = [];\n }\n\n /**\n * 解码一个 AMF3 值\n */\n decode(): any {\n const typeId = this.readUInt8();\n return this.readByTypeId(typeId);\n }\n\n /**\n * 按 AMF3 类型对象解码(兼容接口)\n */\n deserialize(type: number | AMFType): any {\n if (type instanceof AMFType) {\n return this.readByTypeId(type.id);\n }\n return this.readByTypeId(type);\n }\n\n /**\n * 按类型 ID 分发解码\n */\n private readByTypeId(typeId: number): any {\n switch (typeId) {\n case 0x00: // UNDEFINED\n return undefined;\n case 0x01: // NULL\n return null;\n case 0x02: // FALSE\n return false;\n case 0x03: // TRUE\n return true;\n case 0x04: // INTEGER\n return this.readInt29();\n case 0x05: // DOUBLE\n return this.readDoubleBE();\n case 0x06: // STRING\n return this.readAMF3String();\n case 0x08: // DATE\n return this.readAMF3Date();\n case 0x09: // ARRAY\n return this.readAMF3Array();\n case 0x0A: // OBJECT\n return this.readAMF3Object();\n case 0x0C: // BYTE_ARRAY\n return this.readAMF3ByteArray();\n case 0x0D: // VECTOR_INT\n return this.readAMF3VectorInt();\n case 0x0E: // VECTOR_UINT\n return this.readAMF3VectorUInt();\n case 0x0F: // VECTOR_DOUBLE\n return this.readAMF3VectorDouble();\n case 0x10: // VECTOR_OBJECT\n return this.readAMF3VectorObject();\n case 0x11: // DICTIONARY\n return this.readAMF3Dictionary();\n default:\n throw new Error('当前 AMF3 解码器暂不支持类型 ID: ' + typeId);\n }\n }\n\n /**\n * 读取 AMF3 字符串\n * \n * todo 字符串过长时可能有bug? 当前读长读,用的是u29的方式\n */\n private readAMF3String(): string {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3StringReferences[header.value];\n if (typeof ref !== 'string') {\n throw new Error('无效的 AMF3 字符串引用');\n }\n return ref;\n }\n\n if (header.value === 0) {\n return '';\n }\n\n const value = this.readUTF8String(header.value);\n this.amf3StringReferences.push(value);\n return value;\n }\n\n /**\n * 读取 AMF3 日期\n */\n private readAMF3Date(): Date {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!(ref instanceof Date)) {\n throw new Error('无效的 AMF3 日期引用');\n }\n return ref;\n }\n\n const value = new Date(this.readDoubleBE());\n this.amf3ObjectReferences.push(value);\n return value;\n }\n\n /**\n * 读取 AMF3 数组\n */\n private readAMF3Array(): any[] | Record<string, any> {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!ref) {\n throw new Error('无效的 AMF3 数组引用');\n }\n return ref;\n }\n\n const named: Record<string, any> = {};\n this.amf3ObjectReferences.push(named);\n const idx = this.amf3ObjectReferences.length - 1;\n\n while (true) {\n const key = this.readAMF3String();\n if (key === '') {\n break;\n }\n named[key] = this.decode();\n }\n\n if (Object.keys(named).length > 0) {\n // 与 lib 行为保持一致:有命名字段时直接按对象返回\n return named;\n }\n\n const dense: any[] = [];\n this.amf3ObjectReferences[idx] = dense;\n for (let i = 0; i < header.value; i++) {\n dense.push(this.decode());\n }\n return dense;\n }\n\n /**\n * 读取 AMF3 对象 Trait\n */\n private readAMF3ObjectTrait(flags: number): AMFTrait {\n if ((flags & 1) === 0) {\n const trait = this.amf3TraitReferences[flags >> 1];\n if (!trait) {\n throw new Error('无效的 AMF3 Trait 引用');\n }\n return trait;\n }\n\n const name = this.readAMF3String();\n const isExternalizable = ((flags >> 1) & 1) === 1;\n const isDynamic = ((flags >> 2) & 1) === 1;\n const staticKeyLen = flags >> 3;\n\n const trait = new AMFTrait(name, isDynamic, isExternalizable);\n for (let i = 0; i < staticKeyLen; i++) {\n trait.staticFields.push(this.readAMF3String());\n }\n\n this.amf3TraitReferences.push(trait);\n return trait;\n }\n\n /**\n * 读取 AMF3 对象\n */\n private readAMF3Object(): any {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!ref) {\n throw new Error('无效的 AMF3 对象引用');\n }\n return ref;\n }\n\n const trait = this.readAMF3ObjectTrait(header.value);\n if (trait.externalizable) {\n if (trait.name === 'flex.messaging.io.ArrayCollection') {\n const arr = this.decode();\n this.amf3ObjectReferences.push(arr);\n return arr;\n }\n\n const ext = AMFDecoder.amf3Externalizables[trait.name];\n if (!ext) {\n throw new Error('未注册 AMF3 外部化类型: ' + trait.name);\n }\n\n const extObj = ext.read(this);\n this.amf3ObjectReferences.push(extObj);\n return extObj;\n }\n\n // 处理普通对象(可能带类名) \n const result = new Serializable(\n trait.name || undefined, trait.dynamic || true\n ) as Record<string, any>;\n this.amf3ObjectReferences.push(result);\n\n for (let i = 0; i < trait.staticFields.length; i++) {\n const field = trait.staticFields[i];\n result[field] = this.decode();\n }\n\n if (trait.dynamic) {\n while (true) {\n const key = this.readAMF3String();\n if (key === '') {\n break;\n }\n result[key] = this.decode();\n }\n }\n\n return result;\n }\n\n /**\n * 读取 AMF3 ByteArray\n */\n private readAMF3ByteArray(): Uint8Array {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!(ref instanceof Uint8Array)) {\n throw new Error('无效的 AMF3 ByteArray 引用');\n }\n return ref;\n }\n\n const bytes = this.readByte(header.value, true) as Uint8Array;\n this.amf3ObjectReferences.push(bytes);\n return bytes;\n }\n\n /**\n * 向量解码通用逻辑\n */\n private readAMF3Vector<T>(reader: () => T): T[] {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!ref) {\n throw new Error('无效的 AMF3 向量引用');\n }\n return ref as T[];\n }\n\n this.readUInt8(); // fixed 标记\n const result: T[] = [];\n this.amf3ObjectReferences.push(result);\n for (let i = 0; i < header.value; i++) {\n result.push(reader.call(this));\n }\n return result;\n }\n\n /**\n * 读取 VECTOR_INT\n */\n private readAMF3VectorInt(): number[] {\n return this.readAMF3Vector<number>(function readInt(this: AMFDecoder): number {\n return this.readInt32BE();\n });\n }\n\n /**\n * 读取 VECTOR_UINT\n */\n private readAMF3VectorUInt(): number[] {\n return this.readAMF3Vector<number>(function readUInt(this: AMFDecoder): number {\n return this.readUInt32BE();\n });\n }\n\n /**\n * 读取 VECTOR_DOUBLE\n */\n private readAMF3VectorDouble(): number[] {\n return this.readAMF3Vector<number>(function readDouble(this: AMFDecoder): number {\n return this.readDoubleBE();\n });\n }\n\n /**\n * 读取 VECTOR_OBJECT\n */\n private readAMF3VectorObject(): any[] {\n return this.readAMF3Vector<any>(function readObject(this: AMFDecoder): any {\n return this.decode();\n });\n }\n\n /**\n * 读取 DICTIONARY\n */\n private readAMF3Dictionary(): Record<string, any> {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!ref) {\n throw new Error('无效的 AMF3 字典引用');\n }\n return ref;\n }\n\n this.readUInt8(); // weakKeys 标记\n const result: Record<string, any> = {};\n this.amf3ObjectReferences.push(result);\n\n for (let i = 0; i < header.value; i++) {\n const key = this.decode();\n result[JSON.stringify(key)] = this.decode();\n }\n return result;\n }\n}\n\nexport default AMFDecoder;\n","/**\r\n * 二进制数据写入器模块\r\n *\r\n * 本模块提供了向二进制缓冲区写入各种数据类型的功能\r\n * 专为浏览器环境设计,使用 Uint8Array 和 DataView 替代 Node.js 的 Buffer\r\n */\r\n\r\n/**\r\n * 二进制数据写入器类\r\n *\r\n * 提供向动态增长的缓冲区写入各种二进制数据类型的方法\r\n * 所有多字节数据都使用大端序(Big Endian)写入,这是 AMF 协议的要求\r\n *\r\n * @example\r\n * ```typescript\r\n * const writer = new Writer();\r\n * writer.writeByte(0x01);\r\n * writer.writeUInt16BE(0x0203);\r\n * writer.writeDoubleBE(3.14159);\r\n * const result = writer.getBuffer();\r\n * ```\r\n */\r\nexport class Writer {\r\n /** 内部缓冲区数组,用于动态收集写入的数据 */\r\n private chunks: Uint8Array[];\r\n\r\n /** 当前已写入的总字节数 */\r\n private totalLength: number;\r\n\r\n /**\r\n * 创建一个新的写入器\r\n */\r\n constructor() {\r\n this.chunks = [];\r\n this.totalLength = 0;\r\n }\r\n\r\n /**\r\n * 获取当前已写入的字节数\r\n *\r\n * @returns 已写入的总字节数\r\n */\r\n getLength(): number {\r\n return this.totalLength;\r\n }\r\n\r\n /**\r\n * 获取写入的所有数据\r\n *\r\n * 将所有写入的数据块合并为一个 Uint8Array\r\n *\r\n * @returns 包含所有写入数据的 Uint8Array\r\n */\r\n getBuffer(): Uint8Array {\r\n // 创建一个足够大的缓冲区\r\n const result = new Uint8Array(this.totalLength);\r\n let offset = 0;\r\n\r\n // 将所有数据块复制到结果缓冲区\r\n for (const chunk of this.chunks) {\r\n result.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 清空写入器,重置到初始状态\r\n */\r\n clear(): void {\r\n this.chunks = [];\r\n this.totalLength = 0;\r\n }\r\n\r\n /**\r\n * 写入数据到缓冲区\r\n *\r\n * 支持多种数据类型:\r\n * - 数字(0-255):作为单个字节写入\r\n * - 数字数组:每个元素作为一个字节写入\r\n * - Uint8Array:直接写入\r\n * - 字符串:作为 UTF-8 编码写入\r\n *\r\n * @param value - 要写入的值\r\n * @throws 如果值的类型不支持\r\n */\r\n write(value: number | number[] | Uint8Array | string): void {\r\n\r\n if (typeof value === 'number') {\r\n // 单个字节\r\n const chunk = new Uint8Array([value & 0xff]);\r\n this.chunks.push(chunk);\r\n this.totalLength += 1;\r\n } else if (Array.isArray(value)) {\r\n // 数字数组,每个元素作为一个字节\r\n const chunk = new Uint8Array(value.map(v => v & 0xff));\r\n this.chunks.push(chunk);\r\n this.totalLength += chunk.length;\r\n } else if (value instanceof Uint8Array) {\r\n // Uint8Array 直接写入\r\n this.chunks.push(value as Uint8Array);\r\n this.totalLength += value.length;\r\n } else if (typeof value === 'string') {\r\n // 字符串作为 UTF-8 编码写入\r\n const encoder = new TextEncoder();\r\n const chunk = encoder.encode(value);\r\n this.chunks.push(chunk);\r\n this.totalLength += chunk.length;\r\n } else {\r\n throw new Error(`不知道如何写入: ${JSON.stringify(value)}`);\r\n }\r\n }\r\n\r\n /**\r\n * 写入单个字节\r\n *\r\n * @param value - 0-255 范围内的整数\r\n */\r\n writeByte(value: number): void {\r\n this.write(value & 0xff);\r\n }\r\n\r\n /**\r\n * 写入字节数组\r\n *\r\n * @param bytes - 字节数组或 Uint8Array\r\n */\r\n writeBytes(bytes: number[] | Uint8Array): void {\r\n this.write(bytes);\r\n }\r\n\r\n /**\r\n * 写入一个大端序无符号 16 位整数\r\n *\r\n * @param value - 0-65535 范围内的整数\r\n */\r\n writeUInt16BE(value: number): void {\r\n const buffer = new Uint8Array(2);\r\n const view = new DataView(buffer.buffer);\r\n view.setUint16(0, value, false); // false = 大端序\r\n this.write(buffer);\r\n }\r\n\r\n /**\r\n * 写入一个大端序有符号 16 位整数\r\n *\r\n * @param value - -32768 到 32767 范围内的整数\r\n */\r\n writeInt16BE(value: number): void {\r\n const buffer = new Uint8Array(2);\r\n const view = new DataView(buffer.buffer);\r\n view.setInt16(0, value, false);\r\n this.write(buffer);\r\n }\r\n\r\n /**\r\n * 写入一个大端序无符号 32 位整数\r\n *\r\n * @param value - 0-4294967295 范围内的整数\r\n */\r\n writeUInt32BE(value: number): void {\r\n const buffer = new Uint8Array(4);\r\n const view = new DataView(buffer.buffer);\r\n view.setUint32(0, value, false);\r\n this.write(buffer);\r\n }\r\n\r\n /**\r\n * 写入一个大端序有符号 32 位整数\r\n *\r\n * @param value - -2147483648 到 2147483647 范围内的整数\r\n */\r\n writeInt32BE(value: number): void {\r\n const buffer = new Uint8Array(4);\r\n const view = new DataView(buffer.buffer);\r\n view.setInt32(0, value, false);\r\n this.write(buffer);\r\n }\r\n\r\n /**\r\n * 写入一个大端序 64 位双精度浮点数\r\n *\r\n * @param value - 双精度浮点数\r\n */\r\n writeDoubleBE(value: number): void {\r\n const buffer = new Uint8Array(8);\r\n const view = new DataView(buffer.buffer);\r\n view.setFloat64(0, value, false);\r\n this.write(buffer);\r\n }\r\n\r\n /**\r\n * 写入一个 AMF0 格式的字符串\r\n *\r\n * AMF0 字符串格式:2字节长度(大端序)+ UTF-8 编码的字符串数据\r\n *\r\n * @param value - 要写入的字符串\r\n */\r\n writeString(value: string): void {\r\n const encoder = new TextEncoder();\r\n const bytes = encoder.encode(value);\r\n this.writeUInt16BE(bytes.length);\r\n this.write(bytes);\r\n }\r\n\r\n /**\r\n * 写入 AMF3 的变长整数(Int29)\r\n *\r\n * AMF3 使用一种可变长度编码来表示 29 位有符号整数\r\n * 每个字节的最高位表示是否还有更多字节:\r\n * - 值 0-127: 单字节 (0xxxxxxx)\r\n * - 值 128-16383: 双字节 (1xxxxxxx 0xxxxxxx)\r\n * - 值 16384-2097151: 三字节 (1xxxxxxx 1xxxxxxx 0xxxxxxx)\r\n * - 值 2097152-536870911: 四字节 (1xxxxxxx 1xxxxxxx 1xxxxxxx xxxxxxxx)\r\n *\r\n * @param value - 29 位有符号整数,范围 -268435456 到 536870911\r\n * @throws 如果值超出范围\r\n */\r\n writeInt29(value: number): void {\r\n // 检查范围\r\n if (value > 536870911 || value < -268435456) {\r\n throw new RangeError(`Int29 值超出范围: ${value}`);\r\n }\r\n\r\n // 处理负数:转换为无符号形式\r\n value &= 0x1fffffff;\r\n\r\n if (value < 0x80) {\r\n // 单字节\r\n this.write(value);\r\n } else if (value < 0x4000) {\r\n // 双字节\r\n this.write([\r\n (value >> 7 & 0x7f) | 0x80,\r\n value & 0x7f\r\n ]);\r\n } else if (value < 0x200000) {\r\n // 三字节\r\n this.write([\r\n (value >> 14 & 0x7f) | 0x80,\r\n (value >> 7 & 0x7f) | 0x80,\r\n value & 0x7f\r\n ]);\r\n } else {\r\n // 四字节\r\n this.write([\r\n (value >> 22 & 0x7f) | 0x80,\r\n (value >> 14 & 0x7f) | 0x80,\r\n (value >> 7 & 0x7f) | 0x80,\r\n value & 0xff\r\n ]);\r\n }\r\n }\r\n}\r\n","/**\n * AMF3 编码器模块\n *\n * 仅实现 AMF3,并使用类方法进行分发编码(不依赖给类型对象动态挂方法)。\n * 全部基于浏览器可用的 Uint8Array / TextEncoder。\n */\n\nimport { AMF3, AMFType } from './types';\nimport { Externalizable, ForcedTypeValue } from './classes';\nimport { Writer } from './writer';\n\n/**\n * 提取对象可序列化字段名\n */\nfunction getSerializableKeys(value: Record<string, any>): string[] {\n const keys = typeof value.getSerializableFields === 'function'\n ? value.getSerializableFields()\n : Object.keys(value);\n return keys.filter(function filterInternal(key: string): boolean {\n return key.indexOf('__') !== 0;\n });\n}\n\n/**\n * AMF3 编码器\n */\nexport class AMFEncoder extends Writer {\n /** AMF3 对象引用表 */\n private amf3ObjectReferences: any[];\n\n /** AMF3 字符串引用表 */\n private amf3StringReferences: string[];\n\n constructor() {\n super();\n this.amf3ObjectReferences = [];\n this.amf3StringReferences = [];\n }\n\n /**\n * 编码一个 AMF3 值(会写入类型标记)\n */\n writeObject(value: any): void {\n this.encodeValue(value);\n }\n\n /**\n * 兼容旧接口,含义与 writeObject 相同\n */\n encode(value: any): void {\n this.encodeValue(value);\n }\n\n /**\n * 编码值主体(无类型标记)\n */\n serialize(value: any): void {\n const type = this.inferType(value);\n this.writeByType(value instanceof ForcedTypeValue ? value.value : value, type);\n }\n\n /**\n * 推断值的 AMF3 类型\n */\n private inferType(value: any): AMFType {\n return AMF3.infer(value);\n }\n\n /**\n * 编码一个完整值(含类型标记与引用处理)\n */\n private encodeValue(value: any): void {\n const type = this.inferType(value);\n const realValue = value instanceof ForcedTypeValue ? value.value : value;\n\n if (type.referencable && realValue !== '') {\n let index = -1;\n if (type === AMF3.STRING) {\n index = this.amf3StringReferences.indexOf(realValue);\n } else {\n index = this.amf3ObjectReferences.indexOf(realValue);\n }\n\n if (index !== -1) {\n this.writeByte(type.id);\n this.writeInt29(index << 1);\n return;\n }\n\n if (type === AMF3.STRING) {\n this.amf3StringReferences.push(realValue);\n } else {\n this.amf3ObjectReferences.push(realValue);\n }\n }\n\n this.writeByte(type.id);\n this.writeByType(realValue, type);\n }\n\n /**\n * 按类型写入值主体(不包含类型标记)\n */\n private writeByType(value: any, type: AMFType): void {\n switch (type.id) {\n case 0x00: // UNDEFINED\n case 0x01: // NULL\n case 0x02: // FALSE\n case 0x03: // TRUE\n return;\n case 0x04: // INTEGER\n this.writeInt29(value);\n return;\n case 0x05: // DOUBLE\n this.writeDoubleBE(value);\n return;\n case 0x06: // STRING\n this.writeInlineString(value);\n return;\n case 0x08: // DATE\n this.writeInt29(1);\n this.writeDoubleBE((value as Date).getTime());\n return;\n case 0x09: // ARRAY\n this.writeArray(value);\n return;\n case 0x0A: // OBJECT\n this.writeObjectValue(value);\n return;\n case 0x0C: // BYTE_ARRAY\n this.writeByteArray(value);\n return;\n default:\n throw new Error('当前 AMF3 编码器暂不支持该类型: ' + type.name);\n }\n }\n\n /**\n * 写入 AMF3 内联字符串(无类型标记)\n *\n * 说明:\n * 这里保持与原 lib 行为一致,不在“无类型字符串”分支中做字符串引用表复用。\n */\n private writeInlineString(value: string): void {\n const bytes = new TextEncoder().encode(value);\n this.writeInt29((bytes.length << 1) | 1);\n this.write(bytes);\n }\n\n /**\n * 写入 AMF3 数组(密集数组或关联数组)\n */\n private writeArray(value: any[] | Record<string, any>): void {\n if (Array.isArray(value)) {\n this.writeInt29((value.length << 1) | 1);\n this.writeInlineString('');\n for (let i = 0; i < value.length; i++) {\n this.encodeValue(value[i]);\n }\n return;\n }\n\n this.writeInt29(0x01);\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key.indexOf('__') === 0) {\n continue;\n }\n this.writeInlineString(key);\n this.encodeValue((value as Record<string, any>)[key]);\n }\n this.writeInlineString('');\n }\n\n /**\n * 写入 AMF3 对象\n */\n private writeObjectValue(value: Record<string, any>): void {\n // 判断是否按动态对象编码\n // __dynamic 为 false 时强制静态编码,否则无 __class 时为动态\n const isDynamic = value.__dynamic !== false && !value.__class;\n\n if (isDynamic) {\n this.writeInt29(0x0b);\n this.writeInt29(0x01);\n\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key.indexOf('__') === 0) {\n continue;\n }\n //key和value交替写入\n this.writeInlineString(key);\n this.encodeValue(value[key]);\n }\n this.writeInlineString('');\n return;\n }\n // 静态编码\n const externalizable = value instanceof Externalizable;\n const keys = externalizable ? [] : getSerializableKeys(value);\n\n let header = keys.length << 4;\n header |= (externalizable ? 1 : 0) << 2;\n header = (header | 2) | 1;\n\n this.writeInt29(header);\n this.writeInlineString(value.__class || '');\n\n if (externalizable) {\n (value as Externalizable).write(this);\n return;\n }\n // key\n for (let i = 0; i < keys.length; i++) {\n this.writeInlineString(keys[i]);\n }\n // value\n for (let i = 0; i < keys.length; i++) {\n this.encodeValue(value[keys[i]]);\n }\n }\n\n /**\n * 写入 AMF3 ByteArray\n */\n private writeByteArray(value: Uint8Array): void {\n this.writeInt29((value.length << 1) | 1);\n this.write(value);\n }\n}\n\nexport default AMFEncoder;\n"],"names":["ForcedTypeValue","value","type","AMFTrait","name","dynamic","externalizable","Serializable","serializableName","Externalizable","externalizableName","encoder","decoder","AMFType","id","referencable","AMF0","key","AMF3","Reader","data","pos","length","alwaysReturnArray","result","bytes","total","byte","handle","isDef","_AMFDecoder","className","cls","typeId","header","ref","named","idx","dense","i","flags","trait","isExternalizable","isDynamic","staticKeyLen","arr","ext","extObj","field","reader","AMFDecoder","Writer","offset","chunk","v","buffer","getSerializableKeys","AMFEncoder","realValue","index","keys"],"mappings":"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"}
1
+ {"version":3,"file":"amf.js","sources":["../src/classes.ts","../src/types.ts","../src/reader.ts","../src/decoder.ts","../src/writer.ts","../src/encoder.ts"],"sourcesContent":["/**\r\n * AMF 辅助类模块\r\n *\r\n * 本模块定义了 AMF 序列化过程中使用的辅助类\r\n * 包括强制类型值、对象特征、可序列化对象和可外部化对象\r\n */\r\n\r\nimport type { AMFType } from './types.js';\r\nimport type { AMFEncoder } from './encoder.js';\r\nimport type { AMFDecoder } from './decoder.js';\r\n\r\n/**\r\n * 强制类型值类\r\n *\r\n * 允许用户强制指定一个值应该被编码为特定的 AMF 类型\r\n * 而不是由编码器自动推断类型\r\n *\r\n * @example\r\n * ```typescript\r\n * // 强制将数字编码为 AMF3 的 DOUBLE 类型而不是 INTEGER\r\n * const forcedDouble = new ForcedTypeValue(42, AMF3.DOUBLE);\r\n * encoder.writeObject(forcedDouble);\r\n * ```\r\n */\r\nexport class ForcedTypeValue {\r\n /** 实际要编码的值 */\r\n public value: any;\r\n\r\n /** 强制使用的 AMF 类型 */\r\n public type: AMFType;\r\n\r\n /**\r\n * 创建一个强制类型值\r\n *\r\n * @param value - 实际要编码的值\r\n * @param type - 强制使用的 AMF 类型\r\n */\r\n constructor(value: any, type: AMFType) {\r\n this.value = value;\r\n this.type = type;\r\n }\r\n}\r\n\r\n/**\r\n * AMF3 对象特征类\r\n *\r\n * 用于描述 AMF3 对象的元数据信息\r\n * 包括类名、是否为动态对象、是否可外部化、以及静态字段列表\r\n *\r\n * 在 AMF3 中,对象特征可以被引用以减少数据大小\r\n * 当多个相同类型的对象被序列化时,只需要序列化一次特征信息\r\n */\r\nexport class AMFTrait {\r\n /** 对象的类名(可以为空表示匿名对象) */\r\n public name: string;\r\n\r\n /**\r\n * 是否为动态对象\r\n * 动态对象可以有任意的属性,而非动态对象只能有预定义的静态属性\r\n */\r\n public dynamic: boolean;\r\n\r\n /**\r\n * 是否可外部化\r\n * 可外部化对象需要自己控制序列化和反序列化过程\r\n */\r\n public externalizable: boolean;\r\n\r\n /** 静态字段名列表 */\r\n public staticFields: string[];\r\n\r\n /**\r\n * 创建一个 AMF3 对象特征\r\n *\r\n * @param name - 对象的类名\r\n * @param dynamic - 是否为动态对象\r\n * @param externalizable - 是否可外部化\r\n */\r\n constructor(name: string, dynamic: boolean, externalizable: boolean) {\r\n this.name = name;\r\n this.dynamic = dynamic;\r\n this.externalizable = externalizable;\r\n this.staticFields = [];\r\n }\r\n}\r\n\r\n/**\r\n * 可序列化对象基类\r\n *\r\n * JavaScript 对象或类如果想要被序列化为\"命名对象\"(带有类名的对象),\r\n * 应该继承这个类。\r\n *\r\n * 编码器会序列化对象的所有字段,除非:\r\n * 1. 字段名以双下划线(__)开头\r\n * 2. 对象定义了 getSerializableFields() 方法来指定要序列化的字段\r\n *\r\n * @example\r\n * ```typescript\r\n * class User extends Serializable {\r\n * public name: string;\r\n * public age: number;\r\n * private __password: string; // 不会被序列化\r\n *\r\n * constructor() {\r\n * super('com.example.User');\r\n * this.name = '';\r\n * this.age = 0;\r\n * this.__password = '';\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class Serializable {\r\n /**\r\n * 对象的类名\r\n * 如果为空或未定义,对象将被视为匿名对象\r\n */\r\n public __class?: string;\r\n\r\n /**\r\n * 是否为动态对象\r\n * - true 或 undefined: 动态编码(key-value 交替写入)\r\n * - false: 静态编码(先写所有 key,再写所有 value)\r\n */\r\n public __dynamic?: boolean;\r\n\r\n /**\r\n * 创建一个可序列化对象\r\n *\r\n * @param serializableName - 对象的类名(可选)\r\n * @param dynamic - 是否为动态对象(可选,默认 true)\r\n */\r\n constructor(serializableName?: string, dynamic?: boolean) {\r\n this.__class = serializableName ?? '';\r\n this.__dynamic = dynamic ?? true;\r\n }\r\n\r\n /**\r\n * 获取应该被序列化的字段列表\r\n *\r\n * 子类可以覆盖此方法来控制哪些字段会被序列化\r\n * 注意:即使字段在此列表中,以双下划线开头的字段仍然会被忽略\r\n *\r\n * @returns 要序列化的字段名数组,如果返回 undefined 则序列化所有字段\r\n *\r\n * @example\r\n * ```typescript\r\n * getSerializableFields(): string[] {\r\n * return ['name', 'age', 'email'];\r\n * }\r\n * ```\r\n */\r\n getSerializableFields?(): string[];\r\n}\r\n\r\n/**\r\n * 可外部化对象基类\r\n *\r\n * 继承此类的对象可以完全控制自己的序列化和反序列化过程。\r\n * 必须实现 write() 实例方法和 read() 静态方法。\r\n *\r\n * 可外部化对象需要通过 AMFDecoder.register() 注册,\r\n * 以便解码器知道如何反序列化它们。\r\n *\r\n * @example\r\n * ```typescript\r\n * class CustomData extends Externalizable {\r\n * public data: Uint8Array;\r\n *\r\n * constructor() {\r\n * super('com.example.CustomData');\r\n * this.data = new Uint8Array(0);\r\n * }\r\n *\r\n * // 自定义序列化\r\n * write(encoder: AMFEncoder): void {\r\n * encoder.writeObject(this.data.length);\r\n * for (const byte of this.data) {\r\n * encoder.writeObject(byte);\r\n * }\r\n * }\r\n *\r\n * // 自定义反序列化(静态方法)\r\n * static read(decoder: AMFDecoder): CustomData {\r\n * const instance = new CustomData();\r\n * const length = decoder.decode();\r\n * instance.data = new Uint8Array(length);\r\n * for (let i = 0; i < length; i++) {\r\n * instance.data[i] = decoder.decode();\r\n * }\r\n * return instance;\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class Externalizable extends Serializable {\r\n /**\r\n * 创建一个可外部化对象\r\n *\r\n * @param externalizableName - 对象的类名\r\n */\r\n constructor(externalizableName?: string) {\r\n super(externalizableName);\r\n }\r\n\r\n /**\r\n * 将对象写入编码器\r\n *\r\n * 子类必须覆盖此方法来实现自定义的序列化逻辑。\r\n * 写入的数据必须能够被对应的 read() 静态方法正确读取。\r\n *\r\n * @param encoder - AMF 编码器实例\r\n * @throws 如果子类没有实现此方法\r\n */\r\n write(encoder: AMFEncoder): void {\r\n throw new Error(`可外部化对象 ${this.__class} 没有定义 write 方法!`);\r\n }\r\n\r\n /**\r\n * 从解码器读取并创建对象实例\r\n *\r\n * 子类必须定义一个同名的静态方法来实现自定义的反序列化逻辑。\r\n * 此方法应该读取 write() 方法写入的数据并返回新的对象实例。\r\n *\r\n * 注意:这是一个静态方法,子类需要像这样定义:\r\n * static read(decoder: AMFDecoder): YourClass { ... }\r\n *\r\n * @param decoder - AMF 解码器实例\r\n * @returns 反序列化后的对象实例\r\n * @throws 如果子类没有实现此方法\r\n */\r\n static read(decoder: AMFDecoder): Externalizable {\r\n throw new Error('可外部化对象没有定义 read 方法!');\r\n }\r\n}\r\n","/**\r\n * AMF 类型定义模块\r\n *\r\n * 本模块定义了 AMF0 和 AMF3 协议中所有的数据类型\r\n * AMF (Action Message Format) 是 Adobe 开发的一种二进制数据序列化格式\r\n * 主要用于 Flash/Flex 应用与服务器之间的数据交换\r\n */\r\n\r\nimport { ForcedTypeValue, Serializable, Externalizable } from './classes';\r\n\r\n/**\r\n * AMF 类型基类\r\n *\r\n * 每种 AMF 数据类型都由这个类的实例表示\r\n * 包含类型的 ID、名称、是否可引用等信息\r\n * 以及编码和解码的方法\r\n */\r\nexport class AMFType {\r\n /** 类型的数字标识符 */\r\n public id: number;\r\n\r\n /** 类型的名称(用于调试和错误信息) */\r\n public name: string;\r\n\r\n /**\r\n * 是否可引用\r\n * 某些复杂类型(如对象、数组)在 AMF 中可以被引用\r\n * 以避免重复序列化相同的对象\r\n */\r\n public referencable: boolean;\r\n\r\n /**\r\n * 编码函数\r\n * 由具体的类型实现设置\r\n * this 上下文指向 AMFEncoder 实例\r\n */\r\n public encode: (this: any, value: any) => void = () => {\r\n throw new Error(`没有为类型 ${this.name} 定义编码器`);\r\n };\r\n\r\n /**\r\n * 解码函数\r\n * 由具体的类型实现设置\r\n * this 上下文指向 AMFDecoder 实例\r\n */\r\n public decode: (this: any) => any = () => {\r\n throw new Error(`没有为类型 ${this.name} 定义解码器`);\r\n };\r\n\r\n /**\r\n * 创建一个新的 AMF 类型\r\n *\r\n * @param id - 类型的数字标识符\r\n * @param name - 类型的名称\r\n * @param referencable - 是否可引用,默认为 false\r\n */\r\n constructor(id: number, name: string, referencable: boolean = false) {\r\n this.id = id;\r\n this.name = name;\r\n this.referencable = referencable;\r\n }\r\n}\r\n\r\n/**\r\n * AMF0 类型定义\r\n *\r\n * AMF0 是 AMF 协议的第一个版本\r\n * 支持基本的数据类型如数字、字符串、对象、数组等\r\n */\r\nexport const AMF0 = {\r\n /**\r\n * 根据 JavaScript 值推断对应的 AMF0 类型\r\n *\r\n * @param value - 要推断类型的值\r\n * @returns 对应的 AMF0 类型\r\n * @throws 如果无法推断类型则抛出错误\r\n */\r\n infer(value: any): AMFType {\r\n const type = typeof value;\r\n\r\n // null 类型\r\n if (value === null) {\r\n return AMF0.NULL;\r\n }\r\n\r\n // undefined 类型\r\n if (type === 'undefined') {\r\n return AMF0.UNDEFINED;\r\n }\r\n\r\n // 强制类型值 - 使用用户指定的类型\r\n if (value instanceof ForcedTypeValue) {\r\n return value.type;\r\n }\r\n\r\n // 数字类型\r\n if (type === 'number') {\r\n return AMF0.NUMBER;\r\n }\r\n\r\n // 布尔类型\r\n if (type === 'boolean') {\r\n return AMF0.BOOLEAN;\r\n }\r\n\r\n // 长字符串(超过 65535 字节)\r\n if (type === 'string' && value.length >= 0xFFFF) {\r\n return AMF0.LONG_STRING;\r\n }\r\n\r\n // 普通字符串\r\n if (type === 'string') {\r\n return AMF0.STRING;\r\n }\r\n\r\n // 日期类型\r\n if (Object.prototype.toString.call(value) === '[object Date]') {\r\n return AMF0.DATE;\r\n }\r\n\r\n // 数组类型\r\n if (value instanceof Array) {\r\n return AMF0.STRICT_ARRAY;\r\n }\r\n\r\n // 可序列化对象(有类名)\r\n if (value instanceof Serializable) {\r\n if (!value.__class || value.__class === '') {\r\n return AMF0.OBJECT;\r\n }\r\n return AMF0.TYPED_OBJECT;\r\n }\r\n\r\n // 普通对象(作为 ECMA 数组处理)\r\n if (type === 'object') {\r\n return AMF0.ECMA_ARRAY;\r\n }\r\n\r\n throw new Error(`无法推断值的 AMF0 类型: ${JSON.stringify(value)}`);\r\n },\r\n\r\n /**\r\n * 根据类型 ID 获取对应的 AMF0 类型\r\n *\r\n * @param id - 类型的数字标识符\r\n * @returns 对应的 AMF0 类型\r\n * @throws 如果找不到对应的类型则抛出错误\r\n */\r\n fromId(id: number): AMFType {\r\n for (const key of Object.keys(AMF0)) {\r\n const type = (AMF0 as any)[key];\r\n if (type instanceof AMFType && type.id === id) {\r\n return type;\r\n }\r\n }\r\n throw new Error(`没有 ID 为 ${id} 的 AMF0 类型`);\r\n },\r\n\r\n /** 数字类型 (0x00) - 64位双精度浮点数 */\r\n NUMBER: new AMFType(0x00, 'NUMBER'),\r\n\r\n /** 布尔类型 (0x01) */\r\n BOOLEAN: new AMFType(0x01, 'BOOLEAN'),\r\n\r\n /** 字符串类型 (0x02) - 最大 65535 字节 */\r\n STRING: new AMFType(0x02, 'STRING'),\r\n\r\n /** 对象类型 (0x03) - 匿名对象 */\r\n OBJECT: new AMFType(0x03, 'OBJECT', true),\r\n\r\n /** MovieClip 类型 (0x04) - Flash 专用,通常不使用 */\r\n MOVIECLIP: new AMFType(0x04, 'MOVIECLIP'),\r\n\r\n /** 空值类型 (0x05) */\r\n NULL: new AMFType(0x05, 'NULL'),\r\n\r\n /** 未定义类型 (0x06) */\r\n UNDEFINED: new AMFType(0x06, 'UNDEFINED'),\r\n\r\n /** 引用类型 (0x07) - 引用之前序列化的对象 */\r\n REFERENCE: new AMFType(0x07, 'REFERENCE'),\r\n\r\n /** ECMA 数组类型 (0x08) - 关联数组/对象 */\r\n ECMA_ARRAY: new AMFType(0x08, 'ECMA_ARRAY', true),\r\n\r\n /** 对象结束标记 (0x09) */\r\n OBJECT_END: new AMFType(0x09, 'OBJECT_END'),\r\n\r\n /** 严格数组类型 (0x0A) - 数字索引数组 */\r\n STRICT_ARRAY: new AMFType(0x0A, 'STRICT_ARRAY', true),\r\n\r\n /** 日期类型 (0x0B) */\r\n DATE: new AMFType(0x0B, 'DATE'),\r\n\r\n /** 长字符串类型 (0x0C) - 超过 65535 字节的字符串 */\r\n LONG_STRING: new AMFType(0x0C, 'LONG_STRING'),\r\n\r\n /** 不支持的类型 (0x0D) */\r\n UNSUPPORTED: new AMFType(0x0D, 'UNSUPPORTED'),\r\n\r\n /** XML 类型 (0x0F) */\r\n XML: new AMFType(0x0F, 'XML'),\r\n\r\n /** 类型化对象 (0x10) - 有类名的对象 */\r\n TYPED_OBJECT: new AMFType(0x10, 'TYPED_OBJECT', true),\r\n\r\n /** AMF3 对象标记 (0x11) - 表示后续数据使用 AMF3 格式 */\r\n AMF3_OBJECT: new AMFType(0x11, 'AMF3_OBJECT')\r\n};\r\n\r\n/**\r\n * AMF3 类型定义\r\n *\r\n * AMF3 是 AMF 协议的第三个版本(跳过了 AMF2)\r\n * 相比 AMF0,它更加紧凑,支持更多的数据类型\r\n * 包括字节数组、向量等\r\n */\r\nexport const AMF3 = {\r\n /**\r\n * 根据 JavaScript 值推断对应的 AMF3 类型\r\n *\r\n * @param value - 要推断类型的值\r\n * @returns 对应的 AMF3 类型\r\n * @throws 如果无法推断类型则抛出错误\r\n */\r\n infer(value: any): AMFType {\r\n const type = typeof value;\r\n\r\n // null 类型\r\n if (value === null) {\r\n return AMF3.NULL;\r\n }\r\n\r\n // undefined 类型\r\n if (type === 'undefined') {\r\n return AMF3.UNDEFINED;\r\n }\r\n\r\n // 强制类型值 - 使用用户指定的类型\r\n if (value instanceof ForcedTypeValue) {\r\n return value.type;\r\n }\r\n\r\n // 布尔类型 - AMF3 中 true 和 false 是不同的类型\r\n if (type === 'boolean' && !value) {\r\n return AMF3.FALSE;\r\n }\r\n if (type === 'boolean') {\r\n return AMF3.TRUE;\r\n }\r\n\r\n // 字符串类型\r\n if (type === 'string') {\r\n return AMF3.STRING;\r\n }\r\n\r\n // 整数类型(29位有符号整数范围内)\r\n // AMF3 INTEGER 范围: -268435456 到 536870911\r\n if (type === 'number'\r\n && isFinite(value)\r\n && value % 1 === 0\r\n && value < 536870911\r\n && value > -268435456) {\r\n return AMF3.INTEGER;\r\n }\r\n\r\n // 双精度浮点数\r\n if (type === 'number') {\r\n return AMF3.DOUBLE;\r\n }\r\n\r\n // 日期类型\r\n if (Object.prototype.toString.call(value) === '[object Date]') {\r\n return AMF3.DATE;\r\n }\r\n\r\n // 字节数组(Uint8Array 在浏览器中替代 Node.js 的 Buffer)\r\n if (value instanceof Uint8Array) {\r\n return AMF3.BYTE_ARRAY;\r\n }\r\n\r\n // 数组类型\r\n if (value instanceof Array) {\r\n return AMF3.ARRAY;\r\n }\r\n\r\n // 可序列化对象或可外部化对象\r\n if (value instanceof Serializable || value instanceof Externalizable) {\r\n return AMF3.OBJECT;\r\n }\r\n\r\n // 普通对象(作为关联数组处理)\r\n if (type === 'object') {\r\n return AMF3.ARRAY;\r\n }\r\n\r\n throw new Error(`无法推断值的 AMF3 类型: ${JSON.stringify(value)}`);\r\n },\r\n\r\n /**\r\n * 根据类型 ID 获取对应的 AMF3 类型\r\n *\r\n * @param id - 类型的数字标识符\r\n * @returns 对应的 AMF3 类型\r\n * @throws 如果找不到对应的类型则抛出错误\r\n */\r\n fromId(id: number): AMFType {\r\n for (const key of Object.keys(AMF3)) {\r\n const type = (AMF3 as any)[key];\r\n if (type instanceof AMFType && type.id === id) {\r\n return type;\r\n }\r\n }\r\n throw new Error(`没有 ID 为 ${id} 的 AMF3 类型`);\r\n },\r\n\r\n /** 未定义类型 (0x00) */\r\n UNDEFINED: new AMFType(0x00, 'UNDEFINED'),\r\n\r\n /** 空值类型 (0x01) */\r\n NULL: new AMFType(0x01, 'NULL'),\r\n\r\n /** 布尔假值 (0x02) */\r\n FALSE: new AMFType(0x02, 'FALSE'),\r\n\r\n /** 布尔真值 (0x03) */\r\n TRUE: new AMFType(0x03, 'TRUE'),\r\n\r\n /** 整数类型 (0x04) - 29位有符号整数 */\r\n INTEGER: new AMFType(0x04, 'INTEGER'),\r\n\r\n /** 双精度浮点数类型 (0x05) */\r\n DOUBLE: new AMFType(0x05, 'DOUBLE'),\r\n\r\n /** 字符串类型 (0x06) */\r\n STRING: new AMFType(0x06, 'STRING', true),\r\n\r\n /** XML 文档类型 (0x07) */\r\n XML_DOC: new AMFType(0x07, 'XML_DOC', true),\r\n\r\n /** 日期类型 (0x08) */\r\n DATE: new AMFType(0x08, 'DATE', true),\r\n\r\n /** 数组类型 (0x09) */\r\n ARRAY: new AMFType(0x09, 'ARRAY', true),\r\n\r\n /** 对象类型 (0x0A) */\r\n OBJECT: new AMFType(0x0A, 'OBJECT', true),\r\n\r\n /** XML 类型 (0x0B) */\r\n XML: new AMFType(0x0B, 'XML', true),\r\n\r\n /** 字节数组类型 (0x0C) */\r\n BYTE_ARRAY: new AMFType(0x0C, 'BYTE_ARRAY', true),\r\n\r\n /** 整数向量类型 (0x0D) */\r\n VECTOR_INT: new AMFType(0x0D, 'VECTOR_INT', true),\r\n\r\n /** 无符号整数向量类型 (0x0E) */\r\n VECTOR_UINT: new AMFType(0x0E, 'VECTOR_UINT', true),\r\n\r\n /** 双精度浮点数向量类型 (0x0F) */\r\n VECTOR_DOUBLE: new AMFType(0x0F, 'VECTOR_DOUBLE', true),\r\n\r\n /** 对象向量类型 (0x10) */\r\n VECTOR_OBJECT: new AMFType(0x10, 'VECTOR_OBJECT', true),\r\n\r\n /** 字典类型 (0x11) */\r\n DICTIONARY: new AMFType(0x11, 'DICTIONARY', true)\r\n};\r\n","/**\r\n * 二进制数据读取器模块\r\n *\r\n * 本模块提供了从二进制数据中读取各种数据类型的功能\r\n * 专为浏览器环境设计,使用 Uint8Array 和 DataView 替代 Node.js 的 Buffer\r\n */\r\n\r\n/**\r\n * AMF 头部信息接口\r\n *\r\n * 在 AMF3 中,许多类型使用一个特殊的头部来表示是定义还是引用\r\n */\r\nexport interface AMFHeader {\r\n /** 是否是定义(true)还是引用(false) */\r\n isDef: boolean;\r\n\r\n /** 头部的值(引用索引或数据长度) */\r\n value: number;\r\n}\r\n\r\n/**\r\n * 二进制数据读取器类\r\n *\r\n * 提供从 Uint8Array 中读取各种二进制数据类型的方法\r\n * 所有多字节数据都使用大端序(Big Endian)读取,这是 AMF 协议的要求\r\n *\r\n * @example\r\n * ```typescript\r\n * const data = new Uint8Array([0x00, 0x01, 0x02, 0x03]);\r\n * const reader = new Reader(data);\r\n * const byte = reader.readByte(); // 0x00\r\n * const uint16 = reader.readUInt16BE(); // 0x0102\r\n * ```\r\n */\r\nexport class Reader {\r\n /** 要读取的二进制数据 */\r\n protected data: Uint8Array;\r\n\r\n /** 用于读取多字节数据的 DataView */\r\n protected view: DataView;\r\n\r\n /** 当前读取位置 */\r\n protected position: number;\r\n\r\n /**\r\n * 创建一个新的读取器\r\n *\r\n * @param data - 要读取的二进制数据\r\n */\r\n constructor(data: Uint8Array) {\r\n this.data = data;\r\n this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n this.position = 0;\r\n }\r\n\r\n /**\r\n * 获取当前读取位置\r\n *\r\n * @returns 当前位置(字节偏移量)\r\n */\r\n getPosition(): number {\r\n return this.position;\r\n }\r\n\r\n /**\r\n * 设置读取位置\r\n *\r\n * @param pos - 新的位置\r\n */\r\n setPosition(pos: number): void {\r\n this.position = pos;\r\n }\r\n\r\n /**\r\n * 获取剩余可读字节数\r\n *\r\n * @returns 剩余字节数\r\n */\r\n getBytesAvailable(): number {\r\n return this.data.length - this.position;\r\n }\r\n\r\n /**\r\n * 检查是否还有足够的字节可读\r\n *\r\n * @param length - 需要的字节数\r\n * @throws 如果剩余字节不足\r\n */\r\n private checkAvailable(length: number): void {\r\n if (this.position + length > this.data.length) {\r\n throw new Error(`没有足够的 ${length} 字节可读,当前位置: ${this.position},总长度: ${this.data.length}`);\r\n }\r\n }\r\n\r\n /**\r\n * 读取一个或多个字节\r\n *\r\n * @param length - 要读取的字节数,默认为 1\r\n * @param alwaysReturnArray - 即使只读取一个字节也返回 Uint8Array\r\n * @returns 如果 length 为 1 且 alwaysReturnArray 为 false,返回单个数字;否则返回 Uint8Array\r\n */\r\n readByte(length: number = 1, alwaysReturnArray: boolean = false): number | Uint8Array {\r\n this.checkAvailable(length);\r\n\r\n if (length === 1 && !alwaysReturnArray) {\r\n // 读取单个字节,返回数字\r\n return this.data[this.position++];\r\n }\r\n\r\n // 读取多个字节,返回 Uint8Array\r\n const result = this.data.slice(this.position, this.position + length);\r\n this.position += length;\r\n return result;\r\n }\r\n\r\n /**\r\n * 读取一个无符号 8 位整数\r\n *\r\n * @returns 0-255 范围内的整数\r\n */\r\n readUInt8(): number {\r\n this.checkAvailable(1);\r\n return this.data[this.position++];\r\n }\r\n\r\n /**\r\n * 读取一个有符号 8 位整数\r\n *\r\n * @returns -128 到 127 范围内的整数\r\n */\r\n readInt8(): number {\r\n const value = this.readUInt8();\r\n return value > 127 ? value - 256 : value;\r\n }\r\n\r\n /**\r\n * 读取一个大端序无符号 16 位整数\r\n *\r\n * @returns 0-65535 范围内的整数\r\n */\r\n readUInt16BE(): number {\r\n this.checkAvailable(2);\r\n const value = this.view.getUint16(this.position, false); // false = 大端序\r\n this.position += 2;\r\n return value;\r\n }\r\n\r\n /**\r\n * 读取一个大端序有符号 16 位整数\r\n *\r\n * @returns -32768 到 32767 范围内的整数\r\n */\r\n readInt16BE(): number {\r\n this.checkAvailable(2);\r\n const value = this.view.getInt16(this.position, false);\r\n this.position += 2;\r\n return value;\r\n }\r\n\r\n /**\r\n * 读取一个大端序无符号 32 位整数\r\n *\r\n * @returns 0-4294967295 范围内的整数\r\n */\r\n readUInt32BE(): number {\r\n this.checkAvailable(4);\r\n const value = this.view.getUint32(this.position, false);\r\n this.position += 4;\r\n return value;\r\n }\r\n\r\n /**\r\n * 读取一个大端序有符号 32 位整数\r\n *\r\n * @returns -2147483648 到 2147483647 范围内的整数\r\n */\r\n readInt32BE(): number {\r\n this.checkAvailable(4);\r\n const value = this.view.getInt32(this.position, false);\r\n this.position += 4;\r\n return value;\r\n }\r\n\r\n /**\r\n * 读取一个大端序 64 位双精度浮点数\r\n *\r\n * @returns 双精度浮点数\r\n */\r\n readDoubleBE(): number {\r\n this.checkAvailable(8);\r\n const value = this.view.getFloat64(this.position, false);\r\n this.position += 8;\r\n return value;\r\n }\r\n\r\n /**\r\n * 读取一个 AMF0 格式的字符串\r\n *\r\n * AMF0 字符串格式:2字节长度 + UTF-8 编码的字符串数据\r\n *\r\n * @returns 解码后的字符串\r\n */\r\n readString(): string {\r\n const length = this.readUInt16BE();\r\n if (length === 0) {\r\n return '';\r\n }\r\n return this.readUTF8String(length);\r\n }\r\n\r\n /**\r\n * 读取指定长度的 UTF-8 字符串\r\n *\r\n * @param length - 字符串的字节长度\r\n * @returns 解码后的字符串\r\n */\r\n readUTF8String(length: number): string {\r\n this.checkAvailable(length);\r\n const bytes = this.data.slice(this.position, this.position + length);\r\n this.position += length;\r\n\r\n // 使用 TextDecoder 将 UTF-8 字节解码为字符串\r\n const decoder = new TextDecoder('utf-8');\r\n return decoder.decode(bytes);\r\n }\r\n\r\n /**\r\n * 读取 AMF3 的变长整数(Int29)\r\n *\r\n * AMF3 使用一种可变长度编码来表示 29 位有符号整数\r\n * 每个字节的最高位表示是否还有更多字节:\r\n * - 0xxxxxxx: 单字节,值 0-127\r\n * - 1xxxxxxx 0xxxxxxx: 双字节\r\n * - 1xxxxxxx 1xxxxxxx 0xxxxxxx: 三字节\r\n * - 1xxxxxxx 1xxxxxxx 1xxxxxxx xxxxxxxx: 四字节(最后一个字节使用全部 8 位)\r\n *\r\n * @returns 29 位有符号整数,范围 -268435456 到 536870911\r\n */\r\n readInt29(): number {\r\n let total = 0;\r\n let byte = this.readUInt8();\r\n\r\n // 第一个字节\r\n if (byte < 128) {\r\n return byte;\r\n }\r\n\r\n // 第二个字节\r\n total = (byte & 0x7f) << 7;\r\n byte = this.readUInt8();\r\n\r\n if (byte < 128) {\r\n total |= byte;\r\n } else {\r\n // 第三个字节\r\n total = (total | (byte & 0x7f)) << 7;\r\n byte = this.readUInt8();\r\n\r\n if (byte < 128) {\r\n total |= byte;\r\n } else {\r\n // 第四个字节(使用全部 8 位)\r\n total = (total | (byte & 0x7f)) << 8;\r\n total |= this.readUInt8();\r\n }\r\n }\r\n\r\n // 处理符号位(29 位有符号整数)\r\n // 如果第 29 位是 1,则是负数\r\n return -(total & (1 << 28)) | total;\r\n }\r\n\r\n /**\r\n * 读取 AMF3 头部信息\r\n *\r\n * AMF3 中很多类型使用一个头部来区分是定义还是引用:\r\n * - 最低位为 0: 这是一个引用,高位存储引用索引\r\n * - 最低位为 1: 这是一个定义,高位存储数据长度或其他信息\r\n *\r\n * @returns AMF 头部信息对象\r\n */\r\n readAMFHeader(): AMFHeader {\r\n const handle = this.readInt29();\r\n const isDef = (handle & 1) !== 0;\r\n const value = handle >> 1;\r\n\r\n return {\r\n isDef,\r\n value\r\n };\r\n }\r\n}\r\n","/**\n * AMF3 解码器模块\n *\n * 仅实现 AMF3,并使用类方法进行分发解码(不依赖给类型对象动态挂方法)。\n * 全部基于浏览器可用的 Uint8Array / TextDecoder。\n */\n\nimport { AMFType } from './types';\nimport { AMFTrait, Serializable } from './classes';\nimport { Reader } from './reader';\n\n/**\n * 可外部化对象静态读取接口\n */\ninterface ExternalizableReader {\n read(decoder: AMFDecoder): any;\n}\n\n/**\n * AMF3 解码器\n */\nexport class AMFDecoder extends Reader {\n /** AMF3 外部化对象注册表 */\n static amf3Externalizables: Record<string, ExternalizableReader> = {};\n\n /** AMF3 字符串引用表 */\n private amf3StringReferences: string[];\n\n /** AMF3 对象引用表 */\n private amf3ObjectReferences: any[];\n\n /** AMF3 Trait 引用表 */\n private amf3TraitReferences: AMFTrait[];\n\n /**\n * 注册外部化类型\n */\n static register(className: string, cls: ExternalizableReader): void {\n this.amf3Externalizables[className] = cls;\n }\n\n constructor(data: Uint8Array) {\n super(data);\n this.amf3StringReferences = [];\n this.amf3ObjectReferences = [];\n this.amf3TraitReferences = [];\n }\n\n /**\n * 解码一个 AMF3 值\n */\n decode(): any {\n const typeId = this.readUInt8();\n return this.readByTypeId(typeId);\n }\n\n /**\n * 按 AMF3 类型对象解码(兼容接口)\n */\n deserialize(type: number | AMFType): any {\n if (type instanceof AMFType) {\n return this.readByTypeId(type.id);\n }\n return this.readByTypeId(type);\n }\n\n /**\n * 按类型 ID 分发解码\n */\n private readByTypeId(typeId: number): any {\n switch (typeId) {\n case 0x00: // UNDEFINED\n return undefined;\n case 0x01: // NULL\n return null;\n case 0x02: // FALSE\n return false;\n case 0x03: // TRUE\n return true;\n case 0x04: // INTEGER\n return this.readInt29();\n case 0x05: // DOUBLE\n return this.readDoubleBE();\n case 0x06: // STRING\n return this.readAMF3String();\n case 0x08: // DATE\n return this.readAMF3Date();\n case 0x09: // ARRAY\n return this.readAMF3Array();\n case 0x0A: // OBJECT\n return this.readAMF3Object();\n case 0x0C: // BYTE_ARRAY\n return this.readAMF3ByteArray();\n case 0x0D: // VECTOR_INT\n return this.readAMF3VectorInt();\n case 0x0E: // VECTOR_UINT\n return this.readAMF3VectorUInt();\n case 0x0F: // VECTOR_DOUBLE\n return this.readAMF3VectorDouble();\n case 0x10: // VECTOR_OBJECT\n return this.readAMF3VectorObject();\n case 0x11: // DICTIONARY\n return this.readAMF3Dictionary();\n default:\n throw new Error('当前 AMF3 解码器暂不支持类型 ID: ' + typeId);\n }\n }\n\n /**\n * 读取 AMF3 字符串\n * \n * todo 字符串过长时可能有bug? 当前读长读,用的是u29的方式\n */\n private readAMF3String(): string {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3StringReferences[header.value];\n if (typeof ref !== 'string') {\n throw new Error('无效的 AMF3 字符串引用');\n }\n return ref;\n }\n\n if (header.value === 0) {\n return '';\n }\n\n const value = this.readUTF8String(header.value);\n this.amf3StringReferences.push(value);\n return value;\n }\n\n /**\n * 读取 AMF3 日期\n */\n private readAMF3Date(): Date {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!(ref instanceof Date)) {\n throw new Error('无效的 AMF3 日期引用');\n }\n return ref;\n }\n\n const value = new Date(this.readDoubleBE());\n this.amf3ObjectReferences.push(value);\n return value;\n }\n\n /**\n * 读取 AMF3 数组\n */\n private readAMF3Array(): any[] | Record<string, any> {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!ref) {\n throw new Error('无效的 AMF3 数组引用');\n }\n return ref;\n }\n\n const named: Record<string, any> = {};\n this.amf3ObjectReferences.push(named);\n const idx = this.amf3ObjectReferences.length - 1;\n\n while (true) {\n const key = this.readAMF3String();\n if (key === '') {\n break;\n }\n named[key] = this.decode();\n }\n\n if (Object.keys(named).length > 0) {\n // 与 lib 行为保持一致:有命名字段时直接按对象返回\n return named;\n }\n\n const dense: any[] = [];\n this.amf3ObjectReferences[idx] = dense;\n for (let i = 0; i < header.value; i++) {\n dense.push(this.decode());\n }\n return dense;\n }\n\n /**\n * 读取 AMF3 对象 Trait\n */\n private readAMF3ObjectTrait(flags: number): AMFTrait {\n if ((flags & 1) === 0) {\n const trait = this.amf3TraitReferences[flags >> 1];\n if (!trait) {\n throw new Error('无效的 AMF3 Trait 引用');\n }\n return trait;\n }\n\n const name = this.readAMF3String();\n const isExternalizable = ((flags >> 1) & 1) === 1;\n const isDynamic = ((flags >> 2) & 1) === 1;\n const staticKeyLen = flags >> 3;\n\n const trait = new AMFTrait(name, isDynamic, isExternalizable);\n for (let i = 0; i < staticKeyLen; i++) {\n trait.staticFields.push(this.readAMF3String());\n }\n\n this.amf3TraitReferences.push(trait);\n return trait;\n }\n\n /**\n * 读取 AMF3 对象\n */\n private readAMF3Object(): any {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!ref) {\n throw new Error('无效的 AMF3 对象引用');\n }\n return ref;\n }\n\n const trait = this.readAMF3ObjectTrait(header.value);\n if (trait.externalizable) {\n if (trait.name === 'flex.messaging.io.ArrayCollection') {\n const arr = this.decode();\n this.amf3ObjectReferences.push(arr);\n return arr;\n }\n\n const ext = AMFDecoder.amf3Externalizables[trait.name];\n if (!ext) {\n throw new Error('未注册 AMF3 外部化类型: ' + trait.name);\n }\n\n const extObj = ext.read(this);\n this.amf3ObjectReferences.push(extObj);\n return extObj;\n }\n\n // 处理普通对象(可能带类名) ;\n const result = new Serializable(\n trait.name, trait.dynamic\n ) as Record<string, any>;\n this.amf3ObjectReferences.push(result);\n for (let i = 0; i < trait.staticFields.length; i++) {\n const field = trait.staticFields[i];\n result[field] = this.decode();\n }\n\n if (trait.dynamic) {\n while (true) {\n const key = this.readAMF3String();\n if (key === '') {\n break;\n }\n result[key] = this.decode();\n }\n }\n\n return result;\n }\n\n /**\n * 读取 AMF3 ByteArray\n */\n private readAMF3ByteArray(): Uint8Array {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!(ref instanceof Uint8Array)) {\n throw new Error('无效的 AMF3 ByteArray 引用');\n }\n return ref;\n }\n\n const bytes = this.readByte(header.value, true) as Uint8Array;\n this.amf3ObjectReferences.push(bytes);\n return bytes;\n }\n\n /**\n * 向量解码通用逻辑\n */\n private readAMF3Vector<T>(reader: () => T): T[] {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!ref) {\n throw new Error('无效的 AMF3 向量引用');\n }\n return ref as T[];\n }\n\n this.readUInt8(); // fixed 标记\n const result: T[] = [];\n this.amf3ObjectReferences.push(result);\n for (let i = 0; i < header.value; i++) {\n result.push(reader.call(this));\n }\n return result;\n }\n\n /**\n * 读取 VECTOR_INT\n */\n private readAMF3VectorInt(): number[] {\n return this.readAMF3Vector<number>(function readInt(this: AMFDecoder): number {\n return this.readInt32BE();\n });\n }\n\n /**\n * 读取 VECTOR_UINT\n */\n private readAMF3VectorUInt(): number[] {\n return this.readAMF3Vector<number>(function readUInt(this: AMFDecoder): number {\n return this.readUInt32BE();\n });\n }\n\n /**\n * 读取 VECTOR_DOUBLE\n */\n private readAMF3VectorDouble(): number[] {\n return this.readAMF3Vector<number>(function readDouble(this: AMFDecoder): number {\n return this.readDoubleBE();\n });\n }\n\n /**\n * 读取 VECTOR_OBJECT\n */\n private readAMF3VectorObject(): any[] {\n return this.readAMF3Vector<any>(function readObject(this: AMFDecoder): any {\n return this.decode();\n });\n }\n\n /**\n * 读取 DICTIONARY\n */\n private readAMF3Dictionary(): Record<string, any> {\n const header = this.readAMFHeader();\n if (!header.isDef) {\n const ref = this.amf3ObjectReferences[header.value];\n if (!ref) {\n throw new Error('无效的 AMF3 字典引用');\n }\n return ref;\n }\n\n this.readUInt8(); // weakKeys 标记\n const result: Record<string, any> = {};\n this.amf3ObjectReferences.push(result);\n\n for (let i = 0; i < header.value; i++) {\n const key = this.decode();\n result[JSON.stringify(key)] = this.decode();\n }\n return result;\n }\n}\n\nexport default AMFDecoder;\n","/**\r\n * 二进制数据写入器模块\r\n *\r\n * 本模块提供了向二进制缓冲区写入各种数据类型的功能\r\n * 专为浏览器环境设计,使用 Uint8Array 和 DataView 替代 Node.js 的 Buffer\r\n */\r\n\r\n/**\r\n * 二进制数据写入器类\r\n *\r\n * 提供向动态增长的缓冲区写入各种二进制数据类型的方法\r\n * 所有多字节数据都使用大端序(Big Endian)写入,这是 AMF 协议的要求\r\n *\r\n * @example\r\n * ```typescript\r\n * const writer = new Writer();\r\n * writer.writeByte(0x01);\r\n * writer.writeUInt16BE(0x0203);\r\n * writer.writeDoubleBE(3.14159);\r\n * const result = writer.getBuffer();\r\n * ```\r\n */\r\nexport class Writer {\r\n /** 内部缓冲区数组,用于动态收集写入的数据 */\r\n private chunks: Uint8Array[];\r\n\r\n /** 当前已写入的总字节数 */\r\n private totalLength: number;\r\n\r\n /**\r\n * 创建一个新的写入器\r\n */\r\n constructor() {\r\n this.chunks = [];\r\n this.totalLength = 0;\r\n }\r\n\r\n /**\r\n * 获取当前已写入的字节数\r\n *\r\n * @returns 已写入的总字节数\r\n */\r\n getLength(): number {\r\n return this.totalLength;\r\n }\r\n\r\n /**\r\n * 获取写入的所有数据\r\n *\r\n * 将所有写入的数据块合并为一个 Uint8Array\r\n *\r\n * @returns 包含所有写入数据的 Uint8Array\r\n */\r\n getBuffer(): Uint8Array {\r\n // 创建一个足够大的缓冲区\r\n const result = new Uint8Array(this.totalLength);\r\n let offset = 0;\r\n\r\n // 将所有数据块复制到结果缓冲区\r\n for (const chunk of this.chunks) {\r\n result.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 清空写入器,重置到初始状态\r\n */\r\n clear(): void {\r\n this.chunks = [];\r\n this.totalLength = 0;\r\n }\r\n\r\n /**\r\n * 写入数据到缓冲区\r\n *\r\n * 支持多种数据类型:\r\n * - 数字(0-255):作为单个字节写入\r\n * - 数字数组:每个元素作为一个字节写入\r\n * - Uint8Array:直接写入\r\n * - 字符串:作为 UTF-8 编码写入\r\n *\r\n * @param value - 要写入的值\r\n * @throws 如果值的类型不支持\r\n */\r\n write(value: number | number[] | Uint8Array | string): void {\r\n\r\n if (typeof value === 'number') {\r\n // 单个字节\r\n const chunk = new Uint8Array([value & 0xff]);\r\n this.chunks.push(chunk);\r\n this.totalLength += 1;\r\n } else if (Array.isArray(value)) {\r\n // 数字数组,每个元素作为一个字节\r\n const chunk = new Uint8Array(value.map(v => v & 0xff));\r\n this.chunks.push(chunk);\r\n this.totalLength += chunk.length;\r\n } else if (value instanceof Uint8Array) {\r\n // Uint8Array 直接写入\r\n this.chunks.push(value as Uint8Array);\r\n this.totalLength += value.length;\r\n } else if (typeof value === 'string') {\r\n // 字符串作为 UTF-8 编码写入\r\n const encoder = new TextEncoder();\r\n const chunk = encoder.encode(value);\r\n this.chunks.push(chunk);\r\n this.totalLength += chunk.length;\r\n } else {\r\n throw new Error(`不知道如何写入: ${JSON.stringify(value)}`);\r\n }\r\n }\r\n\r\n /**\r\n * 写入单个字节\r\n *\r\n * @param value - 0-255 范围内的整数\r\n */\r\n writeByte(value: number): void {\r\n this.write(value & 0xff);\r\n }\r\n\r\n /**\r\n * 写入字节数组\r\n *\r\n * @param bytes - 字节数组或 Uint8Array\r\n */\r\n writeBytes(bytes: number[] | Uint8Array): void {\r\n this.write(bytes);\r\n }\r\n\r\n /**\r\n * 写入一个大端序无符号 16 位整数\r\n *\r\n * @param value - 0-65535 范围内的整数\r\n */\r\n writeUInt16BE(value: number): void {\r\n const buffer = new Uint8Array(2);\r\n const view = new DataView(buffer.buffer);\r\n view.setUint16(0, value, false); // false = 大端序\r\n this.write(buffer);\r\n }\r\n\r\n /**\r\n * 写入一个大端序有符号 16 位整数\r\n *\r\n * @param value - -32768 到 32767 范围内的整数\r\n */\r\n writeInt16BE(value: number): void {\r\n const buffer = new Uint8Array(2);\r\n const view = new DataView(buffer.buffer);\r\n view.setInt16(0, value, false);\r\n this.write(buffer);\r\n }\r\n\r\n /**\r\n * 写入一个大端序无符号 32 位整数\r\n *\r\n * @param value - 0-4294967295 范围内的整数\r\n */\r\n writeUInt32BE(value: number): void {\r\n const buffer = new Uint8Array(4);\r\n const view = new DataView(buffer.buffer);\r\n view.setUint32(0, value, false);\r\n this.write(buffer);\r\n }\r\n\r\n /**\r\n * 写入一个大端序有符号 32 位整数\r\n *\r\n * @param value - -2147483648 到 2147483647 范围内的整数\r\n */\r\n writeInt32BE(value: number): void {\r\n const buffer = new Uint8Array(4);\r\n const view = new DataView(buffer.buffer);\r\n view.setInt32(0, value, false);\r\n this.write(buffer);\r\n }\r\n\r\n /**\r\n * 写入一个大端序 64 位双精度浮点数\r\n *\r\n * @param value - 双精度浮点数\r\n */\r\n writeDoubleBE(value: number): void {\r\n const buffer = new Uint8Array(8);\r\n const view = new DataView(buffer.buffer);\r\n view.setFloat64(0, value, false);\r\n this.write(buffer);\r\n }\r\n\r\n /**\r\n * 写入一个 AMF0 格式的字符串\r\n *\r\n * AMF0 字符串格式:2字节长度(大端序)+ UTF-8 编码的字符串数据\r\n *\r\n * @param value - 要写入的字符串\r\n */\r\n writeString(value: string): void {\r\n const encoder = new TextEncoder();\r\n const bytes = encoder.encode(value);\r\n this.writeUInt16BE(bytes.length);\r\n this.write(bytes);\r\n }\r\n\r\n /**\r\n * 写入 AMF3 的变长整数(Int29)\r\n *\r\n * AMF3 使用一种可变长度编码来表示 29 位有符号整数\r\n * 每个字节的最高位表示是否还有更多字节:\r\n * - 值 0-127: 单字节 (0xxxxxxx)\r\n * - 值 128-16383: 双字节 (1xxxxxxx 0xxxxxxx)\r\n * - 值 16384-2097151: 三字节 (1xxxxxxx 1xxxxxxx 0xxxxxxx)\r\n * - 值 2097152-536870911: 四字节 (1xxxxxxx 1xxxxxxx 1xxxxxxx xxxxxxxx)\r\n *\r\n * @param value - 29 位有符号整数,范围 -268435456 到 536870911\r\n * @throws 如果值超出范围\r\n */\r\n writeInt29(value: number): void {\r\n // 检查范围\r\n if (value > 536870911 || value < -268435456) {\r\n throw new RangeError(`Int29 值超出范围: ${value}`);\r\n }\r\n\r\n // 处理负数:转换为无符号形式\r\n value &= 0x1fffffff;\r\n\r\n if (value < 0x80) {\r\n // 单字节\r\n this.write(value);\r\n } else if (value < 0x4000) {\r\n // 双字节\r\n this.write([\r\n (value >> 7 & 0x7f) | 0x80,\r\n value & 0x7f\r\n ]);\r\n } else if (value < 0x200000) {\r\n // 三字节\r\n this.write([\r\n (value >> 14 & 0x7f) | 0x80,\r\n (value >> 7 & 0x7f) | 0x80,\r\n value & 0x7f\r\n ]);\r\n } else {\r\n // 四字节\r\n this.write([\r\n (value >> 22 & 0x7f) | 0x80,\r\n (value >> 14 & 0x7f) | 0x80,\r\n (value >> 7 & 0x7f) | 0x80,\r\n value & 0xff\r\n ]);\r\n }\r\n }\r\n}\r\n","/**\n * AMF3 编码器模块\n *\n * 仅实现 AMF3,并使用类方法进行分发编码(不依赖给类型对象动态挂方法)。\n * 全部基于浏览器可用的 Uint8Array / TextEncoder。\n */\n\nimport { AMF3, AMFType } from './types';\nimport { Externalizable, ForcedTypeValue } from './classes';\nimport { Writer } from './writer';\n\n/**\n * 提取对象可序列化字段名\n */\nfunction getSerializableKeys(value: Record<string, any>): string[] {\n const keys = typeof value.getSerializableFields === 'function'\n ? value.getSerializableFields()\n : Object.keys(value);\n return keys.filter(function filterInternal(key: string): boolean {\n return key.indexOf('__') !== 0;\n });\n}\n\n/**\n * AMF3 编码器\n */\nexport class AMFEncoder extends Writer {\n /** AMF3 对象引用表 */\n private amf3ObjectReferences: any[];\n\n /** AMF3 字符串引用表 */\n private amf3StringReferences: string[];\n\n constructor() {\n super();\n this.amf3ObjectReferences = [];\n this.amf3StringReferences = [];\n }\n\n /**\n * 编码一个 AMF3 值(会写入类型标记)\n */\n writeObject(value: any): void {\n this.encodeValue(value);\n }\n\n /**\n * 兼容旧接口,含义与 writeObject 相同\n */\n encode(value: any): void {\n this.encodeValue(value);\n }\n\n /**\n * 编码值主体(无类型标记)\n */\n serialize(value: any): void {\n const type = this.inferType(value);\n this.writeByType(value instanceof ForcedTypeValue ? value.value : value, type);\n }\n\n /**\n * 推断值的 AMF3 类型\n */\n private inferType(value: any): AMFType {\n return AMF3.infer(value);\n }\n\n /**\n * 编码一个完整值(含类型标记与引用处理)\n */\n private encodeValue(value: any): void {\n const type = this.inferType(value);\n const realValue = value instanceof ForcedTypeValue ? value.value : value;\n\n if (type.referencable && realValue !== '') {\n let index = -1;\n if (type === AMF3.STRING) {\n index = this.amf3StringReferences.indexOf(realValue);\n } else {\n index = this.amf3ObjectReferences.indexOf(realValue);\n }\n\n if (index !== -1) {\n this.writeByte(type.id);\n this.writeInt29(index << 1);\n return;\n }\n\n if (type === AMF3.STRING) {\n this.amf3StringReferences.push(realValue);\n } else {\n this.amf3ObjectReferences.push(realValue);\n }\n }\n\n this.writeByte(type.id);\n this.writeByType(realValue, type);\n }\n\n /**\n * 按类型写入值主体(不包含类型标记)\n */\n private writeByType(value: any, type: AMFType): void {\n switch (type.id) {\n case 0x00: // UNDEFINED\n case 0x01: // NULL\n case 0x02: // FALSE\n case 0x03: // TRUE\n return;\n case 0x04: // INTEGER\n this.writeInt29(value);\n return;\n case 0x05: // DOUBLE\n this.writeDoubleBE(value);\n return;\n case 0x06: // STRING\n this.writeInlineString(value);\n return;\n case 0x08: // DATE\n this.writeInt29(1);\n this.writeDoubleBE((value as Date).getTime());\n return;\n case 0x09: // ARRAY\n this.writeArray(value);\n return;\n case 0x0A: // OBJECT\n this.writeObjectValue(value);\n return;\n case 0x0C: // BYTE_ARRAY\n this.writeByteArray(value);\n return;\n default:\n throw new Error('当前 AMF3 编码器暂不支持该类型: ' + type.name);\n }\n }\n\n /**\n * 写入 AMF3 内联字符串(无类型标记)\n *\n * 说明:\n * 这里保持与原 lib 行为一致,不在“无类型字符串”分支中做字符串引用表复用。\n */\n private writeInlineString(value: string): void {\n const bytes = new TextEncoder().encode(value);\n this.writeInt29((bytes.length << 1) | 1);\n this.write(bytes);\n }\n\n /**\n * 写入 AMF3 数组(密集数组或关联数组)\n */\n private writeArray(value: any[] | Record<string, any>): void {\n if (Array.isArray(value)) {\n this.writeInt29((value.length << 1) | 1);\n this.writeInlineString('');\n for (let i = 0; i < value.length; i++) {\n this.encodeValue(value[i]);\n }\n return;\n }\n\n this.writeInt29(0x01);\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key.indexOf('__') === 0) {\n continue;\n }\n this.writeInlineString(key);\n this.encodeValue((value as Record<string, any>)[key]);\n }\n this.writeInlineString('');\n }\n\n /**\n * 写入 AMF3 对象\n */\n private writeObjectValue(value: Record<string, any>): void {\n // 判断是否按动态对象编码\n // __dynamic 为 false 时强制静态编码,否则无 __class 时为动态\n const isDynamic = value.__dynamic !== false && !value.__class;\n\n if (isDynamic) {\n this.writeInt29(0x0b);\n this.writeInt29(0x01);\n\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key.indexOf('__') === 0) {\n continue;\n }\n //key和value交替写入\n this.writeInlineString(key);\n this.encodeValue(value[key]);\n }\n this.writeInlineString('');\n return;\n }\n // 静态编码\n const externalizable = value instanceof Externalizable;\n const keys = externalizable ? [] : getSerializableKeys(value);\n\n let header = keys.length << 4;\n header |= (externalizable ? 1 : 0) << 2;\n header = (header | 2) | 1;\n\n this.writeInt29(header);\n this.writeInlineString(value.__class || '');\n\n if (externalizable) {\n (value as Externalizable).write(this);\n return;\n }\n // key\n for (let i = 0; i < keys.length; i++) {\n this.writeInlineString(keys[i]);\n }\n // value\n for (let i = 0; i < keys.length; i++) {\n this.encodeValue(value[keys[i]]);\n }\n }\n\n /**\n * 写入 AMF3 ByteArray\n */\n private writeByteArray(value: Uint8Array): void {\n this.writeInt29((value.length << 1) | 1);\n this.write(value);\n }\n}\n\nexport default AMFEncoder;\n"],"names":["ForcedTypeValue","value","type","AMFTrait","name","dynamic","externalizable","Serializable","serializableName","Externalizable","externalizableName","encoder","decoder","AMFType","id","referencable","AMF0","key","AMF3","Reader","data","pos","length","alwaysReturnArray","result","bytes","total","byte","handle","isDef","_AMFDecoder","className","cls","typeId","header","ref","named","idx","dense","i","flags","trait","isExternalizable","isDynamic","staticKeyLen","arr","ext","extObj","field","reader","AMFDecoder","Writer","offset","chunk","v","buffer","getSerializableKeys","AMFEncoder","realValue","index","keys"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amf-ts",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "AMF3 implementation for browser and nodejs in TypeScript",
5
5
  "type": "module",
6
6
  "main": "dist/amf.js",