@zimi/remote 0.2.1 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/LICENSE.md +21 -21
  2. package/README.md +289 -285
  3. package/dist/adaptor.d.mts +33 -0
  4. package/dist/adaptor.d.ts +5 -4
  5. package/dist/adaptor.js +1 -1
  6. package/dist/adaptor.js.map +1 -1
  7. package/dist/adaptor.mjs +1 -0
  8. package/dist/adaptor.mjs.map +1 -0
  9. package/dist/adaptors/dao3/client.d.mts +39 -0
  10. package/dist/adaptors/dao3/client.d.ts +5 -3
  11. package/dist/adaptors/dao3/client.js +1 -44
  12. package/dist/adaptors/dao3/client.js.map +1 -1
  13. package/dist/adaptors/dao3/client.mjs +2 -0
  14. package/dist/adaptors/dao3/client.mjs.map +1 -0
  15. package/dist/adaptors/dao3/server.d.mts +82 -0
  16. package/dist/adaptors/dao3/server.d.ts +5 -3
  17. package/dist/adaptors/dao3/server.js +1 -104
  18. package/dist/adaptors/dao3/server.js.map +1 -1
  19. package/dist/adaptors/dao3/server.mjs +2 -0
  20. package/dist/adaptors/dao3/server.mjs.map +1 -0
  21. package/dist/adaptors/electron/constants.d.mts +5 -0
  22. package/dist/adaptors/electron/constants.d.ts +5 -0
  23. package/dist/adaptors/electron/constants.js +2 -0
  24. package/dist/adaptors/electron/constants.js.map +1 -0
  25. package/dist/adaptors/electron/constants.mjs +2 -0
  26. package/dist/adaptors/electron/constants.mjs.map +1 -0
  27. package/dist/adaptors/electron/main.d.mts +10 -0
  28. package/dist/adaptors/electron/main.d.ts +10 -0
  29. package/dist/adaptors/electron/main.js +2 -0
  30. package/dist/adaptors/electron/main.js.map +1 -0
  31. package/dist/adaptors/electron/main.mjs +2 -0
  32. package/dist/adaptors/electron/main.mjs.map +1 -0
  33. package/dist/adaptors/electron/messenger.d.mts +8 -0
  34. package/dist/adaptors/electron/messenger.d.ts +8 -0
  35. package/dist/adaptors/electron/messenger.js +2 -0
  36. package/dist/adaptors/electron/messenger.js.map +1 -0
  37. package/dist/adaptors/electron/messenger.mjs +2 -0
  38. package/dist/adaptors/electron/messenger.mjs.map +1 -0
  39. package/dist/adaptors/electron/preload.d.mts +6 -0
  40. package/dist/adaptors/electron/preload.d.ts +6 -0
  41. package/dist/adaptors/electron/preload.js +2 -0
  42. package/dist/adaptors/electron/preload.js.map +1 -0
  43. package/dist/adaptors/electron/preload.mjs +2 -0
  44. package/dist/adaptors/electron/preload.mjs.map +1 -0
  45. package/dist/adaptors/electron/renderer.d.mts +9 -0
  46. package/dist/adaptors/electron/renderer.d.ts +9 -0
  47. package/dist/adaptors/electron/renderer.js +2 -0
  48. package/dist/adaptors/electron/renderer.js.map +1 -0
  49. package/dist/adaptors/electron/renderer.mjs +2 -0
  50. package/dist/adaptors/electron/renderer.mjs.map +1 -0
  51. package/dist/adaptors/http.d.mts +15 -0
  52. package/dist/adaptors/http.d.ts +6 -4
  53. package/dist/adaptors/http.js +1 -26
  54. package/dist/adaptors/http.js.map +1 -1
  55. package/dist/adaptors/http.mjs +2 -0
  56. package/dist/adaptors/http.mjs.map +1 -0
  57. package/dist/adaptors/iframe.d.mts +7 -0
  58. package/dist/adaptors/iframe.d.ts +5 -2
  59. package/dist/adaptors/iframe.js +1 -38
  60. package/dist/adaptors/iframe.js.map +1 -1
  61. package/dist/adaptors/iframe.mjs +2 -0
  62. package/dist/adaptors/iframe.mjs.map +1 -0
  63. package/dist/index.d.mts +16 -0
  64. package/dist/index.d.ts +16 -10
  65. package/dist/index.js +1 -9
  66. package/dist/index.js.map +1 -1
  67. package/dist/index.mjs +2 -0
  68. package/dist/index.mjs.map +1 -0
  69. package/dist/remote.d.mts +81 -0
  70. package/dist/remote.d.ts +6 -4
  71. package/dist/remote.js +1 -196
  72. package/dist/remote.js.map +1 -1
  73. package/dist/remote.mjs +2 -0
  74. package/dist/remote.mjs.map +1 -0
  75. package/dist/remoteValue/exposeToRemote.d.mts +43 -0
  76. package/dist/remoteValue/exposeToRemote.d.ts +7 -5
  77. package/dist/remoteValue/exposeToRemote.js +1 -52
  78. package/dist/remoteValue/exposeToRemote.js.map +1 -1
  79. package/dist/remoteValue/exposeToRemote.mjs +2 -0
  80. package/dist/remoteValue/exposeToRemote.mjs.map +1 -0
  81. package/dist/remoteValue/remoteValue.d.mts +29 -0
  82. package/dist/remoteValue/remoteValue.d.ts +6 -4
  83. package/dist/remoteValue/remoteValue.js +1 -67
  84. package/dist/remoteValue/remoteValue.js.map +1 -1
  85. package/dist/remoteValue/remoteValue.mjs +2 -0
  86. package/dist/remoteValue/remoteValue.mjs.map +1 -0
  87. package/dist/remoteValue/type.d.mts +67 -0
  88. package/dist/remoteValue/type.d.ts +20 -19
  89. package/dist/remoteValue/type.js +1 -1
  90. package/dist/remoteValue/type.js.map +1 -1
  91. package/dist/remoteValue/type.mjs +1 -0
  92. package/dist/remoteValue/type.mjs.map +1 -0
  93. package/dist/response.d.mts +105 -0
  94. package/dist/response.d.ts +6 -5
  95. package/dist/response.js +1 -154
  96. package/dist/response.js.map +1 -1
  97. package/dist/response.mjs +2 -0
  98. package/dist/response.mjs.map +1 -0
  99. package/package.json +31 -24
  100. package/src/adaptor.ts +34 -34
  101. package/src/adaptors/dao3/client.ts +53 -53
  102. package/src/adaptors/dao3/server.ts +136 -136
  103. package/src/adaptors/electron/constants.ts +3 -0
  104. package/src/adaptors/electron/main.ts +59 -0
  105. package/src/adaptors/electron/messenger.ts +13 -0
  106. package/src/adaptors/electron/preload.ts +21 -0
  107. package/src/adaptors/electron/renderer.ts +52 -0
  108. package/src/adaptors/http.ts +31 -31
  109. package/src/adaptors/iframe.ts +47 -47
  110. package/src/index.ts +17 -12
  111. package/src/remote.ts +263 -260
  112. package/src/remoteValue/exposeToRemote.ts +102 -102
  113. package/src/remoteValue/remoteValue.ts +94 -94
  114. package/src/remoteValue/type.ts +124 -124
  115. package/src/response.ts +170 -170
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../src/remote.ts"],"sourcesContent":["import {\r\n RemoteError,\r\n RemoteNotFoundError,\r\n RemoteTimeoutError,\r\n response,\r\n} from './response'\r\n\r\nimport type { Adaptor, AdaptorCallback, AdaptorPackageData } from './adaptor'\r\n\r\nconst RESPONSE_PREFIX = '_response_'\r\n\r\ntype LogFunc = (...data: unknown[]) => void\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype RemoteCallableFunc = (data: any) => Promise<any>\r\n\r\ninterface RemoteFuncRecords {\r\n [key: string]: RemoteCallableFunc\r\n}\r\n\r\ntype FuncMapWithConfig<T extends RemoteFuncRecords> = {\r\n [K in keyof T]: T[K] extends (data: infer Arg) => Promise<infer Ret>\r\n ? (\r\n data: Arg,\r\n config?: {\r\n timeoutMs?: number\r\n targetDeviceId?: string\r\n }\r\n ) => Promise<Ret>\r\n : never\r\n}\r\n\r\ntype RegisteredFunc<T extends RemoteCallableFunc> = T extends (\r\n data: infer Arg\r\n) => infer Ret\r\n ? (\r\n data: Arg,\r\n ctx: {\r\n /**\r\n * 对方的设备 id\r\n */\r\n deviceId: string\r\n }\r\n ) => Ret\r\n : never\r\n\r\nfunction defaultLog(\r\n this: Remote<\r\n {\r\n [key: string]: RemoteCallableFunc\r\n },\r\n {\r\n [key: string]: RemoteCallableFunc\r\n }\r\n >,\r\n ...data: unknown[]\r\n) {\r\n if (!this.debug) {\r\n return\r\n }\r\n console.log(`[remote of ${this.deviceId}]`, ...data)\r\n}\r\n\r\nexport class Remote<\r\n /**\r\n * MF means my functions\r\n */\r\n MF extends RemoteFuncRecords,\r\n /**\r\n * OF means others functions\r\n */\r\n OF extends RemoteFuncRecords,\r\n> {\r\n debug = false\r\n\r\n private log: LogFunc\r\n\r\n /**\r\n * (调用对方函数时的)默认超时时间,单位 ms\r\n * @default 30000\r\n */\r\n private defaultTimeoutMs = 30000\r\n\r\n private map: {\r\n [key: string]: {\r\n callback: RegisteredFunc<RemoteCallableFunc>\r\n }\r\n } = {}\r\n\r\n private deviceIdValue = ''\r\n\r\n /**\r\n * 设备 id 应该唯一,用于区分不同设备。\r\n * 你可以在任何时候修改(更新)它。\r\n * @default ''\r\n */\r\n get deviceId() {\r\n return this.deviceIdValue\r\n }\r\n\r\n set deviceId(deviceId: string) {\r\n this.log(`deviceId set: from \"${this.deviceIdValue}\" to \"${deviceId}\"`)\r\n this.deviceIdValue = deviceId\r\n }\r\n\r\n constructor(\r\n private adaptor: Adaptor,\r\n config?: {\r\n /**\r\n * 设备 id 应该唯一,用于区分不同设备。\r\n * 你可以在任何时候修改(更新)它。\r\n * @default ''\r\n */\r\n deviceId?: string\r\n /**\r\n * (调用对方函数时的)默认超时时间,单位 ms\r\n * @default 30000\r\n */\r\n defaultTimeoutMs?: number\r\n debug?: boolean\r\n /**\r\n * 格式化 AdaptorPackageData 的函数,\r\n * 用于调试时输出日志。\r\n * @default JSON.stringify\r\n */\r\n log?: LogFunc\r\n }\r\n ) {\r\n this.debug = config?.debug ?? this.debug\r\n this.defaultTimeoutMs = config?.defaultTimeoutMs ?? this.defaultTimeoutMs\r\n this.log = config?.log ?? defaultLog.bind(this)\r\n this.deviceId = config?.deviceId ?? this.deviceId\r\n\r\n adaptor.every(async (e) => {\r\n const { deviceId: selfDeviceId } = this\r\n const { name, data, deviceId: targetDeviceId, callbackName } = e\r\n const callback = this.map[name]?.callback\r\n if (!callback) {\r\n if (name.startsWith(RESPONSE_PREFIX)) {\r\n // 这是响应,会在 callAsync once 中处理,这儿不用处理\r\n this.log('[every] response received: ', e)\r\n return\r\n }\r\n this.log('callback not found: ', name)\r\n if (callbackName) {\r\n adaptor.emit({\r\n deviceId: selfDeviceId,\r\n targetDeviceId,\r\n name: callbackName,\r\n data: response.error(\r\n new RemoteNotFoundError(`callback not found: ${name}`)\r\n ),\r\n })\r\n }\r\n return\r\n }\r\n if (!callbackName) {\r\n this.log('should not respond: ', e)\r\n void callback(data, { deviceId: targetDeviceId })\r\n return\r\n }\r\n this.log(`callback: ${name}; respondName: ${callbackName}; data: `, data)\r\n try {\r\n const ret = await callback(data, { deviceId: targetDeviceId })\r\n this.log('callback return: ', ret)\r\n adaptor.emit({\r\n deviceId: selfDeviceId,\r\n targetDeviceId,\r\n name: callbackName,\r\n data: response.success(ret),\r\n })\r\n } catch (error) {\r\n this.log('callback error: ', error)\r\n adaptor.emit({\r\n deviceId: selfDeviceId,\r\n targetDeviceId,\r\n name: callbackName,\r\n data: response.error(RemoteError.fromError(error)),\r\n })\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 调用其他端的方法;会等待对方响应。\r\n * 不能直接使用该方法,应该使用 proxy。\r\n * @WARNING 不能用于响应其他端。\r\n */\r\n private callAsync(\r\n name: string,\r\n data: unknown,\r\n config?: {\r\n timeoutMs?: number\r\n targetDeviceId?: string\r\n }\r\n ) {\r\n const timeoutMs = config?.timeoutMs ?? this.defaultTimeoutMs\r\n const { deviceId } = this\r\n const randomStr = Math.random().toString(36).slice(2)\r\n // 本条消息的响应名\r\n const responseName = `${RESPONSE_PREFIX}-${name}-${deviceId}-${randomStr}`\r\n return new Promise((resolve, reject) => {\r\n let timer: NodeJS.Timeout | undefined\r\n this.log(`callAsync ${name}: waiting for response: ${responseName}`)\r\n const callback: AdaptorCallback = (e) => {\r\n clearTimeout(timer)\r\n this.log(`response received: ${responseName}`, e)\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 this.adaptor.once(responseName, callback)\r\n timer = setTimeout(() => {\r\n this.log(`timeout: ${responseName}`)\r\n this.adaptor.off(responseName, callback)\r\n reject(new RemoteTimeoutError(`timeout: ${name}`))\r\n }, timeoutMs)\r\n this.adaptor.emit({\r\n deviceId,\r\n targetDeviceId: config?.targetDeviceId ?? '',\r\n name,\r\n data,\r\n callbackName: responseName,\r\n })\r\n })\r\n }\r\n\r\n /**\r\n * 注册方法,供对方调用;\r\n */\r\n register<K extends keyof MF>(name: K, callback: RegisteredFunc<MF[K]>): void {\r\n this.map[name as string] = { callback }\r\n }\r\n\r\n _ = new Proxy<FuncMapWithConfig<OF>>({} as FuncMapWithConfig<OF>, {\r\n get: (_, k) => this.callAsync.bind(this, k as string),\r\n })\r\n\r\n self = new Proxy<MF>({} as MF, {\r\n get: (_, k) => (data: unknown) =>\r\n this.map[k as string]?.callback.apply(null, [\r\n data,\r\n {\r\n deviceId: this.deviceId,\r\n },\r\n ]),\r\n })\r\n}\r\n\r\nexport function isRemoteAdaptorData(data: unknown): data is AdaptorPackageData {\r\n return (\r\n !!data &&\r\n typeof data === 'object' &&\r\n 'deviceId' in data &&\r\n 'name' in data &&\r\n typeof data.deviceId === 'string' &&\r\n typeof data.name === 'string' &&\r\n !!data.deviceId &&\r\n !!data.name\r\n )\r\n}\r\n"],"mappings":"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","names":["remote_exports","__export","Remote","isRemoteAdaptorData","__toCommonJS","import_response","RESPONSE_PREFIX","defaultLog","data","adaptor","config","e","_a","selfDeviceId","name","targetDeviceId","callbackName","callback","ret","error","deviceId","timeoutMs","randomStr","responseName","resolve","reject","timer","_","k"]}
@@ -0,0 +1,2 @@
1
+ import{RemoteError as p,RemoteNotFoundError as b,RemoteTimeoutError as I,response as v}from"./response";const g="_response_";function R(...s){this.debug&&console.log(`[remote of ${this.deviceId}]`,...s)}class y{constructor(t,e){this.adaptor=t;this.debug=(e==null?void 0:e.debug)??this.debug,this.defaultTimeoutMs=(e==null?void 0:e.defaultTimeoutMs)??this.defaultTimeoutMs,this.log=(e==null?void 0:e.log)??R.bind(this),this.deviceId=(e==null?void 0:e.deviceId)??this.deviceId,t.every(async r=>{var u;const{deviceId:i}=this,{name:o,data:c,deviceId:a,callbackName:d}=r,l=(u=this.map[o])==null?void 0:u.callback;if(!l){if(o.startsWith(g)){this.log("[every] response received: ",r);return}this.log("callback not found: ",o),d&&t.emit({deviceId:i,targetDeviceId:a,name:d,data:v.error(new b(`callback not found: ${o}`))});return}if(!d){this.log("should not respond: ",r),l(c,{deviceId:a});return}this.log(`callback: ${o}; respondName: ${d}; data: `,c);try{const n=await l(c,{deviceId:a});this.log("callback return: ",n),t.emit({deviceId:i,targetDeviceId:a,name:d,data:v.success(n)})}catch(n){this.log("callback error: ",n),t.emit({deviceId:i,targetDeviceId:a,name:d,data:v.error(p.fromError(n))})}})}debug=!1;log;defaultTimeoutMs=3e4;map={};deviceIdValue="";get deviceId(){return this.deviceIdValue}set deviceId(t){this.log(`deviceId set: from "${this.deviceIdValue}" to "${t}"`),this.deviceIdValue=t}callAsync(t,e,r){const i=(r==null?void 0:r.timeoutMs)??this.defaultTimeoutMs,{deviceId:o}=this,c=Math.random().toString(36).slice(2),a=`${g}-${t}-${o}-${c}`;return new Promise((d,l)=>{let u;this.log(`callAsync ${t}: waiting for response: ${a}`);const n=m=>{var h;clearTimeout(u),this.log(`response received: ${a}`,m),p.isRemoteError(m.data)?l(p.fromError(m.data)):d((h=m.data)==null?void 0:h.data)};this.adaptor.once(a,n),u=setTimeout(()=>{this.log(`timeout: ${a}`),this.adaptor.off(a,n),l(new I(`timeout: ${t}`))},i),this.adaptor.emit({deviceId:o,targetDeviceId:(r==null?void 0:r.targetDeviceId)??"",name:t,data:e,callbackName:a})})}register(t,e){this.map[t]={callback:e}}_=new Proxy({},{get:(t,e)=>this.callAsync.bind(this,e)});self=new Proxy({},{get:(t,e)=>r=>{var i;return(i=this.map[e])==null?void 0:i.callback.apply(null,[r,{deviceId:this.deviceId}])}})}function k(s){return!!s&&typeof s=="object"&&"deviceId"in s&&"name"in s&&typeof s.deviceId=="string"&&typeof s.name=="string"&&!!s.deviceId&&!!s.name}export{y as Remote,k as isRemoteAdaptorData};
2
+ //# sourceMappingURL=remote.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/remote.ts"],"sourcesContent":["import {\r\n RemoteError,\r\n RemoteNotFoundError,\r\n RemoteTimeoutError,\r\n response,\r\n} from './response'\r\n\r\nimport type { Adaptor, AdaptorCallback, AdaptorPackageData } from './adaptor'\r\n\r\nconst RESPONSE_PREFIX = '_response_'\r\n\r\ntype LogFunc = (...data: unknown[]) => void\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype RemoteCallableFunc = (data: any) => Promise<any>\r\n\r\ninterface RemoteFuncRecords {\r\n [key: string]: RemoteCallableFunc\r\n}\r\n\r\ntype FuncMapWithConfig<T extends RemoteFuncRecords> = {\r\n [K in keyof T]: T[K] extends (data: infer Arg) => Promise<infer Ret>\r\n ? (\r\n data: Arg,\r\n config?: {\r\n timeoutMs?: number\r\n targetDeviceId?: string\r\n }\r\n ) => Promise<Ret>\r\n : never\r\n}\r\n\r\ntype RegisteredFunc<T extends RemoteCallableFunc> = T extends (\r\n data: infer Arg\r\n) => infer Ret\r\n ? (\r\n data: Arg,\r\n ctx: {\r\n /**\r\n * 对方的设备 id\r\n */\r\n deviceId: string\r\n }\r\n ) => Ret\r\n : never\r\n\r\nfunction defaultLog(\r\n this: Remote<\r\n {\r\n [key: string]: RemoteCallableFunc\r\n },\r\n {\r\n [key: string]: RemoteCallableFunc\r\n }\r\n >,\r\n ...data: unknown[]\r\n) {\r\n if (!this.debug) {\r\n return\r\n }\r\n console.log(`[remote of ${this.deviceId}]`, ...data)\r\n}\r\n\r\nexport class Remote<\r\n /**\r\n * MF means my functions\r\n */\r\n MF extends RemoteFuncRecords,\r\n /**\r\n * OF means others functions\r\n */\r\n OF extends RemoteFuncRecords,\r\n> {\r\n debug = false\r\n\r\n private log: LogFunc\r\n\r\n /**\r\n * (调用对方函数时的)默认超时时间,单位 ms\r\n * @default 30000\r\n */\r\n private defaultTimeoutMs = 30000\r\n\r\n private map: {\r\n [key: string]: {\r\n callback: RegisteredFunc<RemoteCallableFunc>\r\n }\r\n } = {}\r\n\r\n private deviceIdValue = ''\r\n\r\n /**\r\n * 设备 id 应该唯一,用于区分不同设备。\r\n * 你可以在任何时候修改(更新)它。\r\n * @default ''\r\n */\r\n get deviceId() {\r\n return this.deviceIdValue\r\n }\r\n\r\n set deviceId(deviceId: string) {\r\n this.log(`deviceId set: from \"${this.deviceIdValue}\" to \"${deviceId}\"`)\r\n this.deviceIdValue = deviceId\r\n }\r\n\r\n constructor(\r\n private adaptor: Adaptor,\r\n config?: {\r\n /**\r\n * 设备 id 应该唯一,用于区分不同设备。\r\n * 你可以在任何时候修改(更新)它。\r\n * @default ''\r\n */\r\n deviceId?: string\r\n /**\r\n * (调用对方函数时的)默认超时时间,单位 ms\r\n * @default 30000\r\n */\r\n defaultTimeoutMs?: number\r\n debug?: boolean\r\n /**\r\n * 格式化 AdaptorPackageData 的函数,\r\n * 用于调试时输出日志。\r\n * @default JSON.stringify\r\n */\r\n log?: LogFunc\r\n }\r\n ) {\r\n this.debug = config?.debug ?? this.debug\r\n this.defaultTimeoutMs = config?.defaultTimeoutMs ?? this.defaultTimeoutMs\r\n this.log = config?.log ?? defaultLog.bind(this)\r\n this.deviceId = config?.deviceId ?? this.deviceId\r\n\r\n adaptor.every(async (e) => {\r\n const { deviceId: selfDeviceId } = this\r\n const { name, data, deviceId: targetDeviceId, callbackName } = e\r\n const callback = this.map[name]?.callback\r\n if (!callback) {\r\n if (name.startsWith(RESPONSE_PREFIX)) {\r\n // 这是响应,会在 callAsync once 中处理,这儿不用处理\r\n this.log('[every] response received: ', e)\r\n return\r\n }\r\n this.log('callback not found: ', name)\r\n if (callbackName) {\r\n adaptor.emit({\r\n deviceId: selfDeviceId,\r\n targetDeviceId,\r\n name: callbackName,\r\n data: response.error(\r\n new RemoteNotFoundError(`callback not found: ${name}`)\r\n ),\r\n })\r\n }\r\n return\r\n }\r\n if (!callbackName) {\r\n this.log('should not respond: ', e)\r\n void callback(data, { deviceId: targetDeviceId })\r\n return\r\n }\r\n this.log(`callback: ${name}; respondName: ${callbackName}; data: `, data)\r\n try {\r\n const ret = await callback(data, { deviceId: targetDeviceId })\r\n this.log('callback return: ', ret)\r\n adaptor.emit({\r\n deviceId: selfDeviceId,\r\n targetDeviceId,\r\n name: callbackName,\r\n data: response.success(ret),\r\n })\r\n } catch (error) {\r\n this.log('callback error: ', error)\r\n adaptor.emit({\r\n deviceId: selfDeviceId,\r\n targetDeviceId,\r\n name: callbackName,\r\n data: response.error(RemoteError.fromError(error)),\r\n })\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 调用其他端的方法;会等待对方响应。\r\n * 不能直接使用该方法,应该使用 proxy。\r\n * @WARNING 不能用于响应其他端。\r\n */\r\n private callAsync(\r\n name: string,\r\n data: unknown,\r\n config?: {\r\n timeoutMs?: number\r\n targetDeviceId?: string\r\n }\r\n ) {\r\n const timeoutMs = config?.timeoutMs ?? this.defaultTimeoutMs\r\n const { deviceId } = this\r\n const randomStr = Math.random().toString(36).slice(2)\r\n // 本条消息的响应名\r\n const responseName = `${RESPONSE_PREFIX}-${name}-${deviceId}-${randomStr}`\r\n return new Promise((resolve, reject) => {\r\n let timer: NodeJS.Timeout | undefined\r\n this.log(`callAsync ${name}: waiting for response: ${responseName}`)\r\n const callback: AdaptorCallback = (e) => {\r\n clearTimeout(timer)\r\n this.log(`response received: ${responseName}`, e)\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 this.adaptor.once(responseName, callback)\r\n timer = setTimeout(() => {\r\n this.log(`timeout: ${responseName}`)\r\n this.adaptor.off(responseName, callback)\r\n reject(new RemoteTimeoutError(`timeout: ${name}`))\r\n }, timeoutMs)\r\n this.adaptor.emit({\r\n deviceId,\r\n targetDeviceId: config?.targetDeviceId ?? '',\r\n name,\r\n data,\r\n callbackName: responseName,\r\n })\r\n })\r\n }\r\n\r\n /**\r\n * 注册方法,供对方调用;\r\n */\r\n register<K extends keyof MF>(name: K, callback: RegisteredFunc<MF[K]>): void {\r\n this.map[name as string] = { callback }\r\n }\r\n\r\n _ = new Proxy<FuncMapWithConfig<OF>>({} as FuncMapWithConfig<OF>, {\r\n get: (_, k) => this.callAsync.bind(this, k as string),\r\n })\r\n\r\n self = new Proxy<MF>({} as MF, {\r\n get: (_, k) => (data: unknown) =>\r\n this.map[k as string]?.callback.apply(null, [\r\n data,\r\n {\r\n deviceId: this.deviceId,\r\n },\r\n ]),\r\n })\r\n}\r\n\r\nexport function isRemoteAdaptorData(data: unknown): data is AdaptorPackageData {\r\n return (\r\n !!data &&\r\n typeof data === 'object' &&\r\n 'deviceId' in data &&\r\n 'name' in data &&\r\n typeof data.deviceId === 'string' &&\r\n typeof data.name === 'string' &&\r\n !!data.deviceId &&\r\n !!data.name\r\n )\r\n}\r\n"],"mappings":"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","names":["RemoteError","RemoteNotFoundError","RemoteTimeoutError","response","RESPONSE_PREFIX","defaultLog","data","Remote","adaptor","config","e","_a","selfDeviceId","name","targetDeviceId","callbackName","callback","ret","error","deviceId","timeoutMs","randomStr","responseName","resolve","reject","timer","_","k","isRemoteAdaptorData"]}
@@ -0,0 +1,43 @@
1
+ import { Adaptor, AdaptorPackageData } from '../adaptor.mjs';
2
+ import { RemoteCallData } from './type.mjs';
3
+
4
+ type AdaptorData = AdaptorPackageData<RemoteCallData>;
5
+ interface ExposeProps {
6
+ globalName: string;
7
+ adaptor: Adaptor;
8
+ /**
9
+ * ['*'] or ['device_id_1', 'device_id_2']
10
+ */
11
+ exposeTo: string[];
12
+ /**
13
+ * 你可以在该回调中抛错,以阻止远程调用,
14
+ * 也可以修改传入的 data
15
+ */
16
+ onRequest?: (e: AdaptorData) => RemoteCallData | Promise<RemoteCallData>;
17
+ /**
18
+ * 如果你想要自定义处理函数,
19
+ * 需要谨慎且完善地处理各种 paths, args,
20
+ * 以避免远程调用时出现未预期的错误。
21
+ *
22
+ * ---
23
+ *
24
+ * 我的默认处理程序谨供参考:
25
+ * ``` ts
26
+ * let target = obj
27
+ * for (let i = 0; i < data.paths.length; i += 1) {
28
+ * target = target[data.paths[i] as keyof typeof target] as typeof target
29
+ * }
30
+ * if (target instanceof Function) {
31
+ * return target(...data.args)
32
+ * }
33
+ * return target
34
+ * ```
35
+ *
36
+ * @returns 返回值将会被发送给远程调用方,可以是立即数,也可以是 Promise(Promise 会 await 后再返回)
37
+ */
38
+ handler?: (e: AdaptorData) => unknown;
39
+ }
40
+ declare function isRemoteValueEvent(eventName: string): boolean;
41
+ declare function exposeToRemote<T extends object>(obj: T, options: ExposeProps): () => void;
42
+
43
+ export { exposeToRemote, isRemoteValueEvent };
@@ -1,5 +1,6 @@
1
- import { Adaptor, AdaptorPackageData } from '../adaptor';
2
- import { RemoteCallData } from './type';
1
+ import { Adaptor, AdaptorPackageData } from '../adaptor.js';
2
+ import { RemoteCallData } from './type.js';
3
+
3
4
  type AdaptorData = AdaptorPackageData<RemoteCallData>;
4
5
  interface ExposeProps {
5
6
  globalName: string;
@@ -36,6 +37,7 @@ interface ExposeProps {
36
37
  */
37
38
  handler?: (e: AdaptorData) => unknown;
38
39
  }
39
- export declare function isRemoteValueEvent(eventName: string): boolean;
40
- export declare function exposeToRemote<T extends object>(obj: T, options: ExposeProps): () => void;
41
- export {};
40
+ declare function isRemoteValueEvent(eventName: string): boolean;
41
+ declare function exposeToRemote<T extends object>(obj: T, options: ExposeProps): () => void;
42
+
43
+ export { exposeToRemote, isRemoteValueEvent };
@@ -1,53 +1,2 @@
1
- import { RemoteError, response } from '../response';
2
- function defaultOnRequest(e) {
3
- return e.data;
4
- }
5
- const geneDefaultHandler = (obj) => ({ data }) => {
6
- let target = obj;
7
- for (let i = 0; i < data.paths.length; i += 1) {
8
- target = target[data.paths[i]];
9
- }
10
- if (target instanceof Function) {
11
- return target(...data.args);
12
- }
13
- return target;
14
- };
15
- export function isRemoteValueEvent(eventName) {
16
- return eventName.startsWith('__REMOTE_VALUE_REQ__');
17
- }
18
- export function exposeToRemote(obj, options) {
19
- const { globalName, adaptor, exposeTo, handler: inputHandler, onRequest = defaultOnRequest, } = options;
20
- const callback = async (e) => {
21
- var _a, _b;
22
- try {
23
- const data = await onRequest(e);
24
- if (!exposeTo.includes(e.deviceId) && !exposeTo.includes('*')) {
25
- throw new RemoteError('permission denied');
26
- }
27
- const handler = inputHandler !== null && inputHandler !== void 0 ? inputHandler : geneDefaultHandler(obj);
28
- const res = await handler({
29
- ...e,
30
- data,
31
- });
32
- adaptor.emit({
33
- name: (_a = e.callbackName) !== null && _a !== void 0 ? _a : 'IMPOSSIBLE_NO_CALLBACK_NAME',
34
- deviceId: e.targetDeviceId,
35
- targetDeviceId: e.deviceId,
36
- data: response.success(res),
37
- });
38
- }
39
- catch (error) {
40
- adaptor.emit({
41
- name: (_b = e.callbackName) !== null && _b !== void 0 ? _b : 'IMPOSSIBLE_NO_CALLBACK_NAME',
42
- deviceId: e.targetDeviceId,
43
- targetDeviceId: e.deviceId,
44
- data: response.error(RemoteError.fromError(error)),
45
- });
46
- }
47
- };
48
- adaptor.on(`__REMOTE_VALUE_REQ__${globalName}`, callback);
49
- return () => {
50
- adaptor.off(`__REMOTE_VALUE_REQ__${globalName}`, callback);
51
- };
52
- }
1
+ "use strict";var c=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var A=(e,a)=>{for(var t in a)c(e,t,{get:a[t],enumerable:!0})},f=(e,a,t,o)=>{if(a&&typeof a=="object"||typeof a=="function")for(let n of u(a))!E.call(e,n)&&n!==t&&c(e,n,{get:()=>a[n],enumerable:!(o=_(a,n))||o.enumerable});return e};var g=e=>f(c({},"__esModule",{value:!0}),e);var v={};A(v,{exposeToRemote:()=>h,isRemoteValueEvent:()=>I});module.exports=g(v);var d=require("../response");function D(e){return e.data}const R=e=>({data:a})=>{let t=e;for(let o=0;o<a.paths.length;o+=1)t=t[a.paths[o]];return t instanceof Function?t(...a.args):t};function I(e){return e.startsWith("__REMOTE_VALUE_REQ__")}function h(e,a){const{globalName:t,adaptor:o,exposeTo:n,handler:p,onRequest:l=D}=a,i=async r=>{try{const s=await l(r);if(!n.includes(r.deviceId)&&!n.includes("*"))throw new d.RemoteError("permission denied");const m=await(p??R(e))({...r,data:s});o.emit({name:r.callbackName??"IMPOSSIBLE_NO_CALLBACK_NAME",deviceId:r.targetDeviceId,targetDeviceId:r.deviceId,data:d.response.success(m)})}catch(s){o.emit({name:r.callbackName??"IMPOSSIBLE_NO_CALLBACK_NAME",deviceId:r.targetDeviceId,targetDeviceId:r.deviceId,data:d.response.error(d.RemoteError.fromError(s))})}};return o.on(`__REMOTE_VALUE_REQ__${t}`,i),()=>{o.off(`__REMOTE_VALUE_REQ__${t}`,i)}}0&&(module.exports={exposeToRemote,isRemoteValueEvent});
53
2
  //# sourceMappingURL=exposeToRemote.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exposeToRemote.js","sourceRoot":"","sources":["../../src/remoteValue/exposeToRemote.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAyCnD,SAAS,gBAAgB,CAAC,CAAc;IACtC,OAAO,CAAC,CAAC,IAAI,CAAA;AACf,CAAC;AAED,MAAM,kBAAkB,GACtB,CAAC,GAAG,EAAE,EAAE,CACR,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;IACX,IAAI,MAAM,GAAG,GAAG,CAAA;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAwB,CAAkB,CAAA;IACxE,CAAC;IACD,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAEH,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,OAAO,SAAS,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,cAAc,CAAmB,GAAM,EAAE,OAAoB;IAC3E,MAAM,EACJ,UAAU,EACV,OAAO,EACP,QAAQ,EACR,OAAO,EAAE,YAAY,EACrB,SAAS,GAAG,gBAAgB,GAC7B,GAAG,OAAO,CAAA;IACX,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAqB,EAAE,EAAE;;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,CAAgB,CAAC,CAAA;YAC9C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,WAAW,CAAC,mBAAmB,CAAC,CAAA;YAC5C,CAAC;YACD,MAAM,OAAO,GAAG,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,kBAAkB,CAAC,GAAG,CAAC,CAAA;YACvD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;gBACxB,GAAG,CAAC;gBACJ,IAAI;aACL,CAAC,CAAA;YACF,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAA,CAAC,CAAC,YAAY,mCAAI,6BAA6B;gBACrD,QAAQ,EAAE,CAAC,CAAC,cAAc;gBAC1B,cAAc,EAAE,CAAC,CAAC,QAAQ;gBAC1B,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;aAC5B,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAA,CAAC,CAAC,YAAY,mCAAI,6BAA6B;gBACrD,QAAQ,EAAE,CAAC,CAAC,cAAc;gBAC1B,cAAc,EAAE,CAAC,CAAC,QAAQ;gBAC1B,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;aACnD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAA;IACD,OAAO,CAAC,EAAE,CAAC,uBAAuB,UAAU,EAAE,EAAE,QAAQ,CAAC,CAAA;IACzD,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC5D,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"sources":["../../src/remoteValue/exposeToRemote.ts"],"sourcesContent":["import { Adaptor, AdaptorPackageData } from '../adaptor'\r\nimport { RemoteError, response } from '../response'\r\nimport { RemoteCallData } from './type'\r\n\r\ntype AdaptorData = AdaptorPackageData<RemoteCallData>\r\n\r\ninterface ExposeProps {\r\n globalName: string\r\n adaptor: Adaptor\r\n /**\r\n * ['*'] or ['device_id_1', 'device_id_2']\r\n */\r\n exposeTo: string[]\r\n /**\r\n * 你可以在该回调中抛错,以阻止远程调用,\r\n * 也可以修改传入的 data\r\n */\r\n onRequest?: (e: AdaptorData) => RemoteCallData | Promise<RemoteCallData>\r\n /**\r\n * 如果你想要自定义处理函数,\r\n * 需要谨慎且完善地处理各种 paths, args,\r\n * 以避免远程调用时出现未预期的错误。\r\n *\r\n * ---\r\n *\r\n * 我的默认处理程序谨供参考:\r\n * ``` ts\r\n * let target = obj\r\n * for (let i = 0; i < data.paths.length; i += 1) {\r\n * target = target[data.paths[i] as keyof typeof target] as typeof target\r\n * }\r\n * if (target instanceof Function) {\r\n * return target(...data.args)\r\n * }\r\n * return target\r\n * ```\r\n *\r\n * @returns 返回值将会被发送给远程调用方,可以是立即数,也可以是 Promise(Promise 会 await 后再返回)\r\n */\r\n handler?: (e: AdaptorData) => unknown\r\n}\r\n\r\nfunction defaultOnRequest(e: AdaptorData) {\r\n return e.data\r\n}\r\n\r\nconst geneDefaultHandler: <T>(obj: T) => (data: AdaptorData) => unknown =\r\n (obj) =>\r\n ({ data }) => {\r\n let target = obj\r\n for (let i = 0; i < data.paths.length; i += 1) {\r\n target = target[data.paths[i] as keyof typeof target] as typeof target\r\n }\r\n if (target instanceof Function) {\r\n return target(...data.args)\r\n }\r\n return target\r\n }\r\n\r\nexport function isRemoteValueEvent(eventName: string) {\r\n return eventName.startsWith('__REMOTE_VALUE_REQ__')\r\n}\r\n\r\nexport function exposeToRemote<T extends object>(obj: T, options: ExposeProps) {\r\n const {\r\n globalName,\r\n adaptor,\r\n exposeTo,\r\n handler: inputHandler,\r\n onRequest = defaultOnRequest,\r\n } = options\r\n const callback = async (e: AdaptorPackageData) => {\r\n try {\r\n const data = await onRequest(e as AdaptorData)\r\n if (!exposeTo.includes(e.deviceId) && !exposeTo.includes('*')) {\r\n throw new RemoteError('permission denied')\r\n }\r\n const handler = inputHandler ?? geneDefaultHandler(obj)\r\n const res = await handler({\r\n ...e,\r\n data,\r\n })\r\n adaptor.emit({\r\n name: e.callbackName ?? 'IMPOSSIBLE_NO_CALLBACK_NAME',\r\n deviceId: e.targetDeviceId,\r\n targetDeviceId: e.deviceId,\r\n data: response.success(res),\r\n })\r\n } catch (error) {\r\n adaptor.emit({\r\n name: e.callbackName ?? 'IMPOSSIBLE_NO_CALLBACK_NAME',\r\n deviceId: e.targetDeviceId,\r\n targetDeviceId: e.deviceId,\r\n data: response.error(RemoteError.fromError(error)),\r\n })\r\n }\r\n }\r\n adaptor.on(`__REMOTE_VALUE_REQ__${globalName}`, callback)\r\n return () => {\r\n adaptor.off(`__REMOTE_VALUE_REQ__${globalName}`, callback)\r\n }\r\n}\r\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,EAAA,uBAAAC,IAAA,eAAAC,EAAAJ,GACA,IAAAK,EAAsC,uBAyCtC,SAASC,EAAiB,EAAgB,CACxC,OAAO,EAAE,IACX,CAEA,MAAMC,EACHC,GACD,CAAC,CAAE,KAAAC,CAAK,IAAM,CACZ,IAAIC,EAASF,EACb,QAASG,EAAI,EAAGA,EAAIF,EAAK,MAAM,OAAQE,GAAK,EAC1CD,EAASA,EAAOD,EAAK,MAAME,CAAC,CAAwB,EAEtD,OAAID,aAAkB,SACbA,EAAO,GAAGD,EAAK,IAAI,EAErBC,CACT,EAEK,SAASP,EAAmBS,EAAmB,CACpD,OAAOA,EAAU,WAAW,sBAAsB,CACpD,CAEO,SAASV,EAAiCM,EAAQK,EAAsB,CAC7E,KAAM,CACJ,WAAAC,EACA,QAAAC,EACA,SAAAC,EACA,QAASC,EACT,UAAAC,EAAYZ,CACd,EAAIO,EACEM,EAAW,MAAOC,GAA0B,CAChD,GAAI,CACF,MAAMX,EAAO,MAAMS,EAAUE,CAAgB,EAC7C,GAAI,CAACJ,EAAS,SAASI,EAAE,QAAQ,GAAK,CAACJ,EAAS,SAAS,GAAG,EAC1D,MAAM,IAAI,cAAY,mBAAmB,EAG3C,MAAMK,EAAM,MADIJ,GAAgBV,EAAmBC,CAAG,GAC5B,CACxB,GAAGY,EACH,KAAAX,CACF,CAAC,EACDM,EAAQ,KAAK,CACX,KAAMK,EAAE,cAAgB,8BACxB,SAAUA,EAAE,eACZ,eAAgBA,EAAE,SAClB,KAAM,WAAS,QAAQC,CAAG,CAC5B,CAAC,CACH,OAASC,EAAO,CACdP,EAAQ,KAAK,CACX,KAAMK,EAAE,cAAgB,8BACxB,SAAUA,EAAE,eACZ,eAAgBA,EAAE,SAClB,KAAM,WAAS,MAAM,cAAY,UAAUE,CAAK,CAAC,CACnD,CAAC,CACH,CACF,EACA,OAAAP,EAAQ,GAAG,uBAAuBD,CAAU,GAAIK,CAAQ,EACjD,IAAM,CACXJ,EAAQ,IAAI,uBAAuBD,CAAU,GAAIK,CAAQ,CAC3D,CACF","names":["exposeToRemote_exports","__export","exposeToRemote","isRemoteValueEvent","__toCommonJS","import_response","defaultOnRequest","geneDefaultHandler","obj","data","target","i","eventName","options","globalName","adaptor","exposeTo","inputHandler","onRequest","callback","e","res","error"]}
@@ -0,0 +1,2 @@
1
+ import{RemoteError as c,response as i}from"../response";function _(o){return o.data}const u=o=>({data:r})=>{let a=o;for(let t=0;t<r.paths.length;t+=1)a=a[r.paths[t]];return a instanceof Function?a(...r.args):a};function h(o){return o.startsWith("__REMOTE_VALUE_REQ__")}function v(o,r){const{globalName:a,adaptor:t,exposeTo:d,handler:p,onRequest:l=_}=r,s=async e=>{try{const n=await l(e);if(!d.includes(e.deviceId)&&!d.includes("*"))throw new c("permission denied");const m=await(p??u(o))({...e,data:n});t.emit({name:e.callbackName??"IMPOSSIBLE_NO_CALLBACK_NAME",deviceId:e.targetDeviceId,targetDeviceId:e.deviceId,data:i.success(m)})}catch(n){t.emit({name:e.callbackName??"IMPOSSIBLE_NO_CALLBACK_NAME",deviceId:e.targetDeviceId,targetDeviceId:e.deviceId,data:i.error(c.fromError(n))})}};return t.on(`__REMOTE_VALUE_REQ__${a}`,s),()=>{t.off(`__REMOTE_VALUE_REQ__${a}`,s)}}export{v as exposeToRemote,h as isRemoteValueEvent};
2
+ //# sourceMappingURL=exposeToRemote.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/remoteValue/exposeToRemote.ts"],"sourcesContent":["import { Adaptor, AdaptorPackageData } from '../adaptor'\r\nimport { RemoteError, response } from '../response'\r\nimport { RemoteCallData } from './type'\r\n\r\ntype AdaptorData = AdaptorPackageData<RemoteCallData>\r\n\r\ninterface ExposeProps {\r\n globalName: string\r\n adaptor: Adaptor\r\n /**\r\n * ['*'] or ['device_id_1', 'device_id_2']\r\n */\r\n exposeTo: string[]\r\n /**\r\n * 你可以在该回调中抛错,以阻止远程调用,\r\n * 也可以修改传入的 data\r\n */\r\n onRequest?: (e: AdaptorData) => RemoteCallData | Promise<RemoteCallData>\r\n /**\r\n * 如果你想要自定义处理函数,\r\n * 需要谨慎且完善地处理各种 paths, args,\r\n * 以避免远程调用时出现未预期的错误。\r\n *\r\n * ---\r\n *\r\n * 我的默认处理程序谨供参考:\r\n * ``` ts\r\n * let target = obj\r\n * for (let i = 0; i < data.paths.length; i += 1) {\r\n * target = target[data.paths[i] as keyof typeof target] as typeof target\r\n * }\r\n * if (target instanceof Function) {\r\n * return target(...data.args)\r\n * }\r\n * return target\r\n * ```\r\n *\r\n * @returns 返回值将会被发送给远程调用方,可以是立即数,也可以是 Promise(Promise 会 await 后再返回)\r\n */\r\n handler?: (e: AdaptorData) => unknown\r\n}\r\n\r\nfunction defaultOnRequest(e: AdaptorData) {\r\n return e.data\r\n}\r\n\r\nconst geneDefaultHandler: <T>(obj: T) => (data: AdaptorData) => unknown =\r\n (obj) =>\r\n ({ data }) => {\r\n let target = obj\r\n for (let i = 0; i < data.paths.length; i += 1) {\r\n target = target[data.paths[i] as keyof typeof target] as typeof target\r\n }\r\n if (target instanceof Function) {\r\n return target(...data.args)\r\n }\r\n return target\r\n }\r\n\r\nexport function isRemoteValueEvent(eventName: string) {\r\n return eventName.startsWith('__REMOTE_VALUE_REQ__')\r\n}\r\n\r\nexport function exposeToRemote<T extends object>(obj: T, options: ExposeProps) {\r\n const {\r\n globalName,\r\n adaptor,\r\n exposeTo,\r\n handler: inputHandler,\r\n onRequest = defaultOnRequest,\r\n } = options\r\n const callback = async (e: AdaptorPackageData) => {\r\n try {\r\n const data = await onRequest(e as AdaptorData)\r\n if (!exposeTo.includes(e.deviceId) && !exposeTo.includes('*')) {\r\n throw new RemoteError('permission denied')\r\n }\r\n const handler = inputHandler ?? geneDefaultHandler(obj)\r\n const res = await handler({\r\n ...e,\r\n data,\r\n })\r\n adaptor.emit({\r\n name: e.callbackName ?? 'IMPOSSIBLE_NO_CALLBACK_NAME',\r\n deviceId: e.targetDeviceId,\r\n targetDeviceId: e.deviceId,\r\n data: response.success(res),\r\n })\r\n } catch (error) {\r\n adaptor.emit({\r\n name: e.callbackName ?? 'IMPOSSIBLE_NO_CALLBACK_NAME',\r\n deviceId: e.targetDeviceId,\r\n targetDeviceId: e.deviceId,\r\n data: response.error(RemoteError.fromError(error)),\r\n })\r\n }\r\n }\r\n adaptor.on(`__REMOTE_VALUE_REQ__${globalName}`, callback)\r\n return () => {\r\n adaptor.off(`__REMOTE_VALUE_REQ__${globalName}`, callback)\r\n }\r\n}\r\n"],"mappings":"AACA,OAAS,eAAAA,EAAa,YAAAC,MAAgB,cAyCtC,SAASC,EAAiBC,EAAgB,CACxC,OAAOA,EAAE,IACX,CAEA,MAAMC,EACHC,GACD,CAAC,CAAE,KAAAC,CAAK,IAAM,CACZ,IAAIC,EAASF,EACb,QAASG,EAAI,EAAGA,EAAIF,EAAK,MAAM,OAAQE,GAAK,EAC1CD,EAASA,EAAOD,EAAK,MAAME,CAAC,CAAwB,EAEtD,OAAID,aAAkB,SACbA,EAAO,GAAGD,EAAK,IAAI,EAErBC,CACT,EAEK,SAASE,EAAmBC,EAAmB,CACpD,OAAOA,EAAU,WAAW,sBAAsB,CACpD,CAEO,SAASC,EAAiCN,EAAQO,EAAsB,CAC7E,KAAM,CACJ,WAAAC,EACA,QAAAC,EACA,SAAAC,EACA,QAASC,EACT,UAAAC,EAAYf,CACd,EAAIU,EACEM,EAAW,MAAO,GAA0B,CAChD,GAAI,CACF,MAAMZ,EAAO,MAAMW,EAAU,CAAgB,EAC7C,GAAI,CAACF,EAAS,SAAS,EAAE,QAAQ,GAAK,CAACA,EAAS,SAAS,GAAG,EAC1D,MAAM,IAAIf,EAAY,mBAAmB,EAG3C,MAAMmB,EAAM,MADIH,GAAgBZ,EAAmBC,CAAG,GAC5B,CACxB,GAAG,EACH,KAAAC,CACF,CAAC,EACDQ,EAAQ,KAAK,CACX,KAAM,EAAE,cAAgB,8BACxB,SAAU,EAAE,eACZ,eAAgB,EAAE,SAClB,KAAMb,EAAS,QAAQkB,CAAG,CAC5B,CAAC,CACH,OAASC,EAAO,CACdN,EAAQ,KAAK,CACX,KAAM,EAAE,cAAgB,8BACxB,SAAU,EAAE,eACZ,eAAgB,EAAE,SAClB,KAAMb,EAAS,MAAMD,EAAY,UAAUoB,CAAK,CAAC,CACnD,CAAC,CACH,CACF,EACA,OAAAN,EAAQ,GAAG,uBAAuBD,CAAU,GAAIK,CAAQ,EACjD,IAAM,CACXJ,EAAQ,IAAI,uBAAuBD,CAAU,GAAIK,CAAQ,CAC3D,CACF","names":["RemoteError","response","defaultOnRequest","e","geneDefaultHandler","obj","data","target","i","isRemoteValueEvent","eventName","exposeToRemote","options","globalName","adaptor","exposeTo","inputHandler","onRequest","callback","res","error"]}
@@ -0,0 +1,29 @@
1
+ import { AdaptorPackageData, Adaptor } from '../adaptor.mjs';
2
+ import { ToFunc } from './type.mjs';
3
+
4
+ type RemoteValueProps = Pick<AdaptorPackageData, 'deviceId' | 'targetDeviceId'> & {
5
+ globalName: string;
6
+ adaptor: Adaptor;
7
+ timeoutMs?: number;
8
+ log?: boolean;
9
+ };
10
+ /**
11
+ * @example
12
+ * ```
13
+ * const obj = remoteValue<{
14
+ * a: number;
15
+ * b: {
16
+ * c: string;
17
+ * };
18
+ * funcD: () => number
19
+ * }>()
20
+ *
21
+ * const val_1 = await obj.a() // number
22
+ * const val_2 = await obj.b() // { c: string }
23
+ * const val_3 = await obj.b.c() // string
24
+ * const val_4 = await obj.funcD() // number
25
+ * ```
26
+ */
27
+ declare function remoteValue<T extends object>(props: RemoteValueProps): ToFunc<T>;
28
+
29
+ export { remoteValue };
@@ -1,5 +1,6 @@
1
- import { Adaptor, AdaptorPackageData } from '../adaptor';
2
- import type { ToFunc } from './type';
1
+ import { AdaptorPackageData, Adaptor } from '../adaptor.js';
2
+ import { ToFunc } from './type.js';
3
+
3
4
  type RemoteValueProps = Pick<AdaptorPackageData, 'deviceId' | 'targetDeviceId'> & {
4
5
  globalName: string;
5
6
  adaptor: Adaptor;
@@ -23,5 +24,6 @@ type RemoteValueProps = Pick<AdaptorPackageData, 'deviceId' | 'targetDeviceId'>
23
24
  * const val_4 = await obj.funcD() // number
24
25
  * ```
25
26
  */
26
- export declare function remoteValue<T extends object>(props: RemoteValueProps): ToFunc<T>;
27
- export {};
27
+ declare function remoteValue<T extends object>(props: RemoteValueProps): ToFunc<T>;
28
+
29
+ export { remoteValue };
@@ -1,68 +1,2 @@
1
- import { RemoteError, RemoteTimeoutError } from '../response';
2
- function noop() {
3
- // pass
4
- }
5
- function geneProxy(paths, props) {
6
- return new Proxy(noop, {
7
- apply(target, thisArg, argArray) {
8
- const { adaptor, globalName, timeoutMs = 30000, log = false, ...restProps } = props;
9
- const randomStr = Math.random().toString(36).slice(2);
10
- const name = `__REMOTE_VALUE_REQ__${globalName}`;
11
- const responseName = `__REMOTE_VALUE_RES__${[globalName, ...paths].join('.')}-${randomStr}`;
12
- if (log) {
13
- console.log(`[remoteValue] [${restProps.deviceId}] 正在访问远端 [${restProps.targetDeviceId}] 的变量: "${[globalName, ...paths].join('.')}"`);
14
- }
15
- return new Promise((resolve, reject) => {
16
- let timer;
17
- const callback = (e) => {
18
- var _a;
19
- clearTimeout(timer);
20
- if (RemoteError.isRemoteError(e.data)) {
21
- reject(RemoteError.fromError(e.data));
22
- }
23
- else {
24
- resolve((_a = e.data) === null || _a === void 0 ? void 0 : _a.data);
25
- }
26
- };
27
- adaptor.once(responseName, callback);
28
- timer = setTimeout(() => {
29
- adaptor.off(responseName, callback);
30
- reject(new RemoteTimeoutError(`timeout: ${[globalName, ...paths].join('.')}`));
31
- }, timeoutMs);
32
- adaptor.emit({
33
- name,
34
- callbackName: responseName,
35
- ...restProps,
36
- data: {
37
- paths,
38
- args: argArray,
39
- },
40
- });
41
- });
42
- },
43
- get(target, prop) {
44
- return geneProxy([...paths, prop], props);
45
- },
46
- });
47
- }
48
- /**
49
- * @example
50
- * ```
51
- * const obj = remoteValue<{
52
- * a: number;
53
- * b: {
54
- * c: string;
55
- * };
56
- * funcD: () => number
57
- * }>()
58
- *
59
- * const val_1 = await obj.a() // number
60
- * const val_2 = await obj.b() // { c: string }
61
- * const val_3 = await obj.b.c() // string
62
- * const val_4 = await obj.funcD() // number
63
- * ```
64
- */
65
- export function remoteValue(props) {
66
- return geneProxy([], props);
67
- }
1
+ "use strict";var u=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var V=(e,o)=>{for(var a in o)u(e,a,{get:o[a],enumerable:!0})},$=(e,o,a,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of k(o))!y.call(e,t)&&t!==a&&u(e,t,{get:()=>o[t],enumerable:!(r=A(o,t))||r.enumerable});return e};var D=e=>$(u({},"__esModule",{value:!0}),e);var N={};V(N,{remoteValue:()=>M});module.exports=D(N);var n=require("../response");function x(){}function T(e,o){return new Proxy(x,{apply(a,r,t){const{adaptor:i,globalName:s,timeoutMs:R=3e4,log:E=!1,...m}=o,_=Math.random().toString(36).slice(2),b=`__REMOTE_VALUE_REQ__${s}`,l=`__REMOTE_VALUE_RES__${[s,...e].join(".")}-${_}`;return E&&console.log(`[remoteValue] [${m.deviceId}] \u6B63\u5728\u8BBF\u95EE\u8FDC\u7AEF [${m.targetDeviceId}] \u7684\u53D8\u91CF: "${[s,...e].join(".")}"`),new Promise((P,d)=>{let p;const g=c=>{var f;clearTimeout(p),n.RemoteError.isRemoteError(c.data)?d(n.RemoteError.fromError(c.data)):P((f=c.data)==null?void 0:f.data)};i.once(l,g),p=setTimeout(()=>{i.off(l,g),d(new n.RemoteTimeoutError(`timeout: ${[s,...e].join(".")}`))},R),i.emit({name:b,callbackName:l,...m,data:{paths:e,args:t}})})},get(a,r){return T([...e,r],o)}})}function M(e){return T([],e)}0&&(module.exports={remoteValue});
68
2
  //# sourceMappingURL=remoteValue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"remoteValue.js","sourceRoot":"","sources":["../../src/remoteValue/remoteValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAY,MAAM,aAAa,CAAA;AAIvE,SAAS,IAAI;IACX,OAAO;AACT,CAAC;AAYD,SAAS,SAAS,CAAmB,KAAe,EAAE,KAAuB;IAC3E,OAAO,IAAI,KAAK,CAAY,IAA4B,EAAE;QACxD,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ;YAC7B,MAAM,EACJ,OAAO,EACP,UAAU,EACV,SAAS,GAAG,KAAK,EACjB,GAAG,GAAG,KAAK,EACX,GAAG,SAAS,EACb,GAAG,KAAK,CAAA;YACT,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACrD,MAAM,IAAI,GAAG,uBAAuB,UAAU,EAAE,CAAA;YAChD,MAAM,YAAY,GAAG,uBAAuB,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAA;YAE3F,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,CAAC,GAAG,CACT,kBAAkB,SAAS,CAAC,QAAQ,aAAa,SAAS,CAAC,cAAc,WAAW,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CACxH,CAAA;YACH,CAAC;YAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,IAAI,KAAiC,CAAA;gBACrC,MAAM,QAAQ,GAAoB,CAAC,CAAC,EAAE,EAAE;;oBACtC,YAAY,CAAC,KAAK,CAAC,CAAA;oBACnB,IAAI,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;wBACtC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;oBACvC,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,MAAC,CAAC,CAAC,IAA4C,0CAAE,IAAI,CAAC,CAAA;oBAChE,CAAC;gBACH,CAAC,CAAA;gBACD,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;gBACpC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBACtB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;oBACnC,MAAM,CACJ,IAAI,kBAAkB,CACpB,YAAY,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC/C,CACF,CAAA;gBACH,CAAC,EAAE,SAAS,CAAC,CAAA;gBACb,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,YAAY,EAAE,YAAY;oBAC1B,GAAG,SAAS;oBACZ,IAAI,EAAE;wBACJ,KAAK;wBACL,IAAI,EAAE,QAAQ;qBACU;iBAC3B,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,GAAG,CAAC,MAAM,EAAE,IAAI;YACd,OAAO,SAAS,CAAC,CAAC,GAAG,KAAK,EAAE,IAAc,CAAC,EAAE,KAAK,CAAC,CAAA;QACrD,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CAAmB,KAAuB;IACnE,OAAO,SAAS,CAAI,EAAE,EAAE,KAAK,CAAC,CAAA;AAChC,CAAC"}
1
+ {"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":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA0D,uBAI1D,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,EACd,cAAY,cAAcE,EAAE,IAAI,EAClCH,EAAO,cAAY,UAAUG,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,IAAI,qBACF,YAAY,CAACR,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,SAASN,EAA8BM,EAAyB,CACrE,OAAOF,EAAa,CAAC,EAAGE,CAAK,CAC/B","names":["remoteValue_exports","__export","remoteValue","__toCommonJS","import_response","noop","geneProxy","paths","props","target","thisArg","argArray","adaptor","globalName","timeoutMs","log","restProps","randomStr","name","responseName","resolve","reject","timer","callback","e","_a","prop"]}
@@ -0,0 +1,2 @@
1
+ import{RemoteError as d,RemoteTimeoutError as P}from"../response";function A(){}function p(e,s){return new Proxy(A,{apply(g,i,f){const{adaptor:t,globalName:o,timeoutMs:T=3e4,log:R=!1,...a}=s,E=Math.random().toString(36).slice(2),_=`__REMOTE_VALUE_REQ__${o}`,r=`__REMOTE_VALUE_RES__${[o,...e].join(".")}-${E}`;return R&&console.log(`[remoteValue] [${a.deviceId}] \u6B63\u5728\u8BBF\u95EE\u8FDC\u7AEF [${a.targetDeviceId}] \u7684\u53D8\u91CF: "${[o,...e].join(".")}"`),new Promise((b,m)=>{let l;const c=n=>{var u;clearTimeout(l),d.isRemoteError(n.data)?m(d.fromError(n.data)):b((u=n.data)==null?void 0:u.data)};t.once(r,c),l=setTimeout(()=>{t.off(r,c),m(new P(`timeout: ${[o,...e].join(".")}`))},T),t.emit({name:_,callbackName:r,...a,data:{paths:e,args:f}})})},get(g,i){return p([...e,i],s)}})}function M(e){return p([],e)}export{M as remoteValue};
2
+ //# sourceMappingURL=remoteValue.mjs.map
@@ -0,0 +1 @@
1
+ {"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"]}
@@ -0,0 +1,67 @@
1
+ type HasFunc<T> = T extends (...args: unknown[]) => unknown ? true : T extends unknown[] ? {
2
+ [K in keyof T]: HasFunc<T[K]>;
3
+ }[number] extends false ? false : true : T extends object ? {
4
+ [K in keyof T]: HasFunc<T[K]>;
5
+ }[keyof T] extends false ? false : true : false;
6
+ type ToFunc<T extends object> = {
7
+ [K in keyof T]: T[K] extends (...args: infer Args) => infer Ret ? (...args: Args) => Promise<Awaited<Ret>> : HasFunc<T[K]> extends false ? () => Promise<T[K]> : T[K] extends object ? ToFunc<T[K]> : never;
8
+ };
9
+ interface RemoteCallData {
10
+ paths: string[];
11
+ args: unknown[];
12
+ }
13
+ type Assert<T extends true> = T;
14
+ interface TestObj {
15
+ a1: number;
16
+ a2: number[];
17
+ a3: [number, string];
18
+ a4: {
19
+ b: number;
20
+ c: [string];
21
+ };
22
+ a5: () => Promise<number>;
23
+ a6: () => Promise<number[]>;
24
+ a7: () => Promise<[number, string]>;
25
+ b: {
26
+ b1: number;
27
+ b2: number[];
28
+ b3: [number, string];
29
+ b4: () => {
30
+ b: number;
31
+ c: [string];
32
+ };
33
+ b5: () => Promise<number>;
34
+ b6: () => Promise<number[]>;
35
+ b7: () => Promise<[number, string]>;
36
+ };
37
+ f: {
38
+ b: number;
39
+ c: {
40
+ d: () => number;
41
+ };
42
+ };
43
+ }
44
+ type TestA1 = Assert<ToFunc<TestObj>['a1'] extends () => Promise<number> ? true : false>;
45
+ type TestA2 = Assert<ToFunc<TestObj>['a2'] extends () => Promise<number[]> ? true : false>;
46
+ type TestA3 = Assert<ToFunc<TestObj>['a3'] extends () => Promise<[number, string]> ? true : false>;
47
+ type TestA4 = Assert<ToFunc<TestObj>['a4'] extends () => Promise<{
48
+ b: number;
49
+ c: [string];
50
+ }> ? true : false>;
51
+ type TestA5 = Assert<ToFunc<TestObj>['a5'] extends () => Promise<number> ? true : false>;
52
+ type TestA6 = Assert<ToFunc<TestObj>['a6'] extends () => Promise<number[]> ? true : false>;
53
+ type TestA7 = Assert<ToFunc<TestObj>['a7'] extends () => Promise<[number, string]> ? true : false>;
54
+ type TestB1 = Assert<ToFunc<TestObj>['b']['b1'] extends () => Promise<number> ? true : false>;
55
+ type TestB2 = Assert<ToFunc<TestObj>['b']['b2'] extends () => Promise<number[]> ? true : false>;
56
+ type TestB3 = Assert<ToFunc<TestObj>['b']['b3'] extends () => Promise<[number, string]> ? true : false>;
57
+ type TestB4 = Assert<ToFunc<TestObj>['b']['b4'] extends () => Promise<{
58
+ b: number;
59
+ c: [string];
60
+ }> ? true : false>;
61
+ type TestB5 = Assert<ToFunc<TestObj>['b']['b5'] extends () => Promise<number> ? true : false>;
62
+ type TestB6 = Assert<ToFunc<TestObj>['b']['b6'] extends () => Promise<number[]> ? true : false>;
63
+ type TestB7 = Assert<ToFunc<TestObj>['b']['b7'] extends () => Promise<[number, string]> ? true : false>;
64
+ type TestF = Assert<ToFunc<TestObj>['f']['b'] extends () => Promise<number> ? true : false>;
65
+ type TestF2 = Assert<ToFunc<TestObj>['f']['c']['d'] extends () => Promise<number> ? true : false>;
66
+
67
+ export type { RemoteCallData, TestA1, TestA2, TestA3, TestA4, TestA5, TestA6, TestA7, TestB1, TestB2, TestB3, TestB4, TestB5, TestB6, TestB7, TestF, TestF2, ToFunc };
@@ -3,10 +3,10 @@ type HasFunc<T> = T extends (...args: unknown[]) => unknown ? true : T extends u
3
3
  }[number] extends false ? false : true : T extends object ? {
4
4
  [K in keyof T]: HasFunc<T[K]>;
5
5
  }[keyof T] extends false ? false : true : false;
6
- export type ToFunc<T extends object> = {
6
+ type ToFunc<T extends object> = {
7
7
  [K in keyof T]: T[K] extends (...args: infer Args) => infer Ret ? (...args: Args) => Promise<Awaited<Ret>> : HasFunc<T[K]> extends false ? () => Promise<T[K]> : T[K] extends object ? ToFunc<T[K]> : never;
8
8
  };
9
- export interface RemoteCallData {
9
+ interface RemoteCallData {
10
10
  paths: string[];
11
11
  args: unknown[];
12
12
  }
@@ -41,26 +41,27 @@ interface TestObj {
41
41
  };
42
42
  };
43
43
  }
44
- export type TestA1 = Assert<ToFunc<TestObj>['a1'] extends () => Promise<number> ? true : false>;
45
- export type TestA2 = Assert<ToFunc<TestObj>['a2'] extends () => Promise<number[]> ? true : false>;
46
- export type TestA3 = Assert<ToFunc<TestObj>['a3'] extends () => Promise<[number, string]> ? true : false>;
47
- export type TestA4 = Assert<ToFunc<TestObj>['a4'] extends () => Promise<{
44
+ type TestA1 = Assert<ToFunc<TestObj>['a1'] extends () => Promise<number> ? true : false>;
45
+ type TestA2 = Assert<ToFunc<TestObj>['a2'] extends () => Promise<number[]> ? true : false>;
46
+ type TestA3 = Assert<ToFunc<TestObj>['a3'] extends () => Promise<[number, string]> ? true : false>;
47
+ type TestA4 = Assert<ToFunc<TestObj>['a4'] extends () => Promise<{
48
48
  b: number;
49
49
  c: [string];
50
50
  }> ? true : false>;
51
- export type TestA5 = Assert<ToFunc<TestObj>['a5'] extends () => Promise<number> ? true : false>;
52
- export type TestA6 = Assert<ToFunc<TestObj>['a6'] extends () => Promise<number[]> ? true : false>;
53
- export type TestA7 = Assert<ToFunc<TestObj>['a7'] extends () => Promise<[number, string]> ? true : false>;
54
- export type TestB1 = Assert<ToFunc<TestObj>['b']['b1'] extends () => Promise<number> ? true : false>;
55
- export type TestB2 = Assert<ToFunc<TestObj>['b']['b2'] extends () => Promise<number[]> ? true : false>;
56
- export type TestB3 = Assert<ToFunc<TestObj>['b']['b3'] extends () => Promise<[number, string]> ? true : false>;
57
- export type TestB4 = Assert<ToFunc<TestObj>['b']['b4'] extends () => Promise<{
51
+ type TestA5 = Assert<ToFunc<TestObj>['a5'] extends () => Promise<number> ? true : false>;
52
+ type TestA6 = Assert<ToFunc<TestObj>['a6'] extends () => Promise<number[]> ? true : false>;
53
+ type TestA7 = Assert<ToFunc<TestObj>['a7'] extends () => Promise<[number, string]> ? true : false>;
54
+ type TestB1 = Assert<ToFunc<TestObj>['b']['b1'] extends () => Promise<number> ? true : false>;
55
+ type TestB2 = Assert<ToFunc<TestObj>['b']['b2'] extends () => Promise<number[]> ? true : false>;
56
+ type TestB3 = Assert<ToFunc<TestObj>['b']['b3'] extends () => Promise<[number, string]> ? true : false>;
57
+ type TestB4 = Assert<ToFunc<TestObj>['b']['b4'] extends () => Promise<{
58
58
  b: number;
59
59
  c: [string];
60
60
  }> ? true : false>;
61
- export type TestB5 = Assert<ToFunc<TestObj>['b']['b5'] extends () => Promise<number> ? true : false>;
62
- export type TestB6 = Assert<ToFunc<TestObj>['b']['b6'] extends () => Promise<number[]> ? true : false>;
63
- export type TestB7 = Assert<ToFunc<TestObj>['b']['b7'] extends () => Promise<[number, string]> ? true : false>;
64
- export type TestF = Assert<ToFunc<TestObj>['f']['b'] extends () => Promise<number> ? true : false>;
65
- export type TestF2 = Assert<ToFunc<TestObj>['f']['c']['d'] extends () => Promise<number> ? true : false>;
66
- export {};
61
+ type TestB5 = Assert<ToFunc<TestObj>['b']['b5'] extends () => Promise<number> ? true : false>;
62
+ type TestB6 = Assert<ToFunc<TestObj>['b']['b6'] extends () => Promise<number[]> ? true : false>;
63
+ type TestB7 = Assert<ToFunc<TestObj>['b']['b7'] extends () => Promise<[number, string]> ? true : false>;
64
+ type TestF = Assert<ToFunc<TestObj>['f']['b'] extends () => Promise<number> ? true : false>;
65
+ type TestF2 = Assert<ToFunc<TestObj>['f']['c']['d'] extends () => Promise<number> ? true : false>;
66
+
67
+ export type { RemoteCallData, TestA1, TestA2, TestA3, TestA4, TestA5, TestA6, TestA7, TestB1, TestB2, TestB3, TestB4, TestB5, TestB6, TestB7, TestF, TestF2, ToFunc };
@@ -1,2 +1,2 @@
1
- export {};
1
+ "use strict";var n=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var m=(s,e,b,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of o(e))!T.call(s,t)&&t!==b&&n(s,t,{get:()=>e[t],enumerable:!(r=u(e,t))||r.enumerable});return s};var a=s=>m(n({},"__esModule",{value:!0}),s);var i={};module.exports=a(i);
2
2
  //# sourceMappingURL=type.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/remoteValue/type.ts"],"names":[],"mappings":""}
1
+ {"version":3,"sources":["../../src/remoteValue/type.ts"],"sourcesContent":["type HasFunc<T> = T extends (...args: unknown[]) => unknown\r\n ? true\r\n : T extends unknown[]\r\n ? { [K in keyof T]: HasFunc<T[K]> }[number] extends false\r\n ? false\r\n : true\r\n : T extends object\r\n ? { [K in keyof T]: HasFunc<T[K]> }[keyof T] extends false\r\n ? false\r\n : true\r\n : false\r\n\r\nexport type ToFunc<T extends object> = {\r\n [K in keyof T]: T[K] extends (...args: infer Args) => infer Ret\r\n ? (...args: Args) => Promise<Awaited<Ret>>\r\n : HasFunc<T[K]> extends false\r\n ? () => Promise<T[K]>\r\n : T[K] extends object\r\n ? ToFunc<T[K]>\r\n : never\r\n}\r\n\r\nexport interface RemoteCallData {\r\n paths: string[]\r\n args: unknown[]\r\n}\r\n\r\n// 下面的都是测试代码,用于测试 ToFunc\r\n\r\ntype Assert<T extends true> = T\r\n\r\ninterface TestObj {\r\n a1: number\r\n a2: number[]\r\n a3: [number, string]\r\n a4: {\r\n b: number\r\n c: [string]\r\n }\r\n a5: () => Promise<number>\r\n a6: () => Promise<number[]>\r\n a7: () => Promise<[number, string]>\r\n b: {\r\n b1: number\r\n b2: number[]\r\n b3: [number, string]\r\n b4: () => {\r\n b: number\r\n c: [string]\r\n }\r\n b5: () => Promise<number>\r\n b6: () => Promise<number[]>\r\n b7: () => Promise<[number, string]>\r\n }\r\n f: {\r\n b: number\r\n c: {\r\n d: () => number\r\n }\r\n }\r\n}\r\n\r\nexport type TestA1 = Assert<\r\n ToFunc<TestObj>['a1'] extends () => Promise<number> ? true : false\r\n>\r\nexport type TestA2 = Assert<\r\n ToFunc<TestObj>['a2'] extends () => Promise<number[]> ? true : false\r\n>\r\nexport type TestA3 = Assert<\r\n ToFunc<TestObj>['a3'] extends () => Promise<[number, string]> ? true : false\r\n>\r\nexport type TestA4 = Assert<\r\n ToFunc<TestObj>['a4'] extends () => Promise<{\r\n b: number\r\n c: [string]\r\n }>\r\n ? true\r\n : false\r\n>\r\nexport type TestA5 = Assert<\r\n ToFunc<TestObj>['a5'] extends () => Promise<number> ? true : false\r\n>\r\nexport type TestA6 = Assert<\r\n ToFunc<TestObj>['a6'] extends () => Promise<number[]> ? true : false\r\n>\r\nexport type TestA7 = Assert<\r\n ToFunc<TestObj>['a7'] extends () => Promise<[number, string]> ? true : false\r\n>\r\nexport type TestB1 = Assert<\r\n ToFunc<TestObj>['b']['b1'] extends () => Promise<number> ? true : false\r\n>\r\nexport type TestB2 = Assert<\r\n ToFunc<TestObj>['b']['b2'] extends () => Promise<number[]> ? true : false\r\n>\r\nexport type TestB3 = Assert<\r\n ToFunc<TestObj>['b']['b3'] extends () => Promise<[number, string]>\r\n ? true\r\n : false\r\n>\r\nexport type TestB4 = Assert<\r\n ToFunc<TestObj>['b']['b4'] extends () => Promise<{\r\n b: number\r\n c: [string]\r\n }>\r\n ? true\r\n : false\r\n>\r\nexport type TestB5 = Assert<\r\n ToFunc<TestObj>['b']['b5'] extends () => Promise<number> ? true : false\r\n>\r\nexport type TestB6 = Assert<\r\n ToFunc<TestObj>['b']['b6'] extends () => Promise<number[]> ? true : false\r\n>\r\nexport type TestB7 = Assert<\r\n ToFunc<TestObj>['b']['b7'] extends () => Promise<[number, string]>\r\n ? true\r\n : false\r\n>\r\nexport type TestF = Assert<\r\n ToFunc<TestObj>['f']['b'] extends () => Promise<number> ? true : false\r\n>\r\nexport type TestF2 = Assert<\r\n ToFunc<TestObj>['f']['c']['d'] extends () => Promise<number> ? true : false\r\n>\r\n"],"mappings":"+WAAA,IAAAA,EAAA,kBAAAC,EAAAD","names":["type_exports","__toCommonJS"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=type.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}