{"version":3,"file":"jsonplus.cjs","names":["DeltaSnapshot","stringify"],"sources":["../../src/serde/jsonplus.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-instanceof/no-instanceof */\nimport { load } from \"@langchain/core/load\";\nimport { SerializerProtocol } from \"./base.js\";\nimport { stringify } from \"./utils/fast-safe-stringify/index.js\";\nimport { type ConstructorRecord, DeltaSnapshot } from \"./types.js\";\n\nfunction isLangChainSerializedObject(value: Record<string, unknown>) {\n  return (\n    value !== null &&\n    value.lc === 1 &&\n    value.type === \"constructor\" &&\n    Array.isArray(value.id)\n  );\n}\n\nfunction isUndefinedRecord(value: Record<string, unknown>): boolean {\n  return value.lc === 2 && value.type === \"undefined\";\n}\n\nfunction isDeltaSnapshotRecord(value: Record<string, unknown>): boolean {\n  return (\n    value.lc === 2 &&\n    value.type === \"delta_snapshot\" &&\n    Object.prototype.hasOwnProperty.call(value, \"value\")\n  );\n}\n\nfunction isConstructorRecord(\n  value: Record<string, unknown>\n): value is ConstructorRecord {\n  return value.lc === 2 && value.type === \"constructor\";\n}\n\nfunction hasConstructorId(record: ConstructorRecord, name: string): boolean {\n  return (\n    Array.isArray(record.id) && record.id.length === 1 && record.id[0] === name\n  );\n}\n\nfunction hasNoMethod(record: ConstructorRecord): boolean {\n  return record.method === undefined || record.method === null;\n}\n\nfunction hasSingleArrayArg(\n  record: ConstructorRecord\n): record is ConstructorRecord & { args: unknown[][] } {\n  return (\n    Array.isArray(record.args) &&\n    record.args.length === 1 &&\n    Array.isArray(record.args[0])\n  );\n}\n\nfunction isByteArray(value: unknown[]): value is number[] {\n  return value.every(\n    (item) =>\n      typeof item === \"number\" &&\n      Number.isInteger(item) &&\n      item >= 0 &&\n      item <= 255\n  );\n}\n\n/**\n * Reconstruct only the closed set of lc:2 values written by `_default`.\n *\n * A constructor record is serialized data, not an instruction to resolve a\n * property or invoke a method. Invalid and unsupported records are kept inert\n * by the caller so old or attacker-controlled checkpoint data cannot execute.\n */\nfunction reviveConstructorRecord(\n  record: ConstructorRecord\n): unknown | undefined {\n  if (hasConstructorId(record, \"Set\") && hasNoMethod(record)) {\n    if (!hasSingleArrayArg(record)) return undefined;\n    return new Set(record.args[0]);\n  }\n\n  if (hasConstructorId(record, \"Map\") && hasNoMethod(record)) {\n    if (\n      !hasSingleArrayArg(record) ||\n      !record.args[0].every(\n        (entry) => Array.isArray(entry) && entry.length === 2\n      )\n    ) {\n      return undefined;\n    }\n    return new Map(record.args[0] as [unknown, unknown][]);\n  }\n\n  if (hasConstructorId(record, \"RegExp\") && hasNoMethod(record)) {\n    if (\n      !Array.isArray(record.args) ||\n      record.args.length !== 2 ||\n      typeof record.args[0] !== \"string\" ||\n      typeof record.args[1] !== \"string\"\n    ) {\n      return undefined;\n    }\n    try {\n      return new RegExp(record.args[0], record.args[1]);\n    } catch {\n      // Invalid patterns are malformed persisted data and stay inert.\n      return undefined;\n    }\n  }\n\n  if (hasConstructorId(record, \"Error\") && hasNoMethod(record)) {\n    if (\n      !Array.isArray(record.args) ||\n      record.args.length !== 1 ||\n      typeof record.args[0] !== \"string\"\n    ) {\n      return undefined;\n    }\n    return new Error(record.args[0]);\n  }\n\n  if (\n    hasConstructorId(record, \"Uint8Array\") &&\n    (hasNoMethod(record) || record.method === \"from\")\n  ) {\n    if (!hasSingleArrayArg(record) || !isByteArray(record.args[0])) {\n      return undefined;\n    }\n    // `from` is a legacy format tag. Do not forward its serialized method or\n    // any extra arguments: the validated bytes are the entire persisted form.\n    return new Uint8Array(record.args[0]);\n  }\n\n  return undefined;\n}\n\n/**\n * The replacer in stringify does not allow delegation to built-in LangChain\n * serialization methods, and instead immediately calls `.toJSON()` and\n * continues to stringify subfields.\n *\n * We therefore must start from the most nested elements in the input and\n * deserialize upwards rather than top-down.\n */\nasync function _reviver(value: any): Promise<any> {\n  if (value && typeof value === \"object\") {\n    if (Array.isArray(value)) {\n      const revivedArray = await Promise.all(\n        value.map((item) => _reviver(item))\n      );\n      return revivedArray;\n    } else {\n      const revivedObj: Record<string, unknown> = {};\n      for (const [k, v] of Object.entries(value)) {\n        revivedObj[k] = await _reviver(v);\n      }\n\n      if (isUndefinedRecord(revivedObj)) {\n        return undefined;\n      } else if (isDeltaSnapshotRecord(revivedObj)) {\n        // Wrapped value is already revived (bottom-up traversal).\n        return new DeltaSnapshot(revivedObj.value);\n      } else if (isConstructorRecord(revivedObj)) {\n        return reviveConstructorRecord(revivedObj) ?? revivedObj;\n      } else if (isLangChainSerializedObject(revivedObj)) {\n        return load(JSON.stringify(revivedObj));\n      }\n\n      return revivedObj;\n    }\n  }\n  return value;\n}\n\nfunction _encodeConstructorArgs(\n  // oxlint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  constructor: Function,\n  method?: string,\n  args?: any[],\n  kwargs?: Record<string, any>\n): object {\n  return {\n    lc: 2,\n    type: \"constructor\",\n    id: [constructor.name],\n    method: method ?? null,\n    args: args ?? [],\n    kwargs: kwargs ?? {},\n  };\n}\n\nfunction _default(obj: any): any {\n  if (obj === undefined) {\n    return {\n      lc: 2,\n      type: \"undefined\",\n    };\n  } else if (obj instanceof DeltaSnapshot) {\n    return {\n      lc: 2,\n      type: \"delta_snapshot\",\n      // `value` continues to be walked by `stringify`, so nested\n      // serializable types (messages, Maps, etc.) are encoded normally.\n      value: obj.value,\n    };\n  } else if (obj instanceof Set || obj instanceof Map) {\n    return _encodeConstructorArgs(obj.constructor, undefined, [\n      Array.from(obj),\n    ]);\n  } else if (obj instanceof RegExp) {\n    return _encodeConstructorArgs(RegExp, undefined, [obj.source, obj.flags]);\n  } else if (obj instanceof Error) {\n    return _encodeConstructorArgs(Error, undefined, [obj.message]);\n    // TODO: Remove special case\n  } else if (obj?.lg_name === \"Send\") {\n    return {\n      node: obj.node,\n      args: obj.args,\n      // preserve an optional per-task timeout policy across (de)serialization\n      ...(obj.timeout !== undefined ? { timeout: obj.timeout } : {}),\n    };\n  } else if (obj instanceof Uint8Array) {\n    return _encodeConstructorArgs(Uint8Array, \"from\", [Array.from(obj)]);\n  } else {\n    return obj;\n  }\n}\n\nexport class JsonPlusSerializer implements SerializerProtocol {\n  protected _dumps(obj: any): Uint8Array {\n    const encoder = new TextEncoder();\n    return encoder.encode(\n      stringify(obj, (_: string, value: any) => {\n        return _default(value);\n      })\n    );\n  }\n\n  async dumpsTyped(obj: any): Promise<[string, Uint8Array]> {\n    if (obj instanceof Uint8Array) {\n      return [\"bytes\", obj];\n    } else {\n      return [\"json\", this._dumps(obj)];\n    }\n  }\n\n  protected async _loads(data: string): Promise<any> {\n    const parsed = JSON.parse(data);\n    return _reviver(parsed);\n  }\n\n  async loadsTyped(type: string, data: Uint8Array | string): Promise<any> {\n    if (type === \"bytes\") {\n      return typeof data === \"string\" ? new TextEncoder().encode(data) : data;\n    } else if (type === \"json\") {\n      return this._loads(\n        typeof data === \"string\" ? data : new TextDecoder().decode(data)\n      );\n    } else {\n      throw new Error(`Unknown serialization type: ${type}`);\n    }\n  }\n}\n"],"mappings":"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"}