@zimi/remote 0.2.1-alpha.11 → 0.2.1-alpha.12

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.
@@ -13,6 +13,28 @@ interface ExposeProps {
13
13
  * 也可以修改传入的 data
14
14
  */
15
15
  onRequest?: (e: AdaptorData) => RemoteCallData | Promise<RemoteCallData>;
16
+ /**
17
+ * 如果你想要自定义处理函数,
18
+ * 需要谨慎且完善地处理各种 paths, args,
19
+ * 以避免远程调用时出现未预期的错误。
20
+ *
21
+ * ---
22
+ *
23
+ * 我的默认处理程序谨供参考:
24
+ * ``` ts
25
+ * let target = obj
26
+ * for (let i = 0; i < data.paths.length; i += 1) {
27
+ * target = target[data.paths[i] as keyof typeof target] as typeof target
28
+ * }
29
+ * if (target instanceof Function) {
30
+ * return target(...data.args)
31
+ * }
32
+ * return target
33
+ * ```
34
+ *
35
+ * @returns 返回值将会被发送给远程调用方,可以是立即数,也可以是 Promise(Promise 会 await 后再返回)
36
+ */
37
+ handler?: (data: RemoteCallData) => unknown;
16
38
  }
17
39
  export declare function isRemoteValueEvent(eventName: string): boolean;
18
40
  export declare function exposeToRemote<T extends object>(obj: T, options: ExposeProps): () => void;
@@ -2,29 +2,30 @@ import { RemoteError, response } from '../response';
2
2
  function defaultOnRequest(e) {
3
3
  return e.data;
4
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
+ };
5
15
  export function isRemoteValueEvent(eventName) {
6
16
  return eventName.startsWith('__REMOTE_VALUE_REQ__');
7
17
  }
8
18
  export function exposeToRemote(obj, options) {
9
- const { globalName, adaptor, exposeTo, onRequest = defaultOnRequest, } = options;
19
+ const { globalName, adaptor, exposeTo, handler: inputHandler, onRequest = defaultOnRequest, } = options;
10
20
  const callback = async (e) => {
11
21
  var _a, _b;
12
22
  try {
13
- const { paths, args } = await onRequest(e);
23
+ const data = await onRequest(e);
14
24
  if (!exposeTo.includes(e.deviceId) && !exposeTo.includes('*')) {
15
25
  throw new RemoteError('permission denied');
16
26
  }
17
- let target = obj;
18
- for (let i = 0; i < paths.length; i += 1) {
19
- target = target[paths[i]];
20
- }
21
- let res;
22
- if (target instanceof Function) {
23
- res = await target(...args);
24
- }
25
- else {
26
- res = target;
27
- }
27
+ const handler = inputHandler !== null && inputHandler !== void 0 ? inputHandler : geneDefaultHandler(obj);
28
+ const res = await handler(data);
28
29
  adaptor.emit({
29
30
  name: (_a = e.callbackName) !== null && _a !== void 0 ? _a : 'IMPOSSIBLE_NO_CALLBACK_NAME',
30
31
  deviceId: e.targetDeviceId,
@@ -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;AAmBnD,SAAS,gBAAgB,CAAC,CAAc;IACtC,OAAO,CAAC,CAAC,IAAI,CAAA;AACf,CAAC;AAED,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,SAAS,GAAG,gBAAgB,GAC7B,GAAG,OAAO,CAAA;IACX,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAqB,EAAE,EAAE;;QAC/C,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,SAAS,CAAC,CAAgB,CAAC,CAAA;YACzD,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,IAAI,MAAM,GAAG,GAAG,CAAA;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAwB,CAAkB,CAAA;YACnE,CAAC;YACD,IAAI,GAAY,CAAA;YAChB,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;gBAC/B,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA;YAC7B,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,MAAM,CAAA;YACd,CAAC;YACD,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,"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,CAAC,CAAC,IAAI,EAAE,EAAE;IAChB,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,IAAI,CAAC,CAAA;YAC/B,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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zimi/remote",
3
3
  "license": "MIT",
4
- "version": "0.2.1-alpha.11",
4
+ "version": "0.2.1-alpha.12",
5
5
  "author": "xiaomingTang",
6
6
  "description": "call remote functions as local",
7
7
  "private": false,
@@ -16,12 +16,46 @@ interface ExposeProps {
16
16
  * 也可以修改传入的 data
17
17
  */
18
18
  onRequest?: (e: AdaptorData) => RemoteCallData | Promise<RemoteCallData>
19
+ /**
20
+ * 如果你想要自定义处理函数,
21
+ * 需要谨慎且完善地处理各种 paths, args,
22
+ * 以避免远程调用时出现未预期的错误。
23
+ *
24
+ * ---
25
+ *
26
+ * 我的默认处理程序谨供参考:
27
+ * ``` ts
28
+ * let target = obj
29
+ * for (let i = 0; i < data.paths.length; i += 1) {
30
+ * target = target[data.paths[i] as keyof typeof target] as typeof target
31
+ * }
32
+ * if (target instanceof Function) {
33
+ * return target(...data.args)
34
+ * }
35
+ * return target
36
+ * ```
37
+ *
38
+ * @returns 返回值将会被发送给远程调用方,可以是立即数,也可以是 Promise(Promise 会 await 后再返回)
39
+ */
40
+ handler?: (data: RemoteCallData) => unknown
19
41
  }
20
42
 
21
43
  function defaultOnRequest(e: AdaptorData) {
22
44
  return e.data
23
45
  }
24
46
 
47
+ const geneDefaultHandler: <T>(obj: T) => (data: RemoteCallData) => unknown =
48
+ (obj) => (data) => {
49
+ let target = obj
50
+ for (let i = 0; i < data.paths.length; i += 1) {
51
+ target = target[data.paths[i] as keyof typeof target] as typeof target
52
+ }
53
+ if (target instanceof Function) {
54
+ return target(...data.args)
55
+ }
56
+ return target
57
+ }
58
+
25
59
  export function isRemoteValueEvent(eventName: string) {
26
60
  return eventName.startsWith('__REMOTE_VALUE_REQ__')
27
61
  }
@@ -31,24 +65,17 @@ export function exposeToRemote<T extends object>(obj: T, options: ExposeProps) {
31
65
  globalName,
32
66
  adaptor,
33
67
  exposeTo,
68
+ handler: inputHandler,
34
69
  onRequest = defaultOnRequest,
35
70
  } = options
36
71
  const callback = async (e: AdaptorPackageData) => {
37
72
  try {
38
- const { paths, args } = await onRequest(e as AdaptorData)
73
+ const data = await onRequest(e as AdaptorData)
39
74
  if (!exposeTo.includes(e.deviceId) && !exposeTo.includes('*')) {
40
75
  throw new RemoteError('permission denied')
41
76
  }
42
- let target = obj
43
- for (let i = 0; i < paths.length; i += 1) {
44
- target = target[paths[i] as keyof typeof target] as typeof target
45
- }
46
- let res: unknown
47
- if (target instanceof Function) {
48
- res = await target(...args)
49
- } else {
50
- res = target
51
- }
77
+ const handler = inputHandler ?? geneDefaultHandler(obj)
78
+ const res = await handler(data)
52
79
  adaptor.emit({
53
80
  name: e.callbackName ?? 'IMPOSSIBLE_NO_CALLBACK_NAME',
54
81
  deviceId: e.targetDeviceId,