xshell 1.2.3 → 1.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/file.js CHANGED
@@ -560,6 +560,6 @@ export async function freplace(fp, pattern, replacement, { print = true } = {})
560
560
  .replaceAll(pattern, replacement), { print });
561
561
  }
562
562
  function log_action(action, fp_src, fp_dst, sep = '->') {
563
- console.log(`${`${action} ${fp_src}`.pad(url_width)} ${sep} ${fp_dst}`);
563
+ console.log(`${`${action} ${fp_src}`.pad(url_width)} ${sep} ${fp_dst}`);
564
564
  }
565
565
  //# sourceMappingURL=file.js.map
package/net.browser.d.ts CHANGED
@@ -101,11 +101,8 @@ export declare function connect_websocket(url: string | URL, { protocols, on_mes
101
101
  print?: boolean;
102
102
  }): Promise<WebSocket>;
103
103
  /** 接收到消息后的处理函数
104
- 返回值可以是:
105
- - 数组: 会自动被封装为 { id: 相同, data: 返回值, done: true } 这样的消息并调用 websocket.send 将其发送
106
- - void: 什么都不做
107
- - 以上的 promise */
108
- export type MessageHandler<TData extends any[] = any[]> = (message: Message<TData>, websocket?: WebSocket) => void | any[] | Promise<void | any[]>;
104
+ 返回值会自动被 await,然后可能被封装为 message 回传 */
105
+ export type MessageHandler<TData = any> = (message: Message<TData>, websocket?: WebSocket) => void | any | Promise<void | any>;
109
106
  /** 自动保持 remote 连接,只对 initiator 且传入 url 有效,
110
107
  - 在未连接,或 websocket on_error 检测到连接断开后以 reconnect_interval 间隔尝试 remote.call(func) 重连
111
108
  - 在连接状态下以 heartbeat_interval 间隔发送心跳包确保连接状态
@@ -159,7 +156,7 @@ export declare class Remote {
159
156
  funcs: Record<string, MessageHandler>;
160
157
  /** map<id, message handler>: 通过 (rpc message).id 找到对应的 handler
161
158
  一元 rpc 接收方不需要设置 handlers, 发送方需要 */
162
- handlers: Map<number, MessageHandler<any[]>>;
159
+ handlers: Map<number, MessageHandler<any>>;
163
160
  keeper?: RemoteKeeperOptions;
164
161
  /** `true` 是否打印连接信息、错误信息 */
165
162
  print: boolean;
@@ -198,14 +195,17 @@ export declare class Remote {
198
195
  作为 websocket 连接接收方,必传 websocket 参数
199
196
  发送或连接出错时自动清理 message.id 对应的 handler */
200
197
  send(message: Message, websocket?: WebSocket): Promise<void>;
201
- /** 处理接收到的 websocket message 并解析, 根据 message.id 或 message.func 分发到对应的 handler 进行处理
198
+ /** 处理接收到的 websocket message 并解析, 根据 message.id 或 message.func 分发到对应的 handler 进行处理,
199
+ handler 处理完成后:
200
+ - 传了 func: 调用函数的情况下 (通常是一元 rpc),总是将返回值包装为 message 回传
201
+ - 未传 func: 通过 id 调用,如果 handler 返回非 undefined 的值,也包装为 message 回传
202
+
202
203
  如果 message.done == true 则对端指示当前 remote 可以清理 handler
203
- 如果 handler 返回了值 (一定是数组),则包装为 message 发送
204
204
  使用 Uint8Array 作为参数更灵活 https://stackoverflow.com/a/74505197/7609214
205
205
  这个方法一般不会抛出错误,也不需要 await,一般在 websocket on_message 时使用 */
206
206
  handle(data: Uint8Array, websocket: WebSocket): Promise<void>;
207
207
  /** 调用对端 remote 中的 func, 只适用于最简单的一元 rpc (请求, 响应)
208
208
  作为 websocket 连接发起方,不需要传入 websocket
209
209
  作为 websocket 连接接收方,必传 websocket 参数 */
210
- call<TReturn extends any[] = any[]>(func: string, args?: any[], websocket?: WebSocket): Promise<TReturn>;
210
+ call<TReturn = any>(func: string, args?: any[], websocket?: WebSocket): Promise<TReturn>;
211
211
  }
package/net.browser.js CHANGED
@@ -431,7 +431,6 @@ export class Remote {
431
431
  作为 websocket 连接接收方,必传 websocket 参数
432
432
  发送或连接出错时自动清理 message.id 对应的 handler */
433
433
  async send(message, websocket) {
434
- check(!message.data || message.data.every(arg => arg !== undefined), `message.data 数组中不能有 undefined 的项, 因为 json 序列化后会变为 null. (func: ${message.func}, id: ${message.id})`);
435
434
  if (this.verbose)
436
435
  console.log('remote.send:', message);
437
436
  try {
@@ -445,9 +444,12 @@ export class Remote {
445
444
  throw error;
446
445
  }
447
446
  }
448
- /** 处理接收到的 websocket message 并解析, 根据 message.id 或 message.func 分发到对应的 handler 进行处理
447
+ /** 处理接收到的 websocket message 并解析, 根据 message.id 或 message.func 分发到对应的 handler 进行处理,
448
+ handler 处理完成后:
449
+ - 传了 func: 调用函数的情况下 (通常是一元 rpc),总是将返回值包装为 message 回传
450
+ - 未传 func: 通过 id 调用,如果 handler 返回非 undefined 的值,也包装为 message 回传
451
+
449
452
  如果 message.done == true 则对端指示当前 remote 可以清理 handler
450
- 如果 handler 返回了值 (一定是数组),则包装为 message 发送
451
453
  使用 Uint8Array 作为参数更灵活 https://stackoverflow.com/a/74505197/7609214
452
454
  这个方法一般不会抛出错误,也不需要 await,一般在 websocket on_message 时使用 */
453
455
  async handle(data, websocket) {
@@ -464,8 +466,12 @@ export class Remote {
464
466
  if (this.verbose)
465
467
  console.log('remote.handle:', message);
466
468
  let handler;
467
- if (func)
469
+ if (func) {
468
470
  handler = this.funcs[func];
471
+ // 传了 func 调用函数的情况下,如果 message.data 为 undefined, 默认为 [ ]
472
+ if (message.data === undefined)
473
+ message.data = [];
474
+ }
469
475
  else {
470
476
  handler = this.handlers.get(id);
471
477
  if (done && handler)
@@ -474,7 +480,7 @@ export class Remote {
474
480
  try {
475
481
  if (handler) {
476
482
  const data = await handler(message, websocket);
477
- if (data)
483
+ if (func || data !== undefined)
478
484
  await this.send({ id, data }, websocket);
479
485
  }
480
486
  else
package/net.d.ts CHANGED
@@ -163,11 +163,8 @@ on_message, on_error, on_close, proxy, print, }: {
163
163
  print?: boolean;
164
164
  }): Promise<WebSocket>;
165
165
  /** 接收到消息后的处理函数
166
- 返回值可以是:
167
- - 数组: 会自动被封装为 { id: 相同, data: 返回值, done: true } 这样的消息并调用 websocket.send 将其发送
168
- - void: 什么都不做
169
- - 以上的 promise */
170
- export type MessageHandler<TData extends any[] = any[]> = (message: Message<TData>, websocket?: WebSocket) => void | any[] | Promise<void | any[]>;
166
+ 返回值会自动被 await,然后可能被封装为 message 回传 */
167
+ export type MessageHandler<TData = any> = (message: Message<TData>, websocket?: WebSocket) => void | any | Promise<void | any>;
171
168
  /** 自动保持 remote 连接,只对 initiator 且传入 url 有效,
172
169
  - 在未连接,或 websocket on_error 检测到连接断开后以 reconnect_interval 间隔尝试 remote.call(func) 重连
173
170
  - 在连接状态下以 heartbeat_interval 间隔发送心跳包确保连接状态
@@ -221,7 +218,7 @@ export declare class Remote {
221
218
  funcs: Record<string, MessageHandler>;
222
219
  /** map<id, message handler>: 通过 (rpc message).id 找到对应的 handler
223
220
  一元 rpc 接收方不需要设置 handlers, 发送方需要 */
224
- handlers: Map<number, MessageHandler<any[]>>;
221
+ handlers: Map<number, MessageHandler<any>>;
225
222
  keeper?: RemoteKeeperOptions;
226
223
  /** `true` 是否打印连接信息、错误信息 */
227
224
  print: boolean;
@@ -260,16 +257,19 @@ export declare class Remote {
260
257
  作为 websocket 连接接收方,必传 websocket 参数
261
258
  发送或连接出错时自动清理 message.id 对应的 handler */
262
259
  send(message: Message, websocket?: WebSocket): Promise<void>;
263
- /** 处理接收到的 websocket message 并解析, 根据 message.id 或 message.func 分发到对应的 handler 进行处理
260
+ /** 处理接收到的 websocket message 并解析, 根据 message.id 或 message.func 分发到对应的 handler 进行处理,
261
+ handler 处理完成后:
262
+ - 传了 func: 调用函数的情况下 (通常是一元 rpc),总是将返回值包装为 message 回传
263
+ - 未传 func: 通过 id 调用,如果 handler 返回非 undefined 的值,也包装为 message 回传
264
+
264
265
  如果 message.done == true 则对端指示当前 remote 可以清理 handler
265
- 如果 handler 返回了值 (一定是数组),则包装为 message 发送
266
266
  使用 Uint8Array 作为参数更灵活 https://stackoverflow.com/a/74505197/7609214
267
267
  这个方法一般不会抛出错误,也不需要 await,一般在 websocket on_message 时使用 */
268
268
  handle(data: Uint8Array, websocket: WebSocket): Promise<void>;
269
269
  /** 调用对端 remote 中的 func, 只适用于最简单的一元 rpc (请求, 响应)
270
270
  作为 websocket 连接发起方,不需要传入 websocket
271
271
  作为 websocket 连接接收方,必传 websocket 参数 */
272
- call<TReturn extends any[] = any[]>(func: string, args?: any[], websocket?: WebSocket): Promise<TReturn>;
272
+ call<TReturn = any>(func: string, args?: any[], websocket?: WebSocket): Promise<TReturn>;
273
273
  }
274
274
  /** 为连接到 server 的 client 创建 RemoteClient,以便后续调用 client 中方法 */
275
275
  export declare class RemoteClient {
@@ -277,7 +277,7 @@ export declare class RemoteClient {
277
277
  websocket: WebSocket;
278
278
  constructor(remote: Remote, websocket: WebSocket);
279
279
  /** 调用 client 中的 func, 只适用于最简单的一元 rpc (请求, 响应) */
280
- call<TReturn extends any[] = any[]>(func: string, args?: any[]): Promise<TReturn>;
280
+ call<TReturn = any>(func: string, args?: any[]): Promise<TReturn>;
281
281
  /** 发送 message 到 client
282
282
  发送或连接出错时自动清理 message.id 对应的 handler */
283
283
  send(message: Message): Promise<void>;
package/net.js CHANGED
@@ -616,7 +616,6 @@ export class Remote {
616
616
  作为 websocket 连接接收方,必传 websocket 参数
617
617
  发送或连接出错时自动清理 message.id 对应的 handler */
618
618
  async send(message, websocket) {
619
- check(!message.data || message.data.every(arg => arg !== undefined), `message.data 数组中不能有 undefined 的项, 因为 json 序列化后会变为 null. (func: ${message.func}, id: ${message.id})`);
620
619
  if (this.verbose)
621
620
  console.log('remote.send:', message);
622
621
  try {
@@ -630,9 +629,12 @@ export class Remote {
630
629
  throw error;
631
630
  }
632
631
  }
633
- /** 处理接收到的 websocket message 并解析, 根据 message.id 或 message.func 分发到对应的 handler 进行处理
632
+ /** 处理接收到的 websocket message 并解析, 根据 message.id 或 message.func 分发到对应的 handler 进行处理,
633
+ handler 处理完成后:
634
+ - 传了 func: 调用函数的情况下 (通常是一元 rpc),总是将返回值包装为 message 回传
635
+ - 未传 func: 通过 id 调用,如果 handler 返回非 undefined 的值,也包装为 message 回传
636
+
634
637
  如果 message.done == true 则对端指示当前 remote 可以清理 handler
635
- 如果 handler 返回了值 (一定是数组),则包装为 message 发送
636
638
  使用 Uint8Array 作为参数更灵活 https://stackoverflow.com/a/74505197/7609214
637
639
  这个方法一般不会抛出错误,也不需要 await,一般在 websocket on_message 时使用 */
638
640
  async handle(data, websocket) {
@@ -649,8 +651,12 @@ export class Remote {
649
651
  if (this.verbose)
650
652
  console.log('remote.handle:', message);
651
653
  let handler;
652
- if (func)
654
+ if (func) {
653
655
  handler = this.funcs[func];
656
+ // 传了 func 调用函数的情况下,如果 message.data 为 undefined, 默认为 [ ]
657
+ if (message.data === undefined)
658
+ message.data = [];
659
+ }
654
660
  else {
655
661
  handler = this.handlers.get(id);
656
662
  if (done && handler)
@@ -659,7 +665,7 @@ export class Remote {
659
665
  try {
660
666
  if (handler) {
661
667
  const data = await handler(message, websocket);
662
- if (data)
668
+ if (func || data !== undefined)
663
669
  await this.send({ id, data }, websocket);
664
670
  }
665
671
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xshell",
3
- "version": "1.2.3",
3
+ "version": "1.2.4",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "bin": {
package/path.d.ts CHANGED
@@ -54,7 +54,7 @@ export declare function extname(path: string): string;
54
54
  /** `/` */
55
55
  export declare const sep = "/";
56
56
  /** The platform-specific file delimiter. ';' or ':'. */
57
- export declare const delimiter: ":" | ";";
57
+ export declare const delimiter: ";" | ":";
58
58
  /** Returns an object from a path string - the opposite of format().
59
59
  @param path path to evaluate.
60
60
  @throws {TypeError} if `path` is not a string. */
@@ -81,7 +81,7 @@ export declare let path: {
81
81
  basename: typeof basename;
82
82
  extname: typeof extname;
83
83
  sep: string;
84
- delimiter: ":" | ";";
84
+ delimiter: ";" | ":";
85
85
  parse: typeof parse;
86
86
  format: typeof format;
87
87
  toNamespacedPath: typeof toNamespacedPath;