{"version":3,"sources":["../../src/remoteValue/remoteValue.ts"],"sourcesContent":["import { RemoteError, RemoteTimeoutError, response } from '../response'\r\nimport { Adaptor, AdaptorCallback, AdaptorPackageData } from '../adaptor'\r\nimport type { RemoteCallData, ToFunc } from './type'\r\n\r\nfunction noop() {\r\n  // pass\r\n}\r\n\r\ntype RemoteValueProps = Pick<\r\n  AdaptorPackageData,\r\n  'deviceId' | 'targetDeviceId'\r\n> & {\r\n  globalName: string\r\n  adaptor: Adaptor\r\n  timeoutMs?: number\r\n  log?: boolean\r\n}\r\n\r\nfunction geneProxy<T extends object>(paths: string[], props: RemoteValueProps) {\r\n  return new Proxy<ToFunc<T>>(noop as unknown as ToFunc<T>, {\r\n    apply(target, thisArg, argArray) {\r\n      const {\r\n        adaptor,\r\n        globalName,\r\n        timeoutMs = 30000,\r\n        log = false,\r\n        ...restProps\r\n      } = props\r\n      const randomStr = Math.random().toString(36).slice(2)\r\n      const name = `__REMOTE_VALUE_REQ__${globalName}`\r\n      const responseName = `__REMOTE_VALUE_RES__${[globalName, ...paths].join('.')}-${randomStr}`\r\n\r\n      if (log) {\r\n        console.log(\r\n          `[remoteValue] [${restProps.deviceId}] 正在访问远端 [${restProps.targetDeviceId}] 的变量: \"${[globalName, ...paths].join('.')}\"`\r\n        )\r\n      }\r\n\r\n      return new Promise((resolve, reject) => {\r\n        let timer: NodeJS.Timeout | undefined\r\n        const callback: AdaptorCallback = (e) => {\r\n          clearTimeout(timer)\r\n          if (RemoteError.isRemoteError(e.data)) {\r\n            reject(RemoteError.fromError(e.data))\r\n          } else {\r\n            resolve((e.data as ReturnType<typeof response.success>)?.data)\r\n          }\r\n        }\r\n        adaptor.once(responseName, callback)\r\n        timer = setTimeout(() => {\r\n          adaptor.off(responseName, callback)\r\n          reject(\r\n            new RemoteTimeoutError(\r\n              `timeout: ${[globalName, ...paths].join('.')}`\r\n            )\r\n          )\r\n        }, timeoutMs)\r\n        adaptor.emit({\r\n          name,\r\n          callbackName: responseName,\r\n          ...restProps,\r\n          data: {\r\n            paths,\r\n            args: argArray,\r\n          } satisfies RemoteCallData,\r\n        })\r\n      })\r\n    },\r\n    get(target, prop) {\r\n      return geneProxy([...paths, prop as string], props)\r\n    },\r\n  })\r\n}\r\n\r\n/**\r\n * @example\r\n * ```\r\n * const obj = remoteValue<{\r\n *   a: number;\r\n *   b: {\r\n *     c: string;\r\n *   };\r\n *   funcD: () => number\r\n * }>()\r\n *\r\n * const val_1 = await obj.a()      // number\r\n * const val_2 = await obj.b()      // { c: string }\r\n * const val_3 = await obj.b.c()    // string\r\n * const val_4 = await obj.funcD()  // number\r\n * ```\r\n */\r\nexport function remoteValue<T extends object>(props: RemoteValueProps) {\r\n  return geneProxy<T>([], props)\r\n}\r\n"],"mappings":"AAAA,OAAS,eAAAA,EAAa,sBAAAC,MAAoC,cAI1D,SAASC,GAAO,CAEhB,CAYA,SAASC,EAA4BC,EAAiBC,EAAyB,CAC7E,OAAO,IAAI,MAAiBH,EAA8B,CACxD,MAAMI,EAAQC,EAASC,EAAU,CAC/B,KAAM,CACJ,QAAAC,EACA,WAAAC,EACA,UAAAC,EAAY,IACZ,IAAAC,EAAM,GACN,GAAGC,CACL,EAAIR,EACES,EAAY,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,EAC9CC,EAAO,uBAAuBL,CAAU,GACxCM,EAAe,uBAAuB,CAACN,EAAY,GAAGN,CAAK,EAAE,KAAK,GAAG,CAAC,IAAIU,CAAS,GAEzF,OAAIF,GACF,QAAQ,IACN,kBAAkBC,EAAU,QAAQ,2CAAaA,EAAU,cAAc,0BAAW,CAACH,EAAY,GAAGN,CAAK,EAAE,KAAK,GAAG,CAAC,GACtH,EAGK,IAAI,QAAQ,CAACa,EAASC,IAAW,CACtC,IAAIC,EACJ,MAAMC,EAA6BC,GAAM,CAxCjD,IAAAC,EAyCU,aAAaH,CAAK,EACdnB,EAAY,cAAcqB,EAAE,IAAI,EAClCH,EAAOlB,EAAY,UAAUqB,EAAE,IAAI,CAAC,EAEpCJ,GAASK,EAAAD,EAAE,OAAF,YAAAC,EAAgD,IAAI,CAEjE,EACAb,EAAQ,KAAKO,EAAcI,CAAQ,EACnCD,EAAQ,WAAW,IAAM,CACvBV,EAAQ,IAAIO,EAAcI,CAAQ,EAClCF,EACE,IAAIjB,EACF,YAAY,CAACS,EAAY,GAAGN,CAAK,EAAE,KAAK,GAAG,CAAC,EAC9C,CACF,CACF,EAAGO,CAAS,EACZF,EAAQ,KAAK,CACX,KAAAM,EACA,aAAcC,EACd,GAAGH,EACH,KAAM,CACJ,MAAAT,EACA,KAAMI,CACR,CACF,CAAC,CACH,CAAC,CACH,EACA,IAAIF,EAAQiB,EAAM,CAChB,OAAOpB,EAAU,CAAC,GAAGC,EAAOmB,CAAc,EAAGlB,CAAK,CACpD,CACF,CAAC,CACH,CAmBO,SAASmB,EAA8BnB,EAAyB,CACrE,OAAOF,EAAa,CAAC,EAAGE,CAAK,CAC/B","names":["RemoteError","RemoteTimeoutError","noop","geneProxy","paths","props","target","thisArg","argArray","adaptor","globalName","timeoutMs","log","restProps","randomStr","name","responseName","resolve","reject","timer","callback","e","_a","prop","remoteValue"]}