{"version":3,"file":"utils/data/local.mjs","sources":["../../../src/utils/data/local.ts"],"sourcesContent":["import { Manifest as ManifestShared } from '@rsdoctor/utils/common';\nimport { Common, Manifest, SDK } from '@rsdoctor/types';\nimport { get } from 'es-toolkit/compat';\nimport type { Socket } from 'socket.io-client';\nimport { BaseDataLoader } from './base';\nimport { getSocket } from '../socket';\n\nexport class LocalServerDataLoader extends BaseDataLoader {\n  protected events: Map<\n    SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n    Set<Common.Function>\n  > = new Map();\n\n  public isLocal() {\n    return true;\n  }\n\n  public async loadData<T extends keyof Manifest.RsdoctorManifestData>(\n    key: T,\n  ): Promise<void | Manifest.RsdoctorManifestData[T]>;\n\n  public async loadData(key: string): Promise<unknown> {\n    return this.limit(key, async () => {\n      const [scope, ...rest] = this.getKeys(key);\n      const data = this.getData(scope as keyof Manifest.RsdoctorManifestData);\n\n      if (!data) return;\n\n      let res: unknown = data;\n\n      // sharding files\n      if (ManifestShared.isShardingData(res)) {\n        if (!this.shardingDataMap.has(key)) {\n          const task = new Promise((resolve) => {\n            this.getSocket().emit(\n              SDK.ServerAPI.API.LoadDataByKey,\n              { key },\n              (\n                res: SDK.ServerAPI.SocketResponseType<SDK.ServerAPI.API.LoadDataByKey>,\n              ) => {\n                resolve(res.res);\n              },\n            );\n          });\n          // const task = postServerAPI(SDK.ServerAPI.API.LoadDataByKey, { key }).catch((err) => {\n          //   this.log(`loadData error: `, res, key);\n          //   throw err;\n          // });\n          // save with every key\n          this.shardingDataMap.set(key, task);\n        }\n\n        res = await this.shardingDataMap.get(key);\n        this.shardingDataMap.delete(key);\n        return res;\n      }\n\n      return rest.length > 0 ? get(res, this.joinKeys(rest)) : res;\n    });\n  }\n\n  public async loadAPI<\n    T extends SDK.ServerAPI.API,\n    B extends SDK.ServerAPI.InferRequestBodyType<T> =\n      SDK.ServerAPI.InferRequestBodyType<T>,\n    R extends SDK.ServerAPI.InferResponseType<T> =\n      SDK.ServerAPI.InferResponseType<T>,\n  >(...args: B extends void ? [api: T] : [api: T, body: B]): Promise<R> {\n    const [api, body] = args;\n    // request limitation key\n    const key = body ? `${api}_${JSON.stringify(body)}` : `${api}`;\n\n    return this.limit(key, async () => {\n      return new Promise((resolve) => {\n        this.getSocket().emit(\n          api,\n          body,\n          (res: SDK.ServerAPI.SocketResponseType<T>) => {\n            resolve(res.res as R);\n          },\n        );\n      });\n      // const res = await postServerAPI(...args).catch((err) => {\n      //   this.log(`loadAPI error: `, key);\n      //   throw err;\n      // });\n\n      // return res as R;\n    });\n  }\n\n  public dispose() {\n    super.dispose();\n    this.events.forEach((evs, api) => {\n      evs.forEach((ev) => {\n        this.removeOnDataUpdate(api, ev);\n      });\n      evs.clear();\n    });\n    this.events.clear();\n  }\n\n  /**\n   * add event listener when received data from server.\n   */\n  public onDataUpdate<T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends>(\n    api: T,\n    fn: (response: SDK.ServerAPI.SocketResponseType<T>) => void,\n  ) {\n    if (!this.events.has(api)) {\n      this.events.set(api, new Set());\n    }\n\n    if (this.events.get(api)!.has(fn)) {\n      return;\n    }\n\n    this.events.get(api)!.add(fn);\n    this.getSocket().on(api as string, fn);\n  }\n\n  public removeOnDataUpdate<\n    T extends SDK.ServerAPI.API | SDK.ServerAPI.APIExtends,\n  >(api: T, fn: (response: SDK.ServerAPI.SocketResponseType<T>) => void) {\n    this.getSocket().off(api as string, fn);\n    this.events.get(api)!.delete(fn);\n  }\n\n  protected getSocket(): Socket {\n    const socketPort = this.get('__SOCKET__PORT__') ?? '';\n    const socketUrl = this.get('__SOCKET__URL__') ?? '';\n    return getSocket(socketPort, socketUrl);\n  }\n}\n"],"names":["LocalServerDataLoader","BaseDataLoader","key","scope","rest","data","res","ManifestShared","task","Promise","resolve","SDK","get","args","api","body","JSON","evs","ev","fn","Set","socketPort","socketUrl","getSocket","Map"],"mappings":";;;;;;;;;;;;;;;AAOO,MAAMA,8BAA8BC;IAMlC,UAAU;QACf,OAAO;IACT;IAMA,MAAa,SAASC,GAAW,EAAoB;QACnD,OAAO,IAAI,CAAC,KAAK,CAACA,KAAK;YACrB,MAAM,CAACC,OAAO,GAAGC,KAAK,GAAG,IAAI,CAAC,OAAO,CAACF;YACtC,MAAMG,OAAO,IAAI,CAAC,OAAO,CAACF;YAE1B,IAAI,CAACE,MAAM;YAEX,IAAIC,MAAeD;YAGnB,IAAIE,SAAAA,cAA6B,CAACD,MAAM;gBACtC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAACJ,MAAM;oBAClC,MAAMM,OAAO,IAAIC,QAAQ,CAACC;wBACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CACnBC,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa,EAC/B;4BAAET;wBAAI,GACN,CACEI;4BAEAI,QAAQJ,IAAI,GAAG;wBACjB;oBAEJ;oBAMA,IAAI,CAAC,eAAe,CAAC,GAAG,CAACJ,KAAKM;gBAChC;gBAEAF,MAAM,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAACJ;gBACrC,IAAI,CAAC,eAAe,CAAC,MAAM,CAACA;gBAC5B,OAAOI;YACT;YAEA,OAAOF,KAAK,MAAM,GAAG,IAAIQ,IAAIN,KAAK,IAAI,CAAC,QAAQ,CAACF,SAASE;QAC3D;IACF;IAEA,MAAa,QAMX,GAAGO,IAAmD,EAAc;QACpE,MAAM,CAACC,KAAKC,KAAK,GAAGF;QAEpB,MAAMX,MAAMa,OAAO,GAAGD,IAAI,CAAC,EAAEE,KAAK,SAAS,CAACD,OAAO,GAAG,GAAGD,KAAK;QAE9D,OAAO,IAAI,CAAC,KAAK,CAACZ,KAAK,UACd,IAAIO,QAAQ,CAACC;gBAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CACnBI,KACAC,MACA,CAACT;oBACCI,QAAQJ,IAAI,GAAG;gBACjB;YAEJ;IAQJ;IAEO,UAAU;QACf,KAAK,CAAC;QACN,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAACW,KAAKH;YACxBG,IAAI,OAAO,CAAC,CAACC;gBACX,IAAI,CAAC,kBAAkB,CAACJ,KAAKI;YAC/B;YACAD,IAAI,KAAK;QACX;QACA,IAAI,CAAC,MAAM,CAAC,KAAK;IACnB;IAKO,aACLH,GAAM,EACNK,EAA2D,EAC3D;QACA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAACL,MACnB,IAAI,CAAC,MAAM,CAAC,GAAG,CAACA,KAAK,IAAIM;QAG3B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAACN,KAAM,GAAG,CAACK,KAC5B;QAGF,IAAI,CAAC,MAAM,CAAC,GAAG,CAACL,KAAM,GAAG,CAACK;QAC1B,IAAI,CAAC,SAAS,GAAG,EAAE,CAACL,KAAeK;IACrC;IAEO,mBAELL,GAAM,EAAEK,EAA2D,EAAE;QACrE,IAAI,CAAC,SAAS,GAAG,GAAG,CAACL,KAAeK;QACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAACL,KAAM,MAAM,CAACK;IAC/B;IAEU,YAAoB;QAC5B,MAAME,aAAa,IAAI,CAAC,GAAG,CAAC,uBAAuB;QACnD,MAAMC,YAAY,IAAI,CAAC,GAAG,CAAC,sBAAsB;QACjD,OAAOC,UAAUF,YAAYC;IAC/B;;QA7HK,gBACL,uBAAU,UAGN,IAAIE;;AA0HV"}