{"version":3,"sources":["../../src/internals/serializable.ts"],"names":["Serializable","Object","getPrototypeOf","register","Cache","init","aliases","Serializer","registerSerializable","undefined","clone","snapshot","createSnapshot","target","create","prototype","loadSnapshot","serialize","extractClassName","deserialize","value","options","__root","deserializeWithMeta","extraClasses","allowFunctionDeserialization","console","warn","current","SerializerError","fromSnapshot","state","fromSerialized","serialized"],"mappings":";;;;;;;;;AA6BO,MAAeA,YAAAA,CAAAA;EA7BtB;;;EAiCE,WAAA,GAAc;AACZC,IAAAA,MAAAA,CAAOC,cAAAA,CAAe,IAAI,CAAA,CAAE,WAAA,CAAYC,QAAAA,EAAQ;AAChDC,IAAAA,wBAAAA,CAAMC,KAAK,IAAI,CAAA;AACjB,EAAA;AAEA,EAAA,OAAcF,SAAwCG,OAAAA,EAAoB;AACxEC,IAAAA,yBAAAA,CAAWC,oBAAAA,CAAqB,IAAA,EAAMC,MAAAA,EAAWH,OAAAA,CAAAA;AACnD,EAAA;AAEA,EAAA,MAAMI,KAAAA,GAAmD;AACvD,IAAA,MAAMC,QAAAA,GAAW,MAAM,IAAA,CAAKC,cAAAA,EAAc;AAE1C,IAAA,MAAMC,MAAAA,GAASZ,MAAAA,CAAOa,MAAAA,CAAO,IAAA,CAAK,YAAYC,SAAS,CAAA;AACvD,IAAA,MAAMF,MAAAA,CAAOG,aAAaL,QAAAA,CAAAA;AAC1B,IAAA,OAAOE,MAAAA;AACT,EAAA;AAEA,EAAA,MAAMI,SAAAA,GAA6B;AACjC,IAAA,MAAMN,QAAAA,GAAW,MAAM,IAAA,CAAKC,cAAAA,EAAc;AAC1C,IAAA,OAAO,MAAML,0BAAWU,SAAAA,CAAoC;AAC1DJ,MAAAA,MAAAA,EAAQK,2BAAiB,IAAI,CAAA;AAC7BP,MAAAA;KACF,CAAA;AACF,EAAA;EAEA,MAAgBQ,WAAAA,CAAYC,OAAeC,OAAAA,EAA0C;AACnF,IAAA,MAAM,EAAEC,QAAM,GAAK,MAAMf,0BAAWgB,mBAAAA,CAClCH,KAAAA,EACAC,OAAAA,EAASG,YAAAA,EACT,KAAA,EACA;AAAEC,MAAAA,4BAAAA,EAA8BJ,OAAAA,EAASI;KAA6B,CAAA;AAExE,IAAA,IAAI,CAACH,OAAOT,MAAAA,EAAQ;AAElBa,MAAAA,OAAAA,CAAQC,KACN,CAAA,sIAAA,CAAwI,CAAA;AAE1I,MAAA,OAAOL,MAAAA;AACT,IAAA;AAEA,IAAA,MAAMM,OAAAA,GAAUV,2BAAiB,IAAI,CAAA;AACrC,IAAA,IAAIU,OAAAA,KAAYN,OAAOT,MAAAA,EAAQ;AAC7B,MAAA,MAAM,IAAIgB,yBAAAA,CACR,CAAA,qCAAA,EAAwCP,OAAOT,MAAM,CAAA,oCAAA,EAAuCe,OAAAA,CAAAA,EAAAA,CAAW,CAAA;AAE3G,IAAA;AACA,IAAA,OAAON,MAAAA,CAAOX,QAAAA;AAChB,EAAA;AAEA,EAAA,aAAamB,aAEXC,KAAAA,EACY;AACZ,IAAA,MAAMlB,MAAAA,GAASZ,MAAAA,CAAOa,MAAAA,CAAO,IAAA,CAAKC,SAAS,CAAA;AAC3C,IAAA,MAAMF,MAAAA,CAAOG,aAAae,KAAAA,CAAAA;AAC1B3B,IAAAA,wBAAAA,CAAMC,KAAKQ,MAAAA,CAAAA;AACX,IAAA,OAAOA,MAAAA;AACT,EAAA;AAEA,EAAA,aAAamB,cAAAA,CAEXC,UAAAA,EACAZ,OAAAA,GAA8B,EAAC,EACnB;AACZ,IAAA,MAAMR,MAAAA,GAASZ,MAAAA,CAAOa,MAAAA,CAAO,IAAA,CAAKC,SAAS,CAAA;AAC3C,IAAA,MAAMgB,KAAAA,GAAQ,MAAMlB,MAAAA,CAAOM,WAAAA,CAAYc,YAAYZ,OAAAA,CAAAA;AACnD,IAAA,MAAMR,MAAAA,CAAOG,aAAae,KAAAA,CAAAA;AAC1B3B,IAAAA,wBAAAA,CAAMC,KAAKQ,MAAAA,CAAAA;AACX,IAAA,OAAOA,MAAAA;AACT,EAAA;AACF","file":"serializable.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Serializer } from \"@/serializer/serializer.js\";\nimport { ClassConstructor } from \"@/internals/types.js\";\nimport { extractClassName } from \"@/serializer/utils.js\";\nimport { SerializerError } from \"@/serializer/error.js\";\nimport { Cache } from \"@/cache/decoratorCache.js\";\n\nexport type SerializableClass<T> = ClassConstructor<Serializable<T>> &\n  Pick<typeof Serializable<T>, \"fromSnapshot\" | \"fromSerialized\">;\n\ninterface SerializableStructure<T> {\n  target: string;\n  snapshot: T;\n}\n\nexport interface DeserializeOptions {\n  extraClasses?: SerializableClass<unknown>[];\n  /**\n   * Function deserialization is disabled by default because it can execute\n   * arbitrary code from the payload (see GHSA-phhm-7927-g88p). Only set this\n   * to `true` if you fully trust the source of the serialized data.\n   */\n  allowFunctionDeserialization?: boolean;\n}\n\nexport abstract class Serializable<T = unknown> {\n  abstract createSnapshot(): T | Promise<T>;\n  abstract loadSnapshot(snapshot: T): void | Promise<void>;\n\n  constructor() {\n    Object.getPrototypeOf(this).constructor.register();\n    Cache.init(this);\n  }\n\n  public static register<T>(this: SerializableClass<T>, aliases?: string[]) {\n    Serializer.registerSerializable(this, undefined, aliases);\n  }\n\n  async clone<T extends Serializable>(this: T): Promise<T> {\n    const snapshot = await this.createSnapshot();\n\n    const target = Object.create(this.constructor.prototype) as T;\n    await target.loadSnapshot(snapshot);\n    return target;\n  }\n\n  async serialize(): Promise<string> {\n    const snapshot = await this.createSnapshot();\n    return await Serializer.serialize<SerializableStructure<T>>({\n      target: extractClassName(this),\n      snapshot,\n    });\n  }\n\n  protected async deserialize(value: string, options?: DeserializeOptions): Promise<T> {\n    const { __root } = await Serializer.deserializeWithMeta<SerializableStructure<T>>(\n      value,\n      options?.extraClasses,\n      false,\n      { allowFunctionDeserialization: options?.allowFunctionDeserialization },\n    );\n    if (!__root.target) {\n      // eslint-disable-next-line\n      console.warn(\n        `Serializable class must be serialized via \"serialize\" method and not via Serializer class. This may lead to incorrect deserialization.`,\n      );\n      return __root as T;\n    }\n\n    const current = extractClassName(this);\n    if (current !== __root.target) {\n      throw new SerializerError(\n        `Snapshot has been created for class '${__root.target}' but you want to use it for class '${current}'.`,\n      );\n    }\n    return __root.snapshot;\n  }\n\n  static async fromSnapshot<P, T extends Serializable<P>>(\n    this: new (...args: any[]) => T,\n    state: P,\n  ): Promise<T> {\n    const target = Object.create(this.prototype);\n    await target.loadSnapshot(state);\n    Cache.init(target);\n    return target;\n  }\n\n  static async fromSerialized<T extends Serializable>(\n    this: abstract new (...args: any[]) => T,\n    serialized: string,\n    options: DeserializeOptions = {},\n  ): Promise<T> {\n    const target = Object.create(this.prototype) as T;\n    const state = await target.deserialize(serialized, options);\n    await target.loadSnapshot(state);\n    Cache.init(target);\n    return target;\n  }\n}\n"]}