snyk-broker 5.22.0 → 5.22.2
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/dist/lib/hybrid-sdk/client/utils/connectionValidation.js +1 -1
- package/dist/lib/hybrid-sdk/client/utils/connectionValidation.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/auth/authHelpers.js +17 -5
- package/dist/lib/hybrid-sdk/server/auth/authHelpers.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/routesHandlers/authHandlers.js +5 -13
- package/dist/lib/hybrid-sdk/server/routesHandlers/authHandlers.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/routesHandlers/httpRequestHandler.js +57 -27
- package/dist/lib/hybrid-sdk/server/routesHandlers/httpRequestHandler.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/socket.js +72 -16
- package/dist/lib/hybrid-sdk/server/socket.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/socketHandlers/closeHandler.js +10 -3
- package/dist/lib/hybrid-sdk/server/socketHandlers/closeHandler.js.map +1 -1
- package/dist/lib/hybrid-sdk/server/socketHandlers/connectionHandler.js +8 -0
- package/dist/lib/hybrid-sdk/server/socketHandlers/connectionHandler.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -21,7 +21,7 @@ const validateConnection = async (config) => {
|
|
|
21
21
|
headers['Authorization'] = `Basic ${Buffer.from(`${auth.username}:${auth.password}`).toString('base64')}`;
|
|
22
22
|
break;
|
|
23
23
|
case 'header':
|
|
24
|
-
headers['Authorization'] = `${auth.value}`;
|
|
24
|
+
headers[auth.name ?? 'Authorization'] = `${auth.value}`;
|
|
25
25
|
break;
|
|
26
26
|
default: {
|
|
27
27
|
const parsed = (0, url_1.parse)(url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectionValidation.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/client/utils/connectionValidation.ts"],"names":[],"mappings":";;;AAAA,6BAAoC;AACpC,gDAAsE;AAEtE,iDAA+D;AAE/D,+CAAgE;AAEzD,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAAwB,EAAE,EAAE;IACnE,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAClD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,UAAU,EAAE,MAAM,IAAI,KAAK,CAAC;QAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC;QACjC,MAAM,OAAO,GAA2B,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC;QAClE,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC;QACnC,IAAI,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC;QAChC,MAAM,oBAAoB,GAAG,IAAA,iBAAQ,EAAC,WAAW,CAAC,CAAC;QAEnD,QAAQ,IAAI,EAAE,IAAI,EAAE;YAClB,KAAK,OAAO;gBACV,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,MAAM,CAAC,IAAI,CAC7C,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CACpC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvB,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"connectionValidation.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/client/utils/connectionValidation.ts"],"names":[],"mappings":";;;AAAA,6BAAoC;AACpC,gDAAsE;AAEtE,iDAA+D;AAE/D,+CAAgE;AAEzD,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAAwB,EAAE,EAAE;IACnE,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAClD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,UAAU,EAAE,MAAM,IAAI,KAAK,CAAC;QAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC;QACjC,MAAM,OAAO,GAA2B,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC;QAClE,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC;QACnC,IAAI,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC;QAChC,MAAM,oBAAoB,GAAG,IAAA,iBAAQ,EAAC,WAAW,CAAC,CAAC;QAEnD,QAAQ,IAAI,EAAE,IAAI,EAAE;YAClB,KAAK,OAAO;gBACV,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,MAAM,CAAC,IAAI,CAC7C,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CACpC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvB,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACxD,MAAM;YACR,OAAO,CAAC,CAAC;gBACP,MAAM,MAAM,GAAG,IAAA,WAAK,EAAC,GAAG,CAAC,CAAC;gBAC1B,IAAI,MAAM,CAAC,IAAI,EAAE;oBACf,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;wBAC7B,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,MAAM,CAAC,IAAI,CAC7C,MAAM,CAAC,IAAI,CACZ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;qBACxB;yBAAM;wBACL,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,IAAI,EAAE,CAAC;qBACpD;oBACD,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;oBACnB,UAAU,GAAG,IAAA,YAAM,EAAC,MAAM,CAAC,CAAC;iBAC7B;qBAAM;oBACL,YAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,qBAAqB,CAAC,CAAC;iBACpD;gBACD,MAAM;aACP;SACF;QACD,MAAM,OAAO,GAA8B;YACzC,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,UAAU;YACf,OAAO,EAAE,OAAO;SACjB,CAAC;QACF,IAAI,UAAU,CAAC,IAAI,EAAE;YACnB,OAAO,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;SAChC;QACD,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAA,0CAAgC,EACrD,OAAoC,CACrC,CAAC;YAEF,IAAI,MAAM,CAAC,aAAa,EAAE;gBACxB,MAAM,MAAM,GAAG,IAAA,6CAA+B,EAAC,QAAQ,CAAC,CAAC;gBACzD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC;oBACR,GAAG,EAAE,oBAAoB;oBACzB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;oBACtB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU;iBACnC,CAAC,CAAC;aACJ;iBAAM;gBACL,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,EAAE;oBACnC,OAAO,GAAG,QAAQ,CAAC,UAAU,IAAI,GAAG,IAAI,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;iBACnE;gBACD,IAAI,CAAC,IAAI,CAAC;oBACR,GAAG,EAAE,oBAAoB;oBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;iBAChC,CAAC,CAAC;aACJ;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;SACrD;KACF;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC,CAAC;AA3EW,QAAA,kBAAkB,sBA2E7B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BrokerAuthError = exports.validateBrokerClientCredentials = void 0;
|
|
3
|
+
exports.BrokerAuthError = exports.validateBrokerClientCredentials = exports.getHandshakeIdentityFromHeaders = void 0;
|
|
4
4
|
const config_1 = require("../../common/config/config");
|
|
5
5
|
const token_1 = require("../../common/utils/token");
|
|
6
6
|
const logger_1 = require("../../../logs/logger");
|
|
@@ -41,12 +41,24 @@ function getHeaderOptions(authHeader) {
|
|
|
41
41
|
}
|
|
42
42
|
return requestHeaders;
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Reads the handshake identity from the websocket upgrade headers. This is the
|
|
46
|
+
* only identity available before the client sends `identify`, so it is also the
|
|
47
|
+
* only way to correlate a socket back to the pool entry the authorize hook
|
|
48
|
+
* registered for it.
|
|
49
|
+
*/
|
|
50
|
+
const getHandshakeIdentityFromHeaders = (headers) => ({
|
|
51
|
+
brokerClientId: getHeader(headers, BROKER_CLIENT_ID_HEADER),
|
|
52
|
+
role: getHeader(headers, BROKER_CLIENT_ROLE_HEADER) ?? '',
|
|
53
|
+
handshakeId: getHeader(headers, SNYK_REQUEST_ID_HEADER),
|
|
54
|
+
});
|
|
55
|
+
exports.getHandshakeIdentityFromHeaders = getHandshakeIdentityFromHeaders;
|
|
44
56
|
const validateBrokerClientCredentials = async (headers, brokerConnectionIdentifier, isInternalJWT = false, brokerClientId) => {
|
|
45
57
|
const authHeader = getHeader(headers, AUTHORIZATION_HEADER);
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const role =
|
|
49
|
-
const requestId =
|
|
58
|
+
const identity = (0, exports.getHandshakeIdentityFromHeaders)(headers);
|
|
59
|
+
brokerClientId = brokerClientId ?? identity.brokerClientId;
|
|
60
|
+
const role = identity.role;
|
|
61
|
+
const requestId = identity.handshakeId ?? '';
|
|
50
62
|
const maskedToken = (0, token_1.maskToken)(brokerConnectionIdentifier);
|
|
51
63
|
logger_1.log.debug({ maskedToken, brokerClientId, requestId }, `Validating auth for connection ${brokerConnectionIdentifier} client Id ${brokerClientId}, role ${role}.`);
|
|
52
64
|
if (!authHeader ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authHelpers.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/server/auth/authHelpers.ts"],"names":[],"mappings":";;;AACA,uDAAuD;AACvD,oDAAqD;AACrD,iDAAqD;AAErD,gDAAsE;AAEtE,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAC7C,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAC/C,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AAC1D,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAC9D,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;AAEjD,SAAS,SAAS,CAChB,OAA4B,EAC5B,UAAkB;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACzB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;KAClB;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CACpB,aAAsB;IAEtB,IAAI,aAAa;QAAE,OAAO,EAAE,CAAC;IAE7B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAC5D,IAAI,aAAa,EAAE;QACjB,OAAO;YACL,CAAC,aAAa,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;SAC3D,CAAC;KACH;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,MAAM,cAAc,GAA2B;QAC7C,aAAa,EAAE,UAAU;QACzB,cAAc,EAAE,0BAA0B;KAC3C,CAAC;IAEF,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC1D,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC5D,IAAI,iBAAiB,EAAE;QACrB,cAAc,CAAC,iBAAiB,CAAC,GAAG,kBAAkB,IAAI,EAAE,CAAC;KAC9D;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;
|
|
1
|
+
{"version":3,"file":"authHelpers.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/server/auth/authHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ const authRefreshHandler = async (req, res) => {
|
|
|
17
17
|
const brokerClientId = body.data.attributes.broker_client_id;
|
|
18
18
|
const connection = (0, socket_1.getSocketConnectionByIdentifier)(identifier);
|
|
19
19
|
currentClient = connection
|
|
20
|
-
?
|
|
20
|
+
? (0, socket_1.findClientToRefreshCreds)(connection, brokerClientId, role)
|
|
21
21
|
: null;
|
|
22
22
|
if (brokerAppClientId === undefined || !connection || !currentClient) {
|
|
23
23
|
logger_1.log.debug({ identifier, brokerClientId, role }, 'Missing required authorization header.');
|
|
@@ -25,14 +25,8 @@ const authRefreshHandler = async (req, res) => {
|
|
|
25
25
|
}
|
|
26
26
|
// deepcode ignore Ssrf: request URL comes from the filter response, with the origin url being injected by the filtered version
|
|
27
27
|
await (0, authHelpers_1.validateBrokerClientCredentials)(req.headers, identifier, true, brokerClientId);
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
currentClient.credsValidationTime = nowDate;
|
|
31
|
-
const currentClientIndex = connection.findIndex((x) => x.brokerClientId === brokerClientId && x.role === role);
|
|
32
|
-
if (currentClientIndex === -1) {
|
|
33
|
-
throw new Error('Unable to find client connection.');
|
|
34
|
-
}
|
|
35
|
-
connection[currentClientIndex] = currentClient;
|
|
28
|
+
// Update the live pool entry directly so a pending reconnect is not replaced.
|
|
29
|
+
currentClient.credsValidationTime = new Date().toISOString();
|
|
36
30
|
return res.status(201).send('OK');
|
|
37
31
|
}
|
|
38
32
|
catch (err) {
|
|
@@ -40,10 +34,8 @@ const authRefreshHandler = async (req, res) => {
|
|
|
40
34
|
if (err instanceof authHelpers_1.BrokerAuthError) {
|
|
41
35
|
return res.status(401).type('txt').send(err.message);
|
|
42
36
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
.type('txt')
|
|
46
|
-
.send(`Unable to complete auth refresh: ${err}.`);
|
|
37
|
+
logger_1.log.error({ err }, 'Unable to complete auth refresh.');
|
|
38
|
+
return res.status(500).type('txt').send('Unable to complete auth refresh.');
|
|
47
39
|
}
|
|
48
40
|
};
|
|
49
41
|
exports.authRefreshHandler = authRefreshHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authHandlers.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/server/routesHandlers/authHandlers.ts"],"names":[],"mappings":";;;AACA,qDAG6B;AAC7B,iDAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"authHandlers.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/server/routesHandlers/authHandlers.ts"],"names":[],"mappings":";;;AACA,qDAG6B;AAC7B,iDAAqD;AACrD,sCAImB;AACnB,oDAAqD;AAY9C,MAAM,kBAAkB,GAAG,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACtE,IAAI,aAA8C,CAAC;IACnD,IAAI;QACF,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC1C,MAAM,iBAAiB,GACrB,GAAG,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,CAAC;YACjE,eAAe,CAAC;QAClB,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;QACzC,YAAM,CAAC,KAAK,CACV,EAAE,WAAW,EAAE,IAAA,iBAAS,EAAC,UAAU,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAC/D,cAAc,CACf,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAgC,CAAC;QAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAE7D,MAAM,UAAU,GAAG,IAAA,wCAA+B,EAAC,UAAU,CAAC,CAAC;QAC/D,aAAa,GAAG,UAAU;YACxB,CAAC,CAAC,IAAA,iCAAwB,EAAC,UAAU,EAAE,cAAc,EAAE,IAAI,CAAC;YAC5D,CAAC,CAAC,IAAI,CAAC;QAET,IAAI,iBAAiB,KAAK,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,aAAa,EAAE;YACpE,YAAM,CAAC,KAAK,CACV,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,EACpC,wCAAwC,CACzC,CAAC;YACF,MAAM,IAAI,6BAAe,CAAC,wCAAwC,CAAC,CAAC;SACrE;QAED,+HAA+H;QAC/H,MAAM,IAAA,6CAA+B,EACnC,GAAG,CAAC,OAAO,EACX,UAAU,EACV,IAAI,EACJ,cAAc,CACf,CAAC;QACF,8EAA8E;QAC9E,aAAa,CAAC,mBAAmB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7D,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACnC;IAAC,OAAO,GAAG,EAAE;QACZ,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC7B,IAAI,GAAG,YAAY,6BAAe,EAAE;YAClC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SACtD;QACD,YAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;KAC7E;AACH,CAAC,CAAC;AA/CW,QAAA,kBAAkB,sBA+C7B"}
|
|
@@ -10,6 +10,49 @@ const node_url_1 = require("node:url");
|
|
|
10
10
|
const request_1 = require("../../http/request");
|
|
11
11
|
const exponential_backoff_1 = require("../../http/exponential-backoff");
|
|
12
12
|
const CONNECTION_READY_MAX_RETRIES = 4;
|
|
13
|
+
const CONNECTION_HANDSHAKE_TTL_MS = Number(process.env.BROKER_CONNECTION_HANDSHAKE_TTL_MS ?? 30000);
|
|
14
|
+
const isReady = (client) => Boolean(client.socket && client.metadata?.version && client.metadata?.capabilities);
|
|
15
|
+
/**
|
|
16
|
+
* Drops authorization placeholders that never completed the identify handshake.
|
|
17
|
+
* Ready connections and legacy entries without a handshake timestamp are kept.
|
|
18
|
+
*/
|
|
19
|
+
const removeExpiredPendingHandshakes = (connections, token, now = Date.now()) => {
|
|
20
|
+
const activePool = (connections.get(token) ?? []).filter((client) => {
|
|
21
|
+
if (isReady(client)) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
// Only authorize-only entries are pending. An identified socket with
|
|
25
|
+
// incomplete metadata must remain tracked and follow the bad-metadata path.
|
|
26
|
+
if (client.socket ||
|
|
27
|
+
client.metadata ||
|
|
28
|
+
client.handshakeStartTime === undefined) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return now - client.handshakeStartTime < CONNECTION_HANDSHAKE_TTL_MS;
|
|
32
|
+
});
|
|
33
|
+
if (activePool.length > 0) {
|
|
34
|
+
connections.set(token, activePool);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
connections.delete(token);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const findReadyConnection = (connections, token) => {
|
|
41
|
+
removeExpiredPendingHandshakes(connections, token);
|
|
42
|
+
const pool = connections.get(token) ?? [];
|
|
43
|
+
if (pool.length === 0) {
|
|
44
|
+
return { status: 'no-connection' };
|
|
45
|
+
}
|
|
46
|
+
const ready = pool.find(isReady);
|
|
47
|
+
if (ready) {
|
|
48
|
+
return { status: 'ready', client: ready };
|
|
49
|
+
}
|
|
50
|
+
if (pool.some((client) => !client.socket || !client.metadata)) {
|
|
51
|
+
// Still completing the handshake. Throwing asks retry() for another attempt.
|
|
52
|
+
throw new Error('client handshake in progress');
|
|
53
|
+
}
|
|
54
|
+
return { status: 'bad-metadata' };
|
|
55
|
+
};
|
|
13
56
|
const overloadHttpRequestWithConnectionDetailsMiddleware = async (req, res, next) => {
|
|
14
57
|
const connections = (0, socket_1.getSocketConnections)();
|
|
15
58
|
const token = req.params.token;
|
|
@@ -61,33 +104,12 @@ const overloadHttpRequestWithConnectionDetailsMiddleware = async (req, res, next
|
|
|
61
104
|
return res.status(404).json({ ok: false });
|
|
62
105
|
}
|
|
63
106
|
}
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
//
|
|
67
|
-
|
|
68
|
-
logger_1.log.warn({ desensitizedToken, requestId }, 'No connection in pool found.');
|
|
69
|
-
res.setHeader('x-broker-failure', 'no-connection');
|
|
70
|
-
return res.status(404).json({ ok: false });
|
|
71
|
-
}
|
|
72
|
-
const isReady = (c) => Boolean(c.socket && c.metadata?.version && c.metadata?.capabilities);
|
|
73
|
-
// The pool is newest-first, so find() returns the newest fully-ready
|
|
74
|
-
// connection. This keeps HA clients immune to reconnect churn, which will
|
|
75
|
-
// briefly create a not-yet-ready connection. If none is ready yet but a connection is still
|
|
76
|
-
// completing its handshake, retry with exponential backoff. A permanently-incomplete pool
|
|
77
|
-
// won't become ready, so return without retrying.
|
|
78
|
-
let client;
|
|
107
|
+
// If no connection is ready yet but one is still completing its handshake,
|
|
108
|
+
// retry with exponential backoff. A permanently-incomplete pool won't become
|
|
109
|
+
// ready, so return without retrying.
|
|
110
|
+
let lookup;
|
|
79
111
|
try {
|
|
80
|
-
|
|
81
|
-
const pool = connections.get(token) ?? [];
|
|
82
|
-
const ready = pool.find(isReady);
|
|
83
|
-
if (ready) {
|
|
84
|
-
return ready;
|
|
85
|
-
}
|
|
86
|
-
if (pool.some((c) => !c.socket || !c.metadata)) {
|
|
87
|
-
throw new Error('client handshake in progress');
|
|
88
|
-
}
|
|
89
|
-
return undefined;
|
|
90
|
-
}, {
|
|
112
|
+
lookup = await (0, exponential_backoff_1.retry)(() => findReadyConnection(connections, token), {
|
|
91
113
|
retries: CONNECTION_READY_MAX_RETRIES,
|
|
92
114
|
operation: 'await-ready-broker-connection',
|
|
93
115
|
});
|
|
@@ -100,7 +122,14 @@ const overloadHttpRequestWithConnectionDetailsMiddleware = async (req, res, next
|
|
|
100
122
|
res.setHeader('Retry-After', '1');
|
|
101
123
|
return res.status(503).json({ ok: false });
|
|
102
124
|
}
|
|
103
|
-
if (
|
|
125
|
+
if (lookup.status === 'no-connection') {
|
|
126
|
+
// The pool was empty on entry, or every entry in it was an expired
|
|
127
|
+
// handshake and was pruned. Either way there is nothing to serve.
|
|
128
|
+
logger_1.log.warn({ desensitizedToken, requestId }, 'No connection in pool found.');
|
|
129
|
+
res.setHeader('x-broker-failure', 'no-connection');
|
|
130
|
+
return res.status(404).json({ ok: false });
|
|
131
|
+
}
|
|
132
|
+
if (lookup.status === 'bad-metadata') {
|
|
104
133
|
// Connections are present but missing required metadata (e.g. a legacy
|
|
105
134
|
// client that never sends capabilities) — permanent for this client, so keep
|
|
106
135
|
// the fast-fail 400 to avoid turning these into retry storms.
|
|
@@ -108,6 +137,7 @@ const overloadHttpRequestWithConnectionDetailsMiddleware = async (req, res, next
|
|
|
108
137
|
res.setHeader('x-broker-failure', 'bad-request');
|
|
109
138
|
return res.status(400).json({ ok: false });
|
|
110
139
|
}
|
|
140
|
+
const client = lookup.client;
|
|
111
141
|
res.locals.websocket = client.socket;
|
|
112
142
|
res.locals.socketVersion = client.socketVersion;
|
|
113
143
|
res.locals.capabilities = client.metadata.capabilities;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpRequestHandler.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/server/routesHandlers/httpRequestHandler.ts"],"names":[],"mappings":";;;AACA,iDAAqD;AACrD,0CAAsD;AACtD,sCAA+D;AAC/D,wDAAwE;AACxE,qCAAmC;AACnC,uCAAgD;AAEhD,gDAAsE;AACtE,wEAAuD;AAEvD,MAAM,4BAA4B,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"httpRequestHandler.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/server/routesHandlers/httpRequestHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.bindSocketToWebserver = exports.getSocketConnectionByIdentifier = exports.getSocketConnections = void 0;
|
|
6
|
+
exports.bindSocketToWebserver = exports.findClientToRefreshCreds = exports.addAuthorizedHandshake = exports.removePendingHandshake = exports.getSocketConnectionByIdentifier = exports.getSocketConnections = void 0;
|
|
7
7
|
const primus_1 = __importDefault(require("primus"));
|
|
8
8
|
const primus_emitter_1 = __importDefault(require("primus-emitter"));
|
|
9
9
|
const errorHandler_1 = require("./socketHandlers/errorHandler");
|
|
@@ -23,6 +23,70 @@ const getSocketConnectionByIdentifier = (identifier) => {
|
|
|
23
23
|
return socketConnections.get(identifier);
|
|
24
24
|
};
|
|
25
25
|
exports.getSocketConnectionByIdentifier = getSocketConnectionByIdentifier;
|
|
26
|
+
/**
|
|
27
|
+
* Removes the pending entry for a handshake that closed before identifying.
|
|
28
|
+
*
|
|
29
|
+
* The handshake id ensures an older connection cannot remove a newer reconnect.
|
|
30
|
+
* If the client did not send enough identity headers, the entry is left for the
|
|
31
|
+
* TTL cleanup.
|
|
32
|
+
*
|
|
33
|
+
* Returns true if an entry was removed.
|
|
34
|
+
*/
|
|
35
|
+
const removePendingHandshake = (identifier, { brokerClientId, role, handshakeId }) => {
|
|
36
|
+
if (!brokerClientId || !handshakeId) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const clientPool = socketConnections.get(identifier);
|
|
40
|
+
if (!clientPool) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const pendingIndex = clientPool.findIndex((client) => !client.socket &&
|
|
44
|
+
client.handshakeId === handshakeId &&
|
|
45
|
+
client.brokerClientId === brokerClientId &&
|
|
46
|
+
client.role === role);
|
|
47
|
+
if (pendingIndex < 0) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
clientPool.splice(pendingIndex, 1);
|
|
51
|
+
if (clientPool.length === 0) {
|
|
52
|
+
socketConnections.delete(identifier);
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
};
|
|
56
|
+
exports.removePendingHandshake = removePendingHandshake;
|
|
57
|
+
/**
|
|
58
|
+
* Adds a handshake to the connection pool after it has been authorized.
|
|
59
|
+
*
|
|
60
|
+
* A reconnect stays separate from the existing live connection, so closing the
|
|
61
|
+
* old socket cannot remove the new handshake. If there is already a pending
|
|
62
|
+
* handshake for the same client and role, the newer attempt replaces it.
|
|
63
|
+
*/
|
|
64
|
+
const addAuthorizedHandshake = (identifier, currentClient) => {
|
|
65
|
+
const clientPool = socketConnections.get(identifier) ?? [];
|
|
66
|
+
const pendingHandshakeIndex = clientPool.findIndex((client) => !client.socket &&
|
|
67
|
+
client.brokerClientId === currentClient.brokerClientId &&
|
|
68
|
+
client.role === currentClient.role);
|
|
69
|
+
if (pendingHandshakeIndex < 0) {
|
|
70
|
+
// Keep an identified connection separate from its reconnect attempt.
|
|
71
|
+
// If the old socket closes first, the new handshake must remain seated.
|
|
72
|
+
clientPool.unshift(currentClient);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
clientPool[pendingHandshakeIndex] = currentClient;
|
|
76
|
+
}
|
|
77
|
+
socketConnections.set(identifier, clientPool);
|
|
78
|
+
};
|
|
79
|
+
exports.addAuthorizedHandshake = addAuthorizedHandshake;
|
|
80
|
+
/**
|
|
81
|
+
* Finds the connection to update after an auth refresh.
|
|
82
|
+
* Prefers the live connection when a reconnect is also pending, so the active
|
|
83
|
+
* socket does not get disconnected for using stale credentials.
|
|
84
|
+
*/
|
|
85
|
+
const findClientToRefreshCreds = (clientPool, brokerClientId, role) => {
|
|
86
|
+
const matches = clientPool.filter((client) => client.brokerClientId === brokerClientId && client.role === role);
|
|
87
|
+
return matches.find((client) => client.socket) ?? matches[0];
|
|
88
|
+
};
|
|
89
|
+
exports.findClientToRefreshCreds = findClientToRefreshCreds;
|
|
26
90
|
const socket = ({ server, loadedServerOpts }) => {
|
|
27
91
|
const ioConfig = {
|
|
28
92
|
transformer: 'engine.io',
|
|
@@ -43,7 +107,10 @@ const socket = ({ server, loadedServerOpts }) => {
|
|
|
43
107
|
.toLowerCase();
|
|
44
108
|
// Primus authorize callbacks receive the raw HTTP upgrade request before
|
|
45
109
|
// the Express middleware chain runs, so req.requestId is not available here.
|
|
46
|
-
|
|
110
|
+
// The client sends a fresh snyk-request-id per connection attempt, so it
|
|
111
|
+
// also identifies this handshake when the socket later closes.
|
|
112
|
+
const { handshakeId } = (0, authHelpers_1.getHandshakeIdentityFromHeaders)(req.headers);
|
|
113
|
+
const requestId = handshakeId;
|
|
47
114
|
try {
|
|
48
115
|
const { brokerClientId, credentials, role } =
|
|
49
116
|
// deepcode ignore Ssrf: request URL comes from the filter response, with the origin url being injected by the filtered version
|
|
@@ -58,21 +125,10 @@ const socket = ({ server, loadedServerOpts }) => {
|
|
|
58
125
|
brokerAppClientId,
|
|
59
126
|
role: (role ?? client_1.Role.primary),
|
|
60
127
|
credsValidationTime: nowDate,
|
|
128
|
+
handshakeStartTime: Date.now(),
|
|
129
|
+
handshakeId,
|
|
61
130
|
};
|
|
62
|
-
|
|
63
|
-
const clientPool = connections.get(connectionIdentifier) || [];
|
|
64
|
-
const currentClientIndex = clientPool.findIndex((x) => x.brokerClientId === currentClient.brokerClientId &&
|
|
65
|
-
x.role === currentClient.role);
|
|
66
|
-
if (currentClientIndex < 0) {
|
|
67
|
-
clientPool.unshift(currentClient);
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
clientPool[currentClientIndex] = {
|
|
71
|
-
...clientPool[currentClientIndex],
|
|
72
|
-
...currentClient,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
connections.set(connectionIdentifier, clientPool);
|
|
131
|
+
(0, exports.addAuthorizedHandshake)(connectionIdentifier, currentClient);
|
|
76
132
|
}
|
|
77
133
|
catch (err) {
|
|
78
134
|
if (err instanceof authHelpers_1.BrokerAuthError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../lib/hybrid-sdk/server/socket.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,oEAAqC;AAGrC,gEAA8D;AAC9D,0EAA4E;AAC5E,gEAAsE;AACtE,8CAAkD;AAClD,iDAAkD;AAClD,
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../lib/hybrid-sdk/server/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ const metrics_1 = require("../../common/utils/metrics");
|
|
|
5
5
|
const logger_1 = require("../../../logs/logger");
|
|
6
6
|
const dispatcher_1 = require("../infra/dispatcher");
|
|
7
7
|
const socket_1 = require("../socket");
|
|
8
|
+
const authHelpers_1 = require("../auth/authHelpers");
|
|
8
9
|
const token_1 = require("../utils/token");
|
|
9
10
|
const identifyHandler_1 = require("./identifyHandler");
|
|
10
11
|
const handleConnectionCloseOnSocket = (closeReason, socket, token, clientId, identified) => {
|
|
@@ -30,12 +31,18 @@ const handleConnectionCloseOnSocket = (closeReason, socket, token, clientId, ide
|
|
|
30
31
|
connections.delete(token);
|
|
31
32
|
}
|
|
32
33
|
(0, metrics_1.decrementSocketConnectionGauge)();
|
|
34
|
+
(0, identifyHandler_1.rmClientIdFromTerminationMap)(token, clientId);
|
|
35
|
+
setImmediate(async () => await (0, dispatcher_1.clientDisconnected)(token, clientId));
|
|
33
36
|
}
|
|
34
37
|
else {
|
|
35
|
-
|
|
38
|
+
// No pool entry references this socket, because the socket is only
|
|
39
|
+
// attached by identify. The authorize hook still seated an entry for this
|
|
40
|
+
// handshake, and nothing else removes it. Without this the entry remains
|
|
41
|
+
// until an inbound request prunes it by handshake TTL.
|
|
42
|
+
const identity = (0, authHelpers_1.getHandshakeIdentityFromHeaders)(socket.request.headers);
|
|
43
|
+
const removed = (0, socket_1.removePendingHandshake)(token, identity);
|
|
44
|
+
logger_1.log.warn({ maskedToken, hashedToken, ...identity, removed }, 'Client disconnected before identifying itself.');
|
|
36
45
|
}
|
|
37
|
-
(0, identifyHandler_1.rmClientIdFromTerminationMap)(token, clientId);
|
|
38
|
-
setImmediate(async () => await (0, dispatcher_1.clientDisconnected)(token, clientId));
|
|
39
46
|
}
|
|
40
47
|
};
|
|
41
48
|
exports.handleConnectionCloseOnSocket = handleConnectionCloseOnSocket;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeHandler.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/server/socketHandlers/closeHandler.ts"],"names":[],"mappings":";;;AAAA,wDAA4E;AAC5E,iDAAqD;AACrD,oDAAyD;AACzD,
|
|
1
|
+
{"version":3,"file":"closeHandler.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/server/socketHandlers/closeHandler.ts"],"names":[],"mappings":";;;AAAA,wDAA4E;AAC5E,iDAAqD;AACrD,oDAAyD;AACzD,sCAAyE;AACzE,qDAAsE;AACtE,0CAAsD;AACtD,uDAAiE;AAG1D,MAAM,6BAA6B,GAAG,CAC3C,WAAmB,EACnB,MAAc,EACd,KAAyB,EACzB,QAAgB,EAChB,UAAmB,EACnB,EAAE;IACF,IAAI,KAAK,EAAE;QACT,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,IAAA,4BAAoB,EAAC,KAAK,CAAC,CAAC;QACjE,IAAI,UAAU,EAAE;YACd,MAAM,WAAW,GAAG,IAAA,6BAAoB,GAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,WAAW;iBAC3B,GAAG,CAAC,KAAK,CAAC;gBACX,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YACvC,MAAM,kBAAkB,GACtB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;YACvD,YAAM,CAAC,IAAI,CACT;gBACE,WAAW;gBACX,WAAW;gBACX,WAAW;gBACX,yBAAyB,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;aACnD,EACD,2BAA2B,CAC5B,CAAC;YACF,IAAI,kBAAkB,EAAE,MAAM,EAAE;gBAC9B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;aAC5C;iBAAM;gBACL,YAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,kBAAkB,CAAC,CAAC;gBAC9D,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC3B;YACD,IAAA,wCAA8B,GAAE,CAAC;YACjC,IAAA,8CAA4B,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC9C,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,IAAA,+BAAkB,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;SACrE;aAAM;YACL,mEAAmE;YACnE,0EAA0E;YAC1E,yEAAyE;YACzE,uDAAuD;YACvD,MAAM,QAAQ,GAAG,IAAA,6CAA+B,EAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzE,MAAM,OAAO,GAAG,IAAA,+BAAsB,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxD,YAAM,CAAC,IAAI,CACT,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,EAClD,gDAAgD,CACjD,CAAC;SACH;KACF;AACH,CAAC,CAAC;AA/CW,QAAA,6BAA6B,iCA+CxC"}
|
|
@@ -23,7 +23,15 @@ const handleSocketConnection = (socket) => {
|
|
|
23
23
|
clientId = clientData.metadata.clientId;
|
|
24
24
|
identified = (0, identifyHandler_1.handleIdentifyOnSocket)(clientData, socket, token);
|
|
25
25
|
});
|
|
26
|
+
// Primus can emit more than one terminal event for the same socket. Treat
|
|
27
|
+
// teardown as one lifecycle transition so metrics, dispatcher calls and pool
|
|
28
|
+
// cleanup happen exactly once.
|
|
29
|
+
let terminalEventHandled = false;
|
|
26
30
|
['close', 'end', 'disconnection', 'destroy', 'timeout'].forEach((e) => socket.on(e, () => {
|
|
31
|
+
if (terminalEventHandled) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
terminalEventHandled = true;
|
|
27
35
|
(0, metrics_1.incrementSocketCloseReasonCount)(e);
|
|
28
36
|
(0, closeHandler_1.handleConnectionCloseOnSocket)(e, socket, token, clientId, identified);
|
|
29
37
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectionHandler.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/server/socketHandlers/connectionHandler.ts"],"names":[],"mappings":";;;AAAA,iDAAqD;AACrD,0CAAsD;AACtD,uDAA2D;AAC3D,iDAA+D;AAC/D,iDAAmD;AACnD,yDAAqE;AACrE,oDAAgE;AAChE,wDAA6E;AAGtE,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE;IACvD,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ;SACtC,UAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC;SACxC,WAAW,EAAE,CAAC;IAEjB,MAAM,iBAAiB,GAAG,IAAA,4BAAoB,EAAC,KAAK,CAAC,CAAC;IACtD,YAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,EAAE,EAAE,wBAAwB,CAAC,CAAC;IAE7D,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAEpE,yDAAyD;IACzD,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE;QACnC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxC,UAAU,GAAG,IAAA,wCAAsB,EAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACpE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE;QAChB,IAAA,yCAA+B,EAAC,CAAC,CAAC,CAAC;QACnC,IAAA,4CAA6B,EAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAS,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;QAC9B,YAAM,CAAC,IAAI,CACT;YACE,WAAW,EAAE,IAAA,iBAAS,EAAC,KAAK,CAAC;YAC7B,WAAW,EAAE,IAAA,iBAAS,EAAC,KAAK,CAAC;YAC7B,QAAQ;YACR,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,EACD,oCAAoC,CACrC,CAAC;QACF,IAAA,kDAA+B,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,gCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"connectionHandler.js","sourceRoot":"","sources":["../../../../../lib/hybrid-sdk/server/socketHandlers/connectionHandler.ts"],"names":[],"mappings":";;;AAAA,iDAAqD;AACrD,0CAAsD;AACtD,uDAA2D;AAC3D,iDAA+D;AAC/D,iDAAmD;AACnD,yDAAqE;AACrE,oDAAgE;AAChE,wDAA6E;AAGtE,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE;IACvD,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ;SACtC,UAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC;SACxC,WAAW,EAAE,CAAC;IAEjB,MAAM,iBAAiB,GAAG,IAAA,4BAAoB,EAAC,KAAK,CAAC,CAAC;IACtD,YAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,EAAE,EAAE,wBAAwB,CAAC,CAAC;IAE7D,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAEpE,yDAAyD;IACzD,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE;QACnC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxC,UAAU,GAAG,IAAA,wCAAsB,EAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,6EAA6E;IAC7E,+BAA+B;IAC/B,IAAI,oBAAoB,GAAG,KAAK,CAAC;IACjC,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACpE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE;QAChB,IAAI,oBAAoB,EAAE;YACxB,OAAO;SACR;QACD,oBAAoB,GAAG,IAAI,CAAC;QAC5B,IAAA,yCAA+B,EAAC,CAAC,CAAC,CAAC;QACnC,IAAA,4CAA6B,EAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAS,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;QAC9B,YAAM,CAAC,IAAI,CACT;YACE,WAAW,EAAE,IAAA,iBAAS,EAAC,KAAK,CAAC;YAC7B,WAAW,EAAE,IAAA,iBAAS,EAAC,KAAK,CAAC;YAC7B,QAAQ;YACR,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,EACD,oCAAoC,CACrC,CAAC;QACF,IAAA,kDAA+B,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,gCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC;AAhDW,QAAA,sBAAsB,0BAgDjC"}
|
package/dist/package.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"prepare:templates": "rm -rf ./dist/client-templates && cp -Rf ./client-templates ./dist",
|
|
16
16
|
"start": "node .",
|
|
17
17
|
"dev": "tsc-watch --project tsconfig.json --onSuccess 'node .' | ./node_modules/.bin/bunyan",
|
|
18
|
-
"dev:client": "
|
|
18
|
+
"dev:client": "NODE_ENV=development tsc-watch --project tsconfig.json --onSuccess 'node --env-file-if-exists=.env dist/cli/index.js client' | ./node_modules/.bin/bunyan",
|
|
19
19
|
"dev:client-to-local-server": "BROKER_SERVER_URL=http://localhost:9000 USE_LOCAL_BACKEND='true' LOG_LEVEL=debug PORT=9001 NODE_ENV=development tsc-watch --project tsconfig.json --onSuccess 'node dist/cli/index.js client' | ./node_modules/.bin/bunyan",
|
|
20
20
|
"dev:client2-to-local-server": "BROKER_SERVER_URL=http://localhost:9000 USE_LOCAL_BACKEND='true' LOG_LEVEL=debug PORT=9002 NODE_ENV=development tsc-watch --project tsconfig.json --onSuccess 'node dist/cli/index.js client' | ./node_modules/.bin/bunyan",
|
|
21
21
|
"dev:server": "LOG_LEVEL=debug PORT=9000 ACCEPT=accept-server.local.json NODE_ENV=development tsc-watch --project tsconfig.json --onSuccess 'node dist/cli/index.js server' | ./node_modules/.bin/bunyan",
|