@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.
- package/CHANGELOG.md +40 -0
- package/client/client.js +259 -19
- package/client/index.js +97 -15
- package/client/mobile-styles.js +17 -3
- package/client/mobile-yield.js +192 -0
- package/client/settings-nav-icon.js +90 -0
- package/docs/release-process.md +6 -1
- package/lib/feishu/lark-bundled.mjs +76 -230
- package/lib/index.js +37 -12
- package/lib/restart-helper.mjs +17 -3
- package/package.json +3 -3
|
@@ -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
|
-
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
14448
|
-
var kAxiosCurrentReq =
|
|
14449
|
-
var kAxiosInstalledTunnel =
|
|
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:
|
|
20111
|
-
kListener:
|
|
20112
|
-
kStatusCode:
|
|
20113
|
-
kWebSocket:
|
|
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 =
|
|
20200
|
-
var 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 =
|
|
20256
|
-
var kTotalLength =
|
|
20257
|
-
var kCallback =
|
|
20258
|
-
var kBuffers =
|
|
20259
|
-
var kError =
|
|
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 =
|
|
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 =
|
|
21951
|
-
var kData =
|
|
21952
|
-
var kError =
|
|
21953
|
-
var kMessage =
|
|
21954
|
-
var kReason =
|
|
21955
|
-
var kTarget =
|
|
21956
|
-
var kType =
|
|
21957
|
-
var 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 =
|
|
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 =
|
|
26392
|
-
var CTenantKey =
|
|
26393
|
-
var CAppTicket =
|
|
26394
|
-
var CTenantAccessToken =
|
|
26395
|
-
var CWithHelpdeskAuthorization =
|
|
26396
|
-
var CWithUserAccessToken =
|
|
26397
|
-
var CUserAccessToken =
|
|
26398
|
-
var CAilySessionRecord =
|
|
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
|
-
|
|
26462
|
-
|
|
26463
|
-
|
|
26464
|
-
|
|
26465
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
121243
|
-
|
|
121244
|
-
|
|
121245
|
-
|
|
121246
|
-
|
|
121247
|
-
|
|
121248
|
-
|
|
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
|
-
|
|
121275
|
-
|
|
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
|
-
|
|
121306
|
-
|
|
121307
|
-
|
|
121308
|
-
|
|
121309
|
-
|
|
121310
|
-
|
|
121311
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
121782
|
+
pollTimer = setTimeout(poll, interval);
|
|
121938
121783
|
} catch (e) {
|
|
121939
|
-
|
|
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
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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
|
|
308
|
-
return { kind: 'systemd', scope:
|
|
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
|
|
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
|
}
|