* Serializes this instance into the provided serializer context. * @param {DeserializedType} data data * @param {Context} context context object * @returns {SerializedType | Promise<SerializedType> | null} serialized data
(data, context)
| 377 | * @returns {SerializedType | Promise<SerializedType> | null} serialized data |
| 378 | */ |
| 379 | serialize(data, context) { |
| 380 | /** @type {PrimitiveSerializableType[]} */ |
| 381 | let result = [CURRENT_VERSION]; |
| 382 | let currentPos = 0; |
| 383 | /** @type {Map<ReferenceableItem, number>} */ |
| 384 | let referenceable = new Map(); |
| 385 | /** |
| 386 | * Adds referenceable. |
| 387 | * @param {ReferenceableItem} item referenceable item |
| 388 | */ |
| 389 | const addReferenceable = (item) => { |
| 390 | referenceable.set(item, currentPos++); |
| 391 | }; |
| 392 | /** @type {Map<number, Buffer | [Buffer, Buffer] | Map<string, Buffer>>} */ |
| 393 | let bufferDedupeMap = new Map(); |
| 394 | /** |
| 395 | * Returns deduped buffer. |
| 396 | * @param {Buffer} buf buffer |
| 397 | * @returns {Buffer} deduped buffer |
| 398 | */ |
| 399 | const dedupeBuffer = (buf) => { |
| 400 | const len = buf.length; |
| 401 | const entry = bufferDedupeMap.get(len); |
| 402 | if (entry === undefined) { |
| 403 | bufferDedupeMap.set(len, buf); |
| 404 | return buf; |
| 405 | } |
| 406 | if (Buffer.isBuffer(entry)) { |
| 407 | if (len < 32) { |
| 408 | if (buf.equals(entry)) { |
| 409 | return entry; |
| 410 | } |
| 411 | bufferDedupeMap.set(len, [entry, buf]); |
| 412 | return buf; |
| 413 | } |
| 414 | const hash = toHash(entry, this._hashFunction); |
| 415 | /** @type {Map<string, Buffer>} */ |
| 416 | const newMap = new Map(); |
| 417 | newMap.set(hash, entry); |
| 418 | bufferDedupeMap.set(len, newMap); |
| 419 | const hashBuf = toHash(buf, this._hashFunction); |
| 420 | if (hash === hashBuf) { |
| 421 | return entry; |
| 422 | } |
| 423 | return buf; |
| 424 | } else if (Array.isArray(entry)) { |
| 425 | if (entry.length < 16) { |
| 426 | for (const item of entry) { |
| 427 | if (buf.equals(item)) { |
| 428 | return item; |
| 429 | } |
| 430 | } |
| 431 | entry.push(buf); |
| 432 | return buf; |
| 433 | } |
| 434 | /** @type {Map<string, Buffer>} */ |
| 435 | const newMap = new Map(); |
| 436 | const hash = toHash(buf, this._hashFunction); |