@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.
- package/LICENSE.md +21 -21
- package/README.md +289 -285
- package/dist/adaptor.d.mts +33 -0
- package/dist/adaptor.d.ts +5 -4
- package/dist/adaptor.js +1 -1
- package/dist/adaptor.js.map +1 -1
- package/dist/adaptor.mjs +1 -0
- package/dist/adaptor.mjs.map +1 -0
- package/dist/adaptors/dao3/client.d.mts +39 -0
- package/dist/adaptors/dao3/client.d.ts +5 -3
- package/dist/adaptors/dao3/client.js +1 -44
- package/dist/adaptors/dao3/client.js.map +1 -1
- package/dist/adaptors/dao3/client.mjs +2 -0
- package/dist/adaptors/dao3/client.mjs.map +1 -0
- package/dist/adaptors/dao3/server.d.mts +82 -0
- package/dist/adaptors/dao3/server.d.ts +5 -3
- package/dist/adaptors/dao3/server.js +1 -104
- package/dist/adaptors/dao3/server.js.map +1 -1
- package/dist/adaptors/dao3/server.mjs +2 -0
- package/dist/adaptors/dao3/server.mjs.map +1 -0
- package/dist/adaptors/electron/constants.d.mts +5 -0
- package/dist/adaptors/electron/constants.d.ts +5 -0
- package/dist/adaptors/electron/constants.js +2 -0
- package/dist/adaptors/electron/constants.js.map +1 -0
- package/dist/adaptors/electron/constants.mjs +2 -0
- package/dist/adaptors/electron/constants.mjs.map +1 -0
- package/dist/adaptors/electron/main.d.mts +10 -0
- package/dist/adaptors/electron/main.d.ts +10 -0
- package/dist/adaptors/electron/main.js +2 -0
- package/dist/adaptors/electron/main.js.map +1 -0
- package/dist/adaptors/electron/main.mjs +2 -0
- package/dist/adaptors/electron/main.mjs.map +1 -0
- package/dist/adaptors/electron/messenger.d.mts +8 -0
- package/dist/adaptors/electron/messenger.d.ts +8 -0
- package/dist/adaptors/electron/messenger.js +2 -0
- package/dist/adaptors/electron/messenger.js.map +1 -0
- package/dist/adaptors/electron/messenger.mjs +2 -0
- package/dist/adaptors/electron/messenger.mjs.map +1 -0
- package/dist/adaptors/electron/preload.d.mts +6 -0
- package/dist/adaptors/electron/preload.d.ts +6 -0
- package/dist/adaptors/electron/preload.js +2 -0
- package/dist/adaptors/electron/preload.js.map +1 -0
- package/dist/adaptors/electron/preload.mjs +2 -0
- package/dist/adaptors/electron/preload.mjs.map +1 -0
- package/dist/adaptors/electron/renderer.d.mts +9 -0
- package/dist/adaptors/electron/renderer.d.ts +9 -0
- package/dist/adaptors/electron/renderer.js +2 -0
- package/dist/adaptors/electron/renderer.js.map +1 -0
- package/dist/adaptors/electron/renderer.mjs +2 -0
- package/dist/adaptors/electron/renderer.mjs.map +1 -0
- package/dist/adaptors/http.d.mts +15 -0
- package/dist/adaptors/http.d.ts +6 -4
- package/dist/adaptors/http.js +1 -26
- package/dist/adaptors/http.js.map +1 -1
- package/dist/adaptors/http.mjs +2 -0
- package/dist/adaptors/http.mjs.map +1 -0
- package/dist/adaptors/iframe.d.mts +7 -0
- package/dist/adaptors/iframe.d.ts +5 -2
- package/dist/adaptors/iframe.js +1 -38
- package/dist/adaptors/iframe.js.map +1 -1
- package/dist/adaptors/iframe.mjs +2 -0
- package/dist/adaptors/iframe.mjs.map +1 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.d.ts +16 -10
- package/dist/index.js +1 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/dist/remote.d.mts +81 -0
- package/dist/remote.d.ts +6 -4
- package/dist/remote.js +1 -196
- package/dist/remote.js.map +1 -1
- package/dist/remote.mjs +2 -0
- package/dist/remote.mjs.map +1 -0
- package/dist/remoteValue/exposeToRemote.d.mts +43 -0
- package/dist/remoteValue/exposeToRemote.d.ts +7 -5
- package/dist/remoteValue/exposeToRemote.js +1 -52
- package/dist/remoteValue/exposeToRemote.js.map +1 -1
- package/dist/remoteValue/exposeToRemote.mjs +2 -0
- package/dist/remoteValue/exposeToRemote.mjs.map +1 -0
- package/dist/remoteValue/remoteValue.d.mts +29 -0
- package/dist/remoteValue/remoteValue.d.ts +6 -4
- package/dist/remoteValue/remoteValue.js +1 -67
- package/dist/remoteValue/remoteValue.js.map +1 -1
- package/dist/remoteValue/remoteValue.mjs +2 -0
- package/dist/remoteValue/remoteValue.mjs.map +1 -0
- package/dist/remoteValue/type.d.mts +67 -0
- package/dist/remoteValue/type.d.ts +20 -19
- package/dist/remoteValue/type.js +1 -1
- package/dist/remoteValue/type.js.map +1 -1
- package/dist/remoteValue/type.mjs +1 -0
- package/dist/remoteValue/type.mjs.map +1 -0
- package/dist/response.d.mts +105 -0
- package/dist/response.d.ts +6 -5
- package/dist/response.js +1 -154
- package/dist/response.js.map +1 -1
- package/dist/response.mjs +2 -0
- package/dist/response.mjs.map +1 -0
- package/package.json +31 -24
- package/src/adaptor.ts +34 -34
- package/src/adaptors/dao3/client.ts +53 -53
- package/src/adaptors/dao3/server.ts +136 -136
- package/src/adaptors/electron/constants.ts +3 -0
- package/src/adaptors/electron/main.ts +59 -0
- package/src/adaptors/electron/messenger.ts +13 -0
- package/src/adaptors/electron/preload.ts +21 -0
- package/src/adaptors/electron/renderer.ts +52 -0
- package/src/adaptors/http.ts +31 -31
- package/src/adaptors/iframe.ts +47 -47
- package/src/index.ts +17 -12
- package/src/remote.ts +263 -260
- package/src/remoteValue/exposeToRemote.ts +102 -102
- package/src/remoteValue/remoteValue.ts +94 -94
- package/src/remoteValue/type.ts +124 -124
- package/src/response.ts +170 -170
package/dist/remote.js.map
CHANGED
|
@@ -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"]}
|
package/dist/remote.mjs
ADDED
|
@@ -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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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,"
|
|
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 {
|
|
2
|
-
import
|
|
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
|
-
|
|
27
|
-
|
|
27
|
+
declare function remoteValue<T extends object>(props: RemoteValueProps): ToFunc<T>;
|
|
28
|
+
|
|
29
|
+
export { remoteValue };
|
|
@@ -1,68 +1,2 @@
|
|
|
1
|
-
|
|
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,"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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 };
|
package/dist/remoteValue/type.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
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,"
|
|
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":[]}
|