@wenbin_wb/dsh-bridge 2.10.15 → 2.11.1

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.
@@ -14,11 +14,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
14
14
  throw Error('Dynamic require of "' + x + '" is not supported');
15
15
  });
16
16
  var __commonJS = (cb, mod) => function __require2() {
17
- try {
18
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
19
- } catch (e) {
20
- throw mod = 0, e;
21
- }
17
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
22
18
  };
23
19
 
24
20
  // node_modules/delayed-stream/lib/delayed_stream.js
@@ -9300,7 +9296,7 @@ var require_shams = __commonJS({
9300
9296
  return true;
9301
9297
  }
9302
9298
  var obj = {};
9303
- var sym = /* @__PURE__ */ Symbol("test");
9299
+ var sym = Symbol("test");
9304
9300
  var symObj = Object(sym);
9305
9301
  if (typeof sym === "string") {
9306
9302
  return false;
@@ -9359,7 +9355,7 @@ var require_has_symbols = __commonJS({
9359
9355
  if (typeof origSymbol("foo") !== "symbol") {
9360
9356
  return false;
9361
9357
  }
9362
- if (typeof /* @__PURE__ */ Symbol("bar") !== "symbol") {
9358
+ if (typeof Symbol("bar") !== "symbol") {
9363
9359
  return false;
9364
9360
  }
9365
9361
  return hasSymbolSham();
@@ -12503,7 +12499,7 @@ var require_axios = __commonJS({
12503
12499
  });
12504
12500
  return byteStringHeaders;
12505
12501
  }
12506
- var $internals = /* @__PURE__ */ Symbol("internals");
12502
+ var $internals = Symbol("internals");
12507
12503
  function normalizeHeader(header) {
12508
12504
  return header && String(header).trim().toLowerCase();
12509
12505
  }
@@ -13713,7 +13709,7 @@ var require_axios = __commonJS({
13713
13709
  }
13714
13710
  });
13715
13711
  }
13716
- var kInternals = /* @__PURE__ */ Symbol("internals");
13712
+ var kInternals = Symbol("internals");
13717
13713
  var AxiosTransformStream = class extends stream.Transform {
13718
13714
  constructor(options) {
13719
13715
  options = utils$1.toFlatObject(options, {
@@ -14444,9 +14440,9 @@ var require_axios = __commonJS({
14444
14440
  https: httpsFollow
14445
14441
  } = followRedirects;
14446
14442
  var isHttps = /https:?/;
14447
- var kAxiosSocketListener = /* @__PURE__ */ Symbol("axios.http.socketListener");
14448
- var kAxiosCurrentReq = /* @__PURE__ */ Symbol("axios.http.currentReq");
14449
- var kAxiosInstalledTunnel = /* @__PURE__ */ Symbol("axios.http.installedTunnel");
14443
+ var kAxiosSocketListener = Symbol("axios.http.socketListener");
14444
+ var kAxiosCurrentReq = Symbol("axios.http.currentReq");
14445
+ var kAxiosInstalledTunnel = Symbol("axios.http.installedTunnel");
14450
14446
  var tunnelingAgentCache = /* @__PURE__ */ new Map();
14451
14447
  var tunnelingAgentCacheUser = /* @__PURE__ */ new WeakMap();
14452
14448
  var NODE_NATIVE_ENV_PROXY_SUPPORT = {
@@ -20107,10 +20103,10 @@ var require_constants = __commonJS({
20107
20103
  EMPTY_BUFFER: Buffer.alloc(0),
20108
20104
  GUID: "258EAFA5-E914-47DA-95CA-C5AB0DC85B11",
20109
20105
  hasBlob,
20110
- kForOnEventAttribute: /* @__PURE__ */ Symbol("kIsForOnEventAttribute"),
20111
- kListener: /* @__PURE__ */ Symbol("kListener"),
20112
- kStatusCode: /* @__PURE__ */ Symbol("status-code"),
20113
- kWebSocket: /* @__PURE__ */ Symbol("websocket"),
20106
+ kForOnEventAttribute: Symbol("kIsForOnEventAttribute"),
20107
+ kListener: Symbol("kListener"),
20108
+ kStatusCode: Symbol("status-code"),
20109
+ kWebSocket: Symbol("websocket"),
20114
20110
  NOOP: () => {
20115
20111
  }
20116
20112
  };
@@ -20196,8 +20192,8 @@ var require_buffer_util = __commonJS({
20196
20192
  var require_limiter = __commonJS({
20197
20193
  "node_modules/ws/lib/limiter.js"(exports, module) {
20198
20194
  "use strict";
20199
- var kDone = /* @__PURE__ */ Symbol("kDone");
20200
- var kRun = /* @__PURE__ */ Symbol("kRun");
20195
+ var kDone = Symbol("kDone");
20196
+ var kRun = Symbol("kRun");
20201
20197
  var Limiter = class {
20202
20198
  /**
20203
20199
  * Creates a new `Limiter`.
@@ -20252,11 +20248,11 @@ var require_permessage_deflate = __commonJS({
20252
20248
  var { kStatusCode } = require_constants();
20253
20249
  var FastBuffer = Buffer[Symbol.species];
20254
20250
  var TRAILER = Buffer.from([0, 0, 255, 255]);
20255
- var kPerMessageDeflate = /* @__PURE__ */ Symbol("permessage-deflate");
20256
- var kTotalLength = /* @__PURE__ */ Symbol("total-length");
20257
- var kCallback = /* @__PURE__ */ Symbol("callback");
20258
- var kBuffers = /* @__PURE__ */ Symbol("buffers");
20259
- var kError = /* @__PURE__ */ Symbol("error");
20251
+ var kPerMessageDeflate = Symbol("permessage-deflate");
20252
+ var kTotalLength = Symbol("total-length");
20253
+ var kCallback = Symbol("callback");
20254
+ var kBuffers = Symbol("buffers");
20255
+ var kError = Symbol("error");
20260
20256
  var zlibLimiter;
20261
20257
  var PerMessageDeflate = class {
20262
20258
  /**
@@ -21462,7 +21458,7 @@ var require_sender = __commonJS({
21462
21458
  var { EMPTY_BUFFER, kWebSocket, NOOP } = require_constants();
21463
21459
  var { isBlob, isValidStatusCode } = require_validation();
21464
21460
  var { mask: applyMask, toBuffer } = require_buffer_util();
21465
- var kByteLength = /* @__PURE__ */ Symbol("kByteLength");
21461
+ var kByteLength = Symbol("kByteLength");
21466
21462
  var maskBuffer = Buffer.alloc(4);
21467
21463
  var RANDOM_POOL_SIZE = 8 * 1024;
21468
21464
  var randomPool;
@@ -21947,14 +21943,14 @@ var require_event_target = __commonJS({
21947
21943
  "node_modules/ws/lib/event-target.js"(exports, module) {
21948
21944
  "use strict";
21949
21945
  var { kForOnEventAttribute, kListener } = require_constants();
21950
- var kCode = /* @__PURE__ */ Symbol("kCode");
21951
- var kData = /* @__PURE__ */ Symbol("kData");
21952
- var kError = /* @__PURE__ */ Symbol("kError");
21953
- var kMessage = /* @__PURE__ */ Symbol("kMessage");
21954
- var kReason = /* @__PURE__ */ Symbol("kReason");
21955
- var kTarget = /* @__PURE__ */ Symbol("kTarget");
21956
- var kType = /* @__PURE__ */ Symbol("kType");
21957
- var kWasClean = /* @__PURE__ */ Symbol("kWasClean");
21946
+ var kCode = Symbol("kCode");
21947
+ var kData = Symbol("kData");
21948
+ var kError = Symbol("kError");
21949
+ var kMessage = Symbol("kMessage");
21950
+ var kReason = Symbol("kReason");
21951
+ var kTarget = Symbol("kTarget");
21952
+ var kType = Symbol("kType");
21953
+ var kWasClean = Symbol("kWasClean");
21958
21954
  var Event = class {
21959
21955
  /**
21960
21956
  * Create a new `Event`.
@@ -22356,7 +22352,7 @@ var require_websocket = __commonJS({
22356
22352
  } = require_event_target();
22357
22353
  var { format, parse } = require_extension();
22358
22354
  var { toBuffer } = require_buffer_util();
22359
- var kAborted = /* @__PURE__ */ Symbol("kAborted");
22355
+ var kAborted = Symbol("kAborted");
22360
22356
  var protocolVersions = [8, 13];
22361
22357
  var readyStates = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"];
22362
22358
  var subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;
@@ -26388,14 +26384,14 @@ var require_index = __commonJS({
26388
26384
  LoggerLevel[LoggerLevel["debug"] = 4] = "debug";
26389
26385
  LoggerLevel[LoggerLevel["trace"] = 5] = "trace";
26390
26386
  })(exports.LoggerLevel || (exports.LoggerLevel = {}));
26391
- var CEventType = /* @__PURE__ */ Symbol("event-type");
26392
- var CTenantKey = /* @__PURE__ */ Symbol("tenant-key");
26393
- var CAppTicket = /* @__PURE__ */ Symbol("app-ticket");
26394
- var CTenantAccessToken = /* @__PURE__ */ Symbol("tenant-access-token");
26395
- var CWithHelpdeskAuthorization = /* @__PURE__ */ Symbol("with-helpdesk-authorization");
26396
- var CWithUserAccessToken = /* @__PURE__ */ Symbol("with-user-access-token");
26397
- var CUserAccessToken = /* @__PURE__ */ Symbol("user-access-token");
26398
- var CAilySessionRecord = /* @__PURE__ */ Symbol("aily-session-record");
26387
+ var CEventType = Symbol("event-type");
26388
+ var CTenantKey = Symbol("tenant-key");
26389
+ var CAppTicket = Symbol("app-ticket");
26390
+ var CTenantAccessToken = Symbol("tenant-access-token");
26391
+ var CWithHelpdeskAuthorization = Symbol("with-helpdesk-authorization");
26392
+ var CWithUserAccessToken = Symbol("with-user-access-token");
26393
+ var CUserAccessToken = Symbol("user-access-token");
26394
+ var CAilySessionRecord = Symbol("aily-session-record");
26399
26395
  var string2Base64 = (content) => Buffer.from(content).toString("base64");
26400
26396
  var DefaultCache = class {
26401
26397
  constructor() {
@@ -26457,19 +26453,12 @@ var require_index = __commonJS({
26457
26453
  return domain;
26458
26454
  }
26459
26455
  };
26460
- var fillApiPath = (apiPath, pathSupplement = {}) => (
26461
- // Only treat `:name` as a path parameter when it starts a path segment
26462
- // (string start or right after `/`). Colons inside the URL authority,
26463
- // e.g. `http://localhost:3000` or `user:pw@host`, must be left untouched.
26464
- // The separator is captured and re-emitted instead of using a lookbehind
26465
- // because the compile target (es6) has no lookbehind support.
26466
- apiPath.replace(/(^|\/):([^/]+)/g, (_, pathPrefix, pathKey) => {
26467
- if (pathSupplement[pathKey] !== void 0) {
26468
- return `${pathPrefix}${pathSupplement[pathKey]}`;
26469
- }
26470
- throw new Error(`request miss ${pathKey} path argument`);
26471
- })
26472
- );
26456
+ var fillApiPath = (apiPath, pathSupplement = {}) => apiPath.replace(/:([^/]+)/g, (_, $1) => {
26457
+ if (pathSupplement[$1] !== void 0) {
26458
+ return pathSupplement[$1];
26459
+ }
26460
+ throw new Error(`request miss ${$1} path argument`);
26461
+ });
26473
26462
  var assert = (predication, callback) => __awaiter(void 0, void 0, void 0, function* () {
26474
26463
  const isInvoke = typeof predication === "function" ? predication() : predication;
26475
26464
  if (isInvoke) {
@@ -119932,8 +119921,6 @@ var require_index = __commonJS({
119932
119921
  }
119933
119922
  };
119934
119923
  var CAppTicketHandle = "app_ticket";
119935
- var duplicateHandleWarning = (key) => `${key} handle is already registered and has been replaced, call unregister('${key}') first to replace it explicitly`;
119936
- var appTicketUnregisteredWarning = `the built-in ${CAppTicketHandle} handle is unregistered, pushed app tickets are no longer cached and every app_access_token request of an ISV app will miss the cache and trigger an app_ticket resend`;
119937
119924
  var EventDispatcher = class {
119938
119925
  constructor(params) {
119939
119926
  this.verificationToken = "";
@@ -119967,46 +119954,16 @@ var require_index = __commonJS({
119967
119954
  })
119968
119955
  });
119969
119956
  }
119970
- /**
119971
- * Register a handler for each of the given event keys.
119972
- *
119973
- * Registering a key that already has a handler replaces it. That is a
119974
- * supported operation, but the replacement is easier to spot when it is
119975
- * announced: call `unregister(key)` first and nothing is logged, otherwise
119976
- * a warning flags what would otherwise be an unnoticed overwrite.
119977
- */
119978
119957
  register(handles) {
119979
119958
  Object.keys(handles).forEach((key) => {
119980
119959
  if (this.handles.has(key) && key !== CAppTicketHandle) {
119981
- this.logger.warn(duplicateHandleWarning(key));
119960
+ this.logger.error(`this ${key} handle is registered`);
119982
119961
  }
119983
119962
  this.handles.set(key, handles[key]);
119984
119963
  this.logger.debug(`register ${key} handle`);
119985
119964
  });
119986
119965
  return this;
119987
119966
  }
119988
- /**
119989
- * Remove the handler registered for each of the given event keys, so that
119990
- * the events are no longer dispatched. Keys without a handler are skipped.
119991
- *
119992
- * Removing the built-in `app_ticket` handle stops the SDK from caching
119993
- * pushed app tickets, which makes every app_access_token request of an ISV
119994
- * app miss the cache and trigger an app_ticket resend -- hence the warning.
119995
- */
119996
- unregister(...keys) {
119997
- keys.forEach((key) => {
119998
- if (!this.handles.has(key)) {
119999
- this.logger.debug(`no ${key} handle to unregister`);
120000
- return;
120001
- }
120002
- this.handles.delete(key);
120003
- this.logger.debug(`unregister ${key} handle`);
120004
- if (key === CAppTicketHandle) {
120005
- this.logger.warn(appTicketUnregisteredWarning);
120006
- }
120007
- });
120008
- return this;
120009
- }
120010
119967
  invoke(data, params) {
120011
119968
  var _a, _b;
120012
119969
  return __awaiter(this, void 0, void 0, function* () {
@@ -120729,9 +120686,6 @@ var require_index = __commonJS({
120729
120686
  }
120730
120687
  mergeData(params) {
120731
120688
  const { message_id, sum, seq, trace_id, data } = params;
120732
- if (!Number.isInteger(sum) || sum <= 0 || !Number.isInteger(seq) || seq < 0 || seq >= sum) {
120733
- throw new Error(`invalid event fragment metadata (sum: ${sum}, seq: ${seq})`);
120734
- }
120735
120689
  const cache = this.cache.get(message_id);
120736
120690
  if (!cache) {
120737
120691
  const buffer = new Array(sum).fill(void 0);
@@ -120743,9 +120697,6 @@ var require_index = __commonJS({
120743
120697
  create_time: Date.now()
120744
120698
  });
120745
120699
  } else {
120746
- if (sum !== cache.buffer.length) {
120747
- throw new Error(`invalid event fragment metadata (sum: ${sum} differs from first fragment's ${cache.buffer.length}, seq: ${seq})`);
120748
- }
120749
120700
  cache.buffer[seq] = data;
120750
120701
  }
120751
120702
  const mergedCache = this.cache.get(message_id);
@@ -120836,17 +120787,12 @@ var require_index = __commonJS({
120836
120787
  HttpStatusCode2[HttpStatusCode2["ok"] = 200] = "ok";
120837
120788
  HttpStatusCode2[HttpStatusCode2["internal_server_error"] = 500] = "internal_server_error";
120838
120789
  })(HttpStatusCode || (HttpStatusCode = {}));
120839
- var describeError = (err) => {
120840
- const message = err === null || err === void 0 ? void 0 : err.message;
120841
- return message ? message : String(err);
120842
- };
120843
120790
  var WSClient = class {
120844
120791
  constructor(params) {
120845
120792
  var _a;
120846
120793
  this.wsConfig = new WSConfig();
120847
120794
  this.reconnectGeneration = 0;
120848
120795
  this.isConnecting = false;
120849
- this.closed = false;
120850
120796
  this.reconnectInfo = {
120851
120797
  lastConnectTime: 0,
120852
120798
  nextConnectTime: 0
@@ -120915,53 +120861,6 @@ var require_index = __commonJS({
120915
120861
  this.livenessTimer = void 0;
120916
120862
  }
120917
120863
  }
120918
- /**
120919
- * Detach a socket we are about to throw away: drop every listener, but
120920
- * leave one 'error' sink behind.
120921
- *
120922
- * `ws` reports the abort of a non-OPEN socket asynchronously — both
120923
- * `terminate()` and `close()` route through `abortHandshake()`, which
120924
- * emits 'error' on a later tick — and a non-force `close()` on an OPEN
120925
- * socket keeps the connection alive until the peer answers (up to `ws`'s
120926
- * 30s closeTimeout), during which a TCP reset still surfaces as 'error'.
120927
- * An EventEmitter with no 'error' listener throws instead of emitting, and
120928
- * that throw lands outside every try/catch, killing the host process.
120929
- * See https://github.com/larksuite/node-sdk/issues/197
120930
- *
120931
- * NOTE: not for the liveness watchdog — that one terminates *on purpose*
120932
- * and needs its listeners intact so 'close' drives the reconnect.
120933
- */
120934
- detachSocket(socket) {
120935
- socket.removeAllListeners();
120936
- socket.on("error", (err) => {
120937
- this.logger.debug("[ws]", "ignored error from discarded socket", err === null || err === void 0 ? void 0 : err.message);
120938
- });
120939
- }
120940
- /**
120941
- * Throw away whatever the current attempt established — socket *and* the
120942
- * timers its 'open' handler armed. A handshake that completes after
120943
- * `close()` runs `pingLoop()`, and that timer is not unref'd: leaving it
120944
- * behind keeps the event loop alive forever on a client the caller closed.
120945
- *
120946
- * Only safe when {@link closed} is set: otherwise a newer session may
120947
- * already own `wsConfig`'s instance.
120948
- */
120949
- discardConnection() {
120950
- if (this.pingInterval) {
120951
- clearTimeout(this.pingInterval);
120952
- this.pingInterval = void 0;
120953
- }
120954
- this.clearLiveness();
120955
- const socket = this.wsConfig.getWSInstance();
120956
- if (!socket)
120957
- return;
120958
- this.detachSocket(socket);
120959
- try {
120960
- socket.terminate();
120961
- } catch (_a) {
120962
- }
120963
- this.wsConfig.setWSInstance(null);
120964
- }
120965
120864
  /**
120966
120865
  * Invoke a user-supplied callback safely: no-op if undefined, swallow any
120967
120866
  * exception to avoid breaking the WS state machine.
@@ -121068,7 +120967,7 @@ var require_index = __commonJS({
121068
120967
  if (this.handshakeTimeoutMs && this.handshakeTimeoutMs > 0) {
121069
120968
  timer = setTimeout(() => {
121070
120969
  this.logger.error("[ws]", `handshake timeout after ${this.handshakeTimeoutMs}ms`);
121071
- this.detachSocket(wsInstance);
120970
+ wsInstance.removeAllListeners();
121072
120971
  try {
121073
120972
  wsInstance.terminate();
121074
120973
  } catch (_a) {
@@ -121124,13 +121023,6 @@ var require_index = __commonJS({
121124
121023
  } finally {
121125
121024
  this.isConnecting = false;
121126
121025
  }
121127
- if (this.closed) {
121128
- this.discardConnection();
121129
- return;
121130
- }
121131
- if (currentGeneration !== this.reconnectGeneration) {
121132
- return;
121133
- }
121134
121026
  if (result.ok) {
121135
121027
  this.hasEverConnected = true;
121136
121028
  this.safeInvoke("onReady", this.onReady);
@@ -121172,10 +121064,6 @@ var require_index = __commonJS({
121172
121064
  count++;
121173
121065
  this.currentReconnectAttempts = count;
121174
121066
  const result = yield tryConnect();
121175
- if (this.closed) {
121176
- this.discardConnection();
121177
- return;
121178
- }
121179
121067
  if (currentGeneration !== this.reconnectGeneration) {
121180
121068
  return;
121181
121069
  }
@@ -121239,17 +121127,13 @@ var require_index = __commonJS({
121239
121127
  const wsInstance = this.wsConfig.getWSInstance();
121240
121128
  wsInstance === null || wsInstance === void 0 ? void 0 : wsInstance.on("message", (buffer) => __awaiter(this, void 0, void 0, function* () {
121241
121129
  this.clearLiveness();
121242
- try {
121243
- const data = decode(buffer);
121244
- const { method } = data;
121245
- if (method === FrameType.control) {
121246
- yield this.handleControlData(data);
121247
- }
121248
- if (method === FrameType.data) {
121249
- yield this.handleEventData(data);
121250
- }
121251
- } catch (err) {
121252
- this.logger.error("[ws]", `failed to handle inbound frame: ${describeError(err)}`);
121130
+ const data = decode(buffer);
121131
+ const { method } = data;
121132
+ if (method === FrameType.control) {
121133
+ yield this.handleControlData(data);
121134
+ }
121135
+ if (method === FrameType.data) {
121136
+ yield this.handleEventData(data);
121253
121137
  }
121254
121138
  }));
121255
121139
  wsInstance === null || wsInstance === void 0 ? void 0 : wsInstance.on("error", (e) => {
@@ -121271,15 +121155,8 @@ var require_index = __commonJS({
121271
121155
  }
121272
121156
  if (type === MessageType.pong && payload) {
121273
121157
  this.logger.trace("[ws]", "receive pong");
121274
- let pong;
121275
- try {
121276
- const dataString = new TextDecoder("utf-8").decode(payload);
121277
- pong = JSON.parse(dataString);
121278
- } catch (err) {
121279
- this.logger.error("[ws]", `invalid pong payload: ${describeError(err)}`);
121280
- return;
121281
- }
121282
- const { PingInterval, ReconnectCount, ReconnectInterval, ReconnectNonce } = pong;
121158
+ const dataString = new TextDecoder("utf-8").decode(payload);
121159
+ const { PingInterval, ReconnectCount, ReconnectInterval, ReconnectNonce } = JSON.parse(dataString);
121283
121160
  this.wsConfig.updateWs({
121284
121161
  pingInterval: PingInterval * 1e3,
121285
121162
  reconnectCount: ReconnectCount,
@@ -121302,19 +121179,13 @@ var require_index = __commonJS({
121302
121179
  if (type !== MessageType.event) {
121303
121180
  return;
121304
121181
  }
121305
- let mergedData;
121306
- try {
121307
- mergedData = this.dataCache.mergeData({
121308
- message_id,
121309
- sum: Number(sum),
121310
- seq: Number(seq),
121311
- trace_id,
121312
- data: payload
121313
- });
121314
- } catch (err) {
121315
- this.logger.error("[ws]", `failed to merge event fragments, message_id: ${message_id}; trace_id: ${trace_id}; error: ${describeError(err)}`);
121316
- return;
121317
- }
121182
+ const mergedData = this.dataCache.mergeData({
121183
+ message_id,
121184
+ sum: Number(sum),
121185
+ seq: Number(seq),
121186
+ trace_id,
121187
+ data: payload
121188
+ });
121318
121189
  if (!mergedData) {
121319
121190
  return;
121320
121191
  }
@@ -121383,7 +121254,6 @@ var require_index = __commonJS({
121383
121254
  */
121384
121255
  close(params = {}) {
121385
121256
  const { force = false } = params;
121386
- this.closed = true;
121387
121257
  this.reconnectGeneration++;
121388
121258
  if (this.pingInterval) {
121389
121259
  clearTimeout(this.pingInterval);
@@ -121399,7 +121269,7 @@ var require_index = __commonJS({
121399
121269
  this.currentReconnectAttempts = 0;
121400
121270
  const wsInstance = this.wsConfig.getWSInstance();
121401
121271
  if (wsInstance) {
121402
- this.detachSocket(wsInstance);
121272
+ wsInstance.removeAllListeners();
121403
121273
  if (force) {
121404
121274
  wsInstance.terminate();
121405
121275
  } else {
@@ -121422,7 +121292,6 @@ var require_index = __commonJS({
121422
121292
  return;
121423
121293
  }
121424
121294
  this.terminalError = false;
121425
- this.closed = false;
121426
121295
  this.currentReconnectAttempts = 0;
121427
121296
  this.dataCache.clearAtInterval();
121428
121297
  this.logger.info("[ws]", `receive events or callbacks through persistent connection only available in self-build & Feishu app, Configured in:
@@ -121842,7 +121711,6 @@ var require_index = __commonJS({
121842
121711
  let domainSwitched = false;
121843
121712
  let pollTimer = null;
121844
121713
  let expireTimer = null;
121845
- let settled = false;
121846
121714
  const cleanup = () => {
121847
121715
  var _a2;
121848
121716
  if (pollTimer !== null) {
@@ -121855,51 +121723,25 @@ var require_index = __commonJS({
121855
121723
  }
121856
121724
  (_a2 = ctx.signal) === null || _a2 === void 0 ? void 0 : _a2.removeEventListener("abort", onAbort);
121857
121725
  };
121858
- const succeed = (result) => {
121859
- if (settled) {
121860
- return;
121861
- }
121862
- settled = true;
121863
- cleanup();
121864
- resolve(result);
121865
- };
121866
- const fail = (err) => {
121867
- if (settled) {
121868
- return;
121869
- }
121870
- settled = true;
121871
- cleanup();
121872
- reject(err);
121873
- };
121874
- const scheduleNextPoll = () => {
121875
- if (settled) {
121876
- return;
121877
- }
121878
- pollTimer = setTimeout(poll, interval);
121879
- };
121880
121726
  const onAbort = () => {
121881
- fail(createError("abort", "Registration was aborted"));
121727
+ cleanup();
121728
+ reject(createError("abort", "Registration was aborted"));
121882
121729
  };
121883
121730
  if ((_a = ctx.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
121884
- return fail(createError("abort", "Registration was aborted"));
121731
+ return reject(createError("abort", "Registration was aborted"));
121885
121732
  }
121886
121733
  (_b = ctx.signal) === null || _b === void 0 ? void 0 : _b.addEventListener("abort", onAbort, { once: true });
121887
121734
  expireTimer = setTimeout(() => {
121888
- fail(createError("expired_token", "Polling timed out"));
121735
+ cleanup();
121736
+ reject(createError("expired_token", "Polling timed out"));
121889
121737
  }, ctx.expireIn);
121890
121738
  const poll = () => __awaiter(this, void 0, void 0, function* () {
121891
121739
  var _c, _d, _e, _f, _g, _h;
121892
- if (settled) {
121893
- return;
121894
- }
121895
121740
  try {
121896
121741
  const pollRes = yield requestRegistration(baseUrl, {
121897
121742
  action: "poll",
121898
121743
  device_code: ctx.deviceCode
121899
121744
  });
121900
- if (settled) {
121901
- return;
121902
- }
121903
121745
  if (((_c = pollRes.user_info) === null || _c === void 0 ? void 0 : _c.tenant_brand) === "lark" && !domainSwitched) {
121904
121746
  baseUrl = ctx.larkBaseUrl;
121905
121747
  domainSwitched = true;
@@ -121908,7 +121750,8 @@ var require_index = __commonJS({
121908
121750
  return;
121909
121751
  }
121910
121752
  if (pollRes.client_id && pollRes.client_secret) {
121911
- succeed({
121753
+ cleanup();
121754
+ resolve({
121912
121755
  client_id: pollRes.client_id,
121913
121756
  client_secret: pollRes.client_secret,
121914
121757
  user_info: pollRes.user_info
@@ -121925,18 +121768,21 @@ var require_index = __commonJS({
121925
121768
  break;
121926
121769
  case "access_denied":
121927
121770
  case "expired_token":
121928
- fail(createError(pollRes.error, (_g = pollRes.error_description) !== null && _g !== void 0 ? _g : "Unknown error"));
121771
+ cleanup();
121772
+ reject(createError(pollRes.error, (_g = pollRes.error_description) !== null && _g !== void 0 ? _g : "Unknown error"));
121929
121773
  return;
121930
121774
  default:
121931
121775
  if (pollRes.error) {
121932
- fail(createError(pollRes.error, (_h = pollRes.error_description) !== null && _h !== void 0 ? _h : "Unknown error"));
121776
+ cleanup();
121777
+ reject(createError(pollRes.error, (_h = pollRes.error_description) !== null && _h !== void 0 ? _h : "Unknown error"));
121933
121778
  return;
121934
121779
  }
121935
121780
  break;
121936
121781
  }
121937
- scheduleNextPoll();
121782
+ pollTimer = setTimeout(poll, interval);
121938
121783
  } catch (e) {
121939
- fail(e);
121784
+ cleanup();
121785
+ reject(e);
121940
121786
  }
121941
121787
  });
121942
121788
  poll();
package/lib/index.js CHANGED
@@ -10,7 +10,7 @@ import { get as httpsGet } from 'node:https';
10
10
  import { networkInterfaces, homedir, totalmem, freemem, cpus, loadavg, platform, arch, release, hostname, uptime } from 'node:os';
11
11
  import { join, dirname, basename, resolve, normalize } from 'node:path';
12
12
  import { fileURLToPath } from 'node:url';
13
- import { readFileSync, appendFileSync, existsSync, realpathSync } from 'node:fs';
13
+ import { readFileSync, appendFileSync, existsSync, realpathSync, mkdirSync } from 'node:fs';
14
14
  import { readFile, writeFile, mkdir, unlink, readdir, stat, access } from 'node:fs/promises';
15
15
  import { spawn } from 'node:child_process';
16
16
  import QRCode from 'qrcode';
@@ -278,12 +278,18 @@ function sanitizeProxyHeaders(headers, extra) {
278
278
  * @returns {string} 单元名,取不到返回空串
279
279
  */
280
280
  export function parseSystemdUnit(cgroup) {
281
- const parts = String(cgroup || '').split('/').filter(Boolean);
282
- // 只认**最内层**组件:若最内层不是 .service(例如 .scope、或 docker/k8s 的容器目录),
283
- // 说明本进程不是被某个 service 直接托管,绝不能向上游误取祖先单元
284
- // (否则会把 docker.service / cron.service 之类重启掉)。
285
- const innermost = parts[parts.length - 1] ?? '';
286
- return innermost.endsWith('.service') ? innermost : '';
281
+ const lines = String(cgroup || '').split(/\r?\n/).map((l) => l.trim()).filter(Boolean);
282
+ for (const line of lines) {
283
+ const parts = line.split('/').map((p) => p.trim()).filter(Boolean);
284
+ // 只认**最内层**组件:若最内层不是 .service(例如 .scope、或 docker/k8s 的容器目录),
285
+ // 说明本进程不是被某个 service 直接托管,绝不能向上游误取祖先单元
286
+ // (否则会把 docker.service / cron.service 之类重启掉)。
287
+ const innermost = parts[parts.length - 1] ?? '';
288
+ if (innermost.endsWith('.service')) {
289
+ return innermost;
290
+ }
291
+ }
292
+ return '';
287
293
  }
288
294
 
289
295
  /**
@@ -304,8 +310,8 @@ export function detectSupervisor({ env = process.env, cgroup = '' } = {}) {
304
310
  const systemdMarked = Boolean(env.INVOCATION_ID || env.JOURNAL_STREAM) || text.includes('.slice');
305
311
  const unit = systemdMarked ? parseSystemdUnit(text) : '';
306
312
  if (unit) {
307
- const parts = text.split('/').filter(Boolean);
308
- return { kind: 'systemd', scope: parts.includes('user.slice') ? 'user' : 'system', unit, reason: 'cgroup 检出 systemd 单元' };
313
+ const isUser = text.includes('user.slice') || text.includes('/user@');
314
+ return { kind: 'systemd', scope: isUser ? 'user' : 'system', unit, reason: 'cgroup 检出 systemd 单元' };
309
315
  }
310
316
  return { kind: 'self', reason: '未检出托管器(无 DSH_DAEMON/PM2_HOME,也不在 systemd 单元内)' };
311
317
  }
@@ -1379,6 +1385,7 @@ class BridgeService {
1379
1385
  const dshHome = env.DSH_HOME ?? join(homedir(), '.dsh');
1380
1386
  const logFile = join(dshHome, 'dsh-bridge', 'restart.log');
1381
1387
  const childLog = join(dshHome, 'dsh-bridge', 'restart-child.log');
1388
+ try { mkdirSync(dirname(logFile), { recursive: true }); } catch { /* 日志目录不可写时忽略 */ }
1382
1389
  const writeLog = (message) => {
1383
1390
  try { appendFileSync(logFile, `[${new Date().toISOString()}] ${message}\n`); } catch { /* 日志不可写时忽略 */ }
1384
1391
  };
@@ -1389,18 +1396,36 @@ class BridgeService {
1389
1396
 
1390
1397
  if (plan.kind === 'systemd') {
1391
1398
  const args = [...(plan.scope === 'user' ? ['--user'] : []), 'restart', '--no-block', plan.unit];
1399
+ const systemctlEnv = { ...env };
1400
+ if (process.platform === 'linux') {
1401
+ const defaultPaths = ['/usr/local/bin', '/usr/bin', '/bin', '/usr/local/sbin', '/usr/sbin', '/sbin'];
1402
+ const existingPath = systemctlEnv.PATH || '';
1403
+ const missingPaths = defaultPaths.filter((p) => !existingPath.split(':').includes(p));
1404
+ if (missingPaths.length > 0) {
1405
+ systemctlEnv.PATH = existingPath ? `${existingPath}:${missingPaths.join(':')}` : missingPaths.join(':');
1406
+ }
1407
+ if (plan.scope === 'user' && !systemctlEnv.XDG_RUNTIME_DIR && typeof process.getuid === 'function') {
1408
+ systemctlEnv.XDG_RUNTIME_DIR = `/run/user/${process.getuid()}`;
1409
+ }
1410
+ }
1392
1411
  // 关键:必须以 **systemctl 的退出码** 判定成败,而不是"派生成功"。
1393
1412
  // `--no-block` 下 systemctl 只发请求就返回(实测往返 ~6ms),但单元名不存在会 rc=5、
1394
1413
  // 权限不足会 rc=1;旧写法只看 'spawn' 事件 → 必然失败也返回 ok:true 再 exit(0),
1395
1414
  // 而干净退出不满足 Restart=on-failure → DSH 直接下线且不自动拉起。
1396
1415
  const outcome = await new Promise((resolve) => {
1397
1416
  let settled = false;
1398
- const settle = (value) => { if (!settled) { settled = true; resolve(value); } };
1417
+ const timer = setTimeout(() => settle({ error: new Error('systemctl 执行超时(5s)') }), 5000);
1418
+ const settle = (value) => {
1419
+ if (!settled) {
1420
+ settled = true;
1421
+ clearTimeout(timer);
1422
+ resolve(value);
1423
+ }
1424
+ };
1399
1425
  try {
1400
- const child = spawnImpl('systemctl', args, { detached: true, stdio: 'ignore', env });
1426
+ const child = spawnImpl('systemctl', args, { detached: true, stdio: 'ignore', env: systemctlEnv });
1401
1427
  child.once?.('error', (err) => settle({ error: err }));
1402
1428
  child.once?.('close', (code) => settle({ code }));
1403
- child.unref?.();
1404
1429
  } catch (err) {
1405
1430
  settle({ error: err });
1406
1431
  }