@socketsecurity/cli-with-sentry 1.1.99 → 1.1.101
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 +10 -0
- package/dist/constants.js +4 -4
- package/dist/constants.js.map +1 -1
- package/dist/tsconfig.dts.tsbuildinfo +1 -1
- package/dist/types/utils/dlx.d.mts +6 -0
- package/dist/types/utils/dlx.d.mts.map +1 -1
- package/dist/utils.js +215 -43
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
|
@@ -26,6 +26,12 @@ export type CoanaDlxOptions = DlxOptions & {
|
|
|
26
26
|
*
|
|
27
27
|
* If SOCKET_CLI_COANA_LOCAL_PATH environment variable is set, uses the local
|
|
28
28
|
* Coana CLI at that path instead of downloading from npm.
|
|
29
|
+
*
|
|
30
|
+
* If the dlx path fails (e.g. broken `npx` on the host), falls back to
|
|
31
|
+
* `npm install`-ing @coana-tech/cli into a temp directory and invoking it
|
|
32
|
+
* directly via `node`. The fallback can be disabled with
|
|
33
|
+
* SOCKET_CLI_COANA_DISABLE_NPM_FALLBACK or forced as the primary path with
|
|
34
|
+
* SOCKET_CLI_COANA_FORCE_NPM_INSTALL.
|
|
29
35
|
*/
|
|
30
36
|
export declare function spawnCoanaDlx(args: string[] | readonly string[], orgSlug?: string, options?: CoanaDlxOptions | undefined, spawnExtra?: SpawnExtra | undefined): Promise<CResult<string>>;
|
|
31
37
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dlx.d.mts","sourceRoot":"","sources":["../../../src/utils/dlx.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dlx.d.mts","sourceRoot":"","sources":["../../../src/utils/dlx.mts"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAMpE,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG;IAC1C,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC3C,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAQD;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,cAAc,EAC3B,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,EAClC,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,GAClC,OAAO,CAAC,eAAe,CAAC,CAwG1B;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG;IACzC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAClC,CAAA;AAkJD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,EAClC,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,EACrC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,GAClC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAuI1B;AAsED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,EAClC,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,GAClC,OAAO,CAAC,eAAe,CAAC,CAU1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,EAClC,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,EAChC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,GAClC,OAAO,CAAC,eAAe,CAAC,CAU1B"}
|
package/dist/utils.js
CHANGED
|
@@ -22,6 +22,7 @@ var promises$1 = require('node:stream/promises');
|
|
|
22
22
|
var node_zlib = require('node:zlib');
|
|
23
23
|
var fs$1 = require('../external/@socketsecurity/registry/lib/fs');
|
|
24
24
|
var require$$5 = require('node:module');
|
|
25
|
+
var os = require('node:os');
|
|
25
26
|
var require$$3 = require('node:https');
|
|
26
27
|
var web = require('node:stream/web');
|
|
27
28
|
var require$$13 = require('../external/@socketsecurity/registry/lib/url');
|
|
@@ -34,7 +35,6 @@ var streams = require('../external/@socketsecurity/registry/lib/streams');
|
|
|
34
35
|
var promises = require('node:timers/promises');
|
|
35
36
|
var require$$1 = require('node:util');
|
|
36
37
|
var node_tls = require('node:tls');
|
|
37
|
-
var os = require('node:os');
|
|
38
38
|
var process$1 = require('node:process');
|
|
39
39
|
var require$$0 = require('node:crypto');
|
|
40
40
|
|
|
@@ -5246,6 +5246,102 @@ async function spawnDlx(packageSpec, args, options, spawnExtra) {
|
|
|
5246
5246
|
return await shadowNpxBin(spawnArgs, finalShadowOptions, spawnExtra);
|
|
5247
5247
|
}
|
|
5248
5248
|
}
|
|
5249
|
+
/**
|
|
5250
|
+
* Cache of resolved Coana CLI script paths from the npm-install fallback,
|
|
5251
|
+
* keyed by version string. Lives for the lifetime of the Socket CLI process so
|
|
5252
|
+
* repeated invocations (e.g. socket fix --pr looping per GHSA) only install
|
|
5253
|
+
* once.
|
|
5254
|
+
*/
|
|
5255
|
+
const installedCoanaScriptPathsByVersion = new Map();
|
|
5256
|
+
|
|
5257
|
+
/**
|
|
5258
|
+
* Spawn an installed Coana entry point via `node` (or directly, if it's a
|
|
5259
|
+
* native binary). Shared by the SOCKET_CLI_COANA_LOCAL_PATH branch and the
|
|
5260
|
+
* npm-install fallback.
|
|
5261
|
+
*/
|
|
5262
|
+
async function spawnCoanaScriptViaNode(scriptPath, args, finalEnv, options, spawnExtra) {
|
|
5263
|
+
const isBinary = !scriptPath.endsWith('.js') && !scriptPath.endsWith('.mjs');
|
|
5264
|
+
const spawnArgs = isBinary ? args : [scriptPath, ...args];
|
|
5265
|
+
const spawnResult = await spawn.spawn(isBinary ? scriptPath : 'node', spawnArgs, {
|
|
5266
|
+
cwd: options.cwd,
|
|
5267
|
+
env: finalEnv,
|
|
5268
|
+
stdio: spawnExtra?.['stdio'] || 'inherit'
|
|
5269
|
+
});
|
|
5270
|
+
return {
|
|
5271
|
+
ok: true,
|
|
5272
|
+
data: spawnResult.stdout
|
|
5273
|
+
};
|
|
5274
|
+
}
|
|
5275
|
+
|
|
5276
|
+
/**
|
|
5277
|
+
* Resolve the executable JS file inside an installed @coana-tech/cli package
|
|
5278
|
+
* by reading its package.json `bin` field. Returns an absolute path suitable
|
|
5279
|
+
* for passing to `node`.
|
|
5280
|
+
*/
|
|
5281
|
+
async function resolveCoanaBinFromInstallDir(installDir) {
|
|
5282
|
+
const packageJsonPath = path.join(installDir, 'node_modules', '@coana-tech', 'cli', 'package.json');
|
|
5283
|
+
const pkg = JSON.parse(await fs.promises.readFile(packageJsonPath, 'utf8'));
|
|
5284
|
+
const {
|
|
5285
|
+
bin
|
|
5286
|
+
} = pkg;
|
|
5287
|
+
let relativeBin;
|
|
5288
|
+
if (typeof bin === 'string') {
|
|
5289
|
+
relativeBin = bin;
|
|
5290
|
+
} else if (bin && typeof bin === 'object') {
|
|
5291
|
+
// Prefer an entry named "coana" if present; otherwise take the first.
|
|
5292
|
+
relativeBin = bin['coana'] ?? Object.values(bin)[0];
|
|
5293
|
+
}
|
|
5294
|
+
if (!relativeBin) {
|
|
5295
|
+
throw new Error(`@coana-tech/cli package.json at ${packageJsonPath} is missing a usable bin entry`);
|
|
5296
|
+
}
|
|
5297
|
+
return path.resolve(path.dirname(packageJsonPath), relativeBin);
|
|
5298
|
+
}
|
|
5299
|
+
|
|
5300
|
+
/**
|
|
5301
|
+
* Install @coana-tech/cli into a fresh temp directory via `npm install` and
|
|
5302
|
+
* return its executable JS path. Caches the result per version for the
|
|
5303
|
+
* lifetime of the process.
|
|
5304
|
+
*/
|
|
5305
|
+
async function installCoanaToTmpdir(version, finalEnv) {
|
|
5306
|
+
const cached = installedCoanaScriptPathsByVersion.get(version);
|
|
5307
|
+
if (cached) {
|
|
5308
|
+
return cached;
|
|
5309
|
+
}
|
|
5310
|
+
const installDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'socket-coana-'));
|
|
5311
|
+
await spawn.spawn('npm', ['install', '--no-save', '--no-package-lock', '--no-audit', '--no-fund', '--prefix', installDir, `@coana-tech/cli@${version}`], {
|
|
5312
|
+
env: finalEnv,
|
|
5313
|
+
stdio: 'inherit'
|
|
5314
|
+
});
|
|
5315
|
+
const scriptPath = await resolveCoanaBinFromInstallDir(installDir);
|
|
5316
|
+
installedCoanaScriptPathsByVersion.set(version, scriptPath);
|
|
5317
|
+
return scriptPath;
|
|
5318
|
+
}
|
|
5319
|
+
|
|
5320
|
+
/**
|
|
5321
|
+
* Fallback path used when the dlx (npx / pnpm dlx / yarn dlx) invocation
|
|
5322
|
+
* fails. Installs @coana-tech/cli into a temp directory via `npm install`
|
|
5323
|
+
* and spawns it directly via `node`.
|
|
5324
|
+
*/
|
|
5325
|
+
async function spawnCoanaViaNpmInstall(args, version, finalEnv, options, spawnExtra) {
|
|
5326
|
+
let scriptPath;
|
|
5327
|
+
try {
|
|
5328
|
+
scriptPath = await installCoanaToTmpdir(version, finalEnv);
|
|
5329
|
+
} catch (e) {
|
|
5330
|
+
const stderr = e?.stderr;
|
|
5331
|
+
const cause = getErrorCause(e);
|
|
5332
|
+
return {
|
|
5333
|
+
ok: false,
|
|
5334
|
+
data: e,
|
|
5335
|
+
message: `npm install fallback failed: ${stderr || cause}`
|
|
5336
|
+
};
|
|
5337
|
+
}
|
|
5338
|
+
try {
|
|
5339
|
+
return await spawnCoanaScriptViaNode(scriptPath, args, finalEnv, options, spawnExtra);
|
|
5340
|
+
} catch (e) {
|
|
5341
|
+
return buildDlxErrorResult(e);
|
|
5342
|
+
}
|
|
5343
|
+
}
|
|
5344
|
+
|
|
5249
5345
|
/**
|
|
5250
5346
|
* Helper to spawn coana with dlx.
|
|
5251
5347
|
* Automatically uses force and silent when version is not pinned exactly.
|
|
@@ -5253,6 +5349,12 @@ async function spawnDlx(packageSpec, args, options, spawnExtra) {
|
|
|
5253
5349
|
*
|
|
5254
5350
|
* If SOCKET_CLI_COANA_LOCAL_PATH environment variable is set, uses the local
|
|
5255
5351
|
* Coana CLI at that path instead of downloading from npm.
|
|
5352
|
+
*
|
|
5353
|
+
* If the dlx path fails (e.g. broken `npx` on the host), falls back to
|
|
5354
|
+
* `npm install`-ing @coana-tech/cli into a temp directory and invoking it
|
|
5355
|
+
* directly via `node`. The fallback can be disabled with
|
|
5356
|
+
* SOCKET_CLI_COANA_DISABLE_NPM_FALLBACK or forced as the primary path with
|
|
5357
|
+
* SOCKET_CLI_COANA_FORCE_NPM_INSTALL.
|
|
5256
5358
|
*/
|
|
5257
5359
|
async function spawnCoanaDlx(args, orgSlug, options, spawnExtra) {
|
|
5258
5360
|
const {
|
|
@@ -5287,43 +5389,42 @@ async function spawnCoanaDlx(args, orgSlug, options, spawnExtra) {
|
|
|
5287
5389
|
if (proxyUrl) {
|
|
5288
5390
|
mixinsEnv['SOCKET_CLI_API_PROXY'] = proxyUrl;
|
|
5289
5391
|
}
|
|
5290
|
-
|
|
5291
|
-
|
|
5292
|
-
|
|
5293
|
-
|
|
5294
|
-
|
|
5295
|
-
|
|
5296
|
-
|
|
5297
|
-
|
|
5298
|
-
|
|
5299
|
-
|
|
5300
|
-
|
|
5301
|
-
|
|
5302
|
-
|
|
5303
|
-
|
|
5304
|
-
|
|
5305
|
-
|
|
5306
|
-
});
|
|
5307
|
-
return {
|
|
5308
|
-
ok: true,
|
|
5309
|
-
data: spawnResult.stdout
|
|
5310
|
-
};
|
|
5392
|
+
const finalEnv = {
|
|
5393
|
+
...process.env,
|
|
5394
|
+
...constants.default.processEnv,
|
|
5395
|
+
...mixinsEnv,
|
|
5396
|
+
...spawnEnv
|
|
5397
|
+
};
|
|
5398
|
+
const resolvedVersion = coanaVersion || constants.default.ENV.INLINED_SOCKET_CLI_COANA_TECH_CLI_VERSION;
|
|
5399
|
+
const localCoanaPath = process.env['SOCKET_CLI_COANA_LOCAL_PATH'];
|
|
5400
|
+
// Use local Coana CLI if path is provided.
|
|
5401
|
+
if (localCoanaPath) {
|
|
5402
|
+
try {
|
|
5403
|
+
return await spawnCoanaScriptViaNode(localCoanaPath, args, finalEnv, {
|
|
5404
|
+
cwd: dlxOptions.cwd
|
|
5405
|
+
}, spawnExtra);
|
|
5406
|
+
} catch (e) {
|
|
5407
|
+
return buildDlxErrorResult(e);
|
|
5311
5408
|
}
|
|
5409
|
+
}
|
|
5312
5410
|
|
|
5411
|
+
// Allow forcing the npm-install path for debugging or for environments
|
|
5412
|
+
// where dlx is known-broken.
|
|
5413
|
+
if (process.env['SOCKET_CLI_COANA_FORCE_NPM_INSTALL']) {
|
|
5414
|
+
return await spawnCoanaViaNpmInstall(args, resolvedVersion, finalEnv, {
|
|
5415
|
+
cwd: dlxOptions.cwd
|
|
5416
|
+
}, spawnExtra);
|
|
5417
|
+
}
|
|
5418
|
+
try {
|
|
5313
5419
|
// Use npm/dlx version.
|
|
5314
5420
|
const result = await spawnDlx({
|
|
5315
5421
|
name: '@coana-tech/cli',
|
|
5316
|
-
version:
|
|
5422
|
+
version: resolvedVersion
|
|
5317
5423
|
}, args, {
|
|
5318
5424
|
force: true,
|
|
5319
5425
|
silent: true,
|
|
5320
5426
|
...dlxOptions,
|
|
5321
|
-
env:
|
|
5322
|
-
...process.env,
|
|
5323
|
-
...constants.default.processEnv,
|
|
5324
|
-
...mixinsEnv,
|
|
5325
|
-
...spawnEnv
|
|
5326
|
-
},
|
|
5427
|
+
env: finalEnv,
|
|
5327
5428
|
ipc: {
|
|
5328
5429
|
[constants.default.SOCKET_CLI_SHADOW_ACCEPT_RISKS]: true,
|
|
5329
5430
|
[constants.default.SOCKET_CLI_SHADOW_API_TOKEN]: constants.default.SOCKET_PUBLIC_API_TOKEN,
|
|
@@ -5337,28 +5438,99 @@ async function spawnCoanaDlx(args, orgSlug, options, spawnExtra) {
|
|
|
5337
5438
|
data: output.stdout
|
|
5338
5439
|
};
|
|
5339
5440
|
} catch (e) {
|
|
5340
|
-
const
|
|
5341
|
-
|
|
5342
|
-
|
|
5343
|
-
const cause = getErrorCause(e);
|
|
5344
|
-
// Build a descriptive error message with exit code and signal details.
|
|
5345
|
-
const details = [];
|
|
5346
|
-
if (typeof exitCode === 'number') {
|
|
5347
|
-
details.push(`exit code ${exitCode}`);
|
|
5441
|
+
const dlxError = buildDlxErrorResult(e);
|
|
5442
|
+
if (process.env['SOCKET_CLI_COANA_DISABLE_NPM_FALLBACK']) {
|
|
5443
|
+
return dlxError;
|
|
5348
5444
|
}
|
|
5349
|
-
|
|
5350
|
-
|
|
5445
|
+
|
|
5446
|
+
// Only retry via `npm install` when the failure looks like the launcher
|
|
5447
|
+
// never got Coana running. A real Coana process that booted and exited
|
|
5448
|
+
// with an error would just hit the same failure on retry.
|
|
5449
|
+
if (!shouldFallbackOnDlxError(e)) {
|
|
5450
|
+
return dlxError;
|
|
5451
|
+
}
|
|
5452
|
+
logger.logger.warn('Coana dlx invocation failed before Coana started; falling back to `npm install` + `node`.');
|
|
5453
|
+
const fallbackResult = await spawnCoanaViaNpmInstall(args, resolvedVersion, finalEnv, {
|
|
5454
|
+
cwd: dlxOptions.cwd
|
|
5455
|
+
}, spawnExtra);
|
|
5456
|
+
if (fallbackResult.ok) {
|
|
5457
|
+
return fallbackResult;
|
|
5351
5458
|
}
|
|
5352
|
-
|
|
5353
|
-
const message = stderr ? `Coana command failed${detailSuffix}: ${stderr}` : `Coana command failed${detailSuffix}: ${cause}`;
|
|
5459
|
+
// Surface both errors so support has full context.
|
|
5354
5460
|
return {
|
|
5355
5461
|
ok: false,
|
|
5356
5462
|
data: e,
|
|
5357
|
-
message
|
|
5463
|
+
message: `${dlxError.message}. npm-install fallback also failed: ${fallbackResult.message}`
|
|
5358
5464
|
};
|
|
5359
5465
|
}
|
|
5360
5466
|
}
|
|
5361
5467
|
|
|
5468
|
+
/**
|
|
5469
|
+
* Decide whether a thrown dlx error should trigger the npm-install fallback.
|
|
5470
|
+
*
|
|
5471
|
+
* The goal is to retry only when the dlx launcher (npx / pnpm dlx / yarn dlx)
|
|
5472
|
+
* failed before Coana itself ran. If Coana actually booted, any subsequent
|
|
5473
|
+
* non-zero exit is a real Coana failure and retrying would hit the same one.
|
|
5474
|
+
*
|
|
5475
|
+
* Signals we use, in priority order:
|
|
5476
|
+
* 1. Captured stderr containing Coana's startup banner — definitive proof
|
|
5477
|
+
* Coana ran, so do NOT retry. Only available when the caller passed
|
|
5478
|
+
* `stdio: 'pipe'` (or the spawn defaulted to it).
|
|
5479
|
+
* 2. Spawn-level errors (`e.code` is a string like 'ENOENT'): the binary
|
|
5480
|
+
* wasn't found / couldn't start — retry.
|
|
5481
|
+
* 3. Signal kills (`e.signal` set, or numeric `e.code >= 128`): conventionally
|
|
5482
|
+
* not a clean exit; the customer-observed exit code 249 falls here. Retry.
|
|
5483
|
+
* 4. Small integer exit codes with no banner in captured stderr: ambiguous,
|
|
5484
|
+
* but Coana's own exit codes are small integers, so default to NOT retrying
|
|
5485
|
+
* rather than blindly re-running Coana.
|
|
5486
|
+
*/
|
|
5487
|
+
function shouldFallbackOnDlxError(e) {
|
|
5488
|
+
const capturedStderr = String(e?.stderr ?? '');
|
|
5489
|
+
if (capturedStderr && /Coana CLI version/i.test(capturedStderr)) {
|
|
5490
|
+
return false;
|
|
5491
|
+
}
|
|
5492
|
+
const code = e?.code;
|
|
5493
|
+
// Spawn-level failure (e.g. ENOENT when npx is missing from PATH).
|
|
5494
|
+
if (typeof code === 'string') {
|
|
5495
|
+
return true;
|
|
5496
|
+
}
|
|
5497
|
+
// Killed by signal — almost never a clean Coana exit.
|
|
5498
|
+
if (e?.signal) {
|
|
5499
|
+
return true;
|
|
5500
|
+
}
|
|
5501
|
+
// Exit codes >= 128 are conventionally signal-derived, and the observed
|
|
5502
|
+
// npx-launcher failures in the wild fall into this range (e.g. 249, 254).
|
|
5503
|
+
if (typeof code === 'number' && code >= 128) {
|
|
5504
|
+
return true;
|
|
5505
|
+
}
|
|
5506
|
+
return false;
|
|
5507
|
+
}
|
|
5508
|
+
|
|
5509
|
+
/**
|
|
5510
|
+
* Build a CResult error from a thrown spawn error, preserving exit code,
|
|
5511
|
+
* signal, and stderr context.
|
|
5512
|
+
*/
|
|
5513
|
+
function buildDlxErrorResult(e) {
|
|
5514
|
+
const stderr = e?.stderr;
|
|
5515
|
+
const exitCode = e?.code;
|
|
5516
|
+
const signal = e?.signal;
|
|
5517
|
+
const cause = getErrorCause(e);
|
|
5518
|
+
const details = [];
|
|
5519
|
+
if (typeof exitCode === 'number') {
|
|
5520
|
+
details.push(`exit code ${exitCode}`);
|
|
5521
|
+
}
|
|
5522
|
+
if (signal) {
|
|
5523
|
+
details.push(`signal ${signal}`);
|
|
5524
|
+
}
|
|
5525
|
+
const detailSuffix = details.length ? ` (${details.join(', ')})` : '';
|
|
5526
|
+
const message = stderr ? `Coana command failed${detailSuffix}: ${stderr}` : `Coana command failed${detailSuffix}: ${cause}`;
|
|
5527
|
+
return {
|
|
5528
|
+
ok: false,
|
|
5529
|
+
data: e,
|
|
5530
|
+
message
|
|
5531
|
+
};
|
|
5532
|
+
}
|
|
5533
|
+
|
|
5362
5534
|
/**
|
|
5363
5535
|
* Helper to spawn cdxgen with dlx.
|
|
5364
5536
|
*/
|
|
@@ -8053,5 +8225,5 @@ exports.updateConfigValue = updateConfigValue;
|
|
|
8053
8225
|
exports.walkNestedMap = walkNestedMap;
|
|
8054
8226
|
exports.webLink = webLink;
|
|
8055
8227
|
exports.writeSocketJson = writeSocketJson;
|
|
8056
|
-
//# debugId=
|
|
8228
|
+
//# debugId=3d2a7b08-ceff-43f9-8aea-9e31467b851b
|
|
8057
8229
|
//# sourceMappingURL=utils.js.map
|