@relayplane/proxy 1.9.14 → 1.9.15
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/LICENSE +21 -0
- package/dist/cli.js +0 -0
- package/dist/standalone-proxy.d.ts.map +1 -1
- package/dist/standalone-proxy.js +99 -5
- package/dist/standalone-proxy.js.map +1 -1
- package/package.json +13 -14
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Turley Designs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/cli.js
CHANGED
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standalone-proxy.d.ts","sourceRoot":"","sources":["../src/standalone-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAOlC,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE3E,KAAK,QAAQ,GAAG,YAAY,GACxB,YAAY,GACZ,UAAU,GACV,MAAM,GACN,SAAS,GACT,UAAU,GACV,WAAW,GACX,YAAY,GACZ,QAAQ,CAAC;AAOb,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"standalone-proxy.d.ts","sourceRoot":"","sources":["../src/standalone-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAOlC,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE3E,KAAK,QAAQ,GAAG,YAAY,GACxB,YAAY,GACZ,UAAU,GACV,MAAM,GACN,SAAS,GACT,UAAU,GACV,WAAW,GACX,YAAY,GACZ,QAAQ,CAAC;AAOb,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6F5C,2DAA2D;AAC3D,eAAO,MAAM,mBAAmB,gBAAuB,CAAC;AA6CxD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAiD9D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAiD/E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGrD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,IAAI,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAM7E,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CA6CnH;AAsDD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAWjD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMvD;AAkBD,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEjD,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;CAC9B;AAcD,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,cAAc,EAAE,MAAM,CAAC;CACxB;AA6JD,KAAK,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AA6EpD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;CAChD;AAuHD,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA4OD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,EAAE,OAAO,GACnB;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CA2CjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,CAavG;AA6JD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAe3D;AAuDD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,UAAU,CAoDpG;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,OAAO,CAIlG;AA2uCD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,GACvB;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4E9C;AAgwBD;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAuwG/E"}
|
package/dist/standalone-proxy.js
CHANGED
|
@@ -109,6 +109,12 @@ const PROXY_VERSION = (() => {
|
|
|
109
109
|
return '0.0.0';
|
|
110
110
|
}
|
|
111
111
|
})();
|
|
112
|
+
/** Returns true when the model is a Haiku variant (does not support extended thinking) */
|
|
113
|
+
function isHaikuModel(model) {
|
|
114
|
+
return model.includes('haiku');
|
|
115
|
+
}
|
|
116
|
+
/** Beta flags that OAT tokens (sk-ant-oat*) do not support */
|
|
117
|
+
const OAT_UNSUPPORTED_BETA_FLAGS = new Set(['max-tokens-3-5-sonnet-2025-04-14']);
|
|
112
118
|
let latestProxyVersionCache = { value: null, checkedAt: 0 };
|
|
113
119
|
const LATEST_PROXY_VERSION_TTL_MS = 30 * 60 * 1000;
|
|
114
120
|
async function getLatestProxyVersion() {
|
|
@@ -1238,6 +1244,23 @@ function buildAnthropicHeadersWithAuth(ctx, apiKey, isMaxToken, isRerouted) {
|
|
|
1238
1244
|
headers['anthropic-beta'] = `${existing},${ctx.betaHeaders}`;
|
|
1239
1245
|
}
|
|
1240
1246
|
}
|
|
1247
|
+
// Strip beta flags unsupported by OAT tokens
|
|
1248
|
+
if (headers['anthropic-beta']) {
|
|
1249
|
+
const token = ctx.authHeader?.replace(/^Bearer\s+/i, '') ?? ctx.apiKeyHeader ?? apiKey ?? '';
|
|
1250
|
+
if (token.startsWith('sk-ant-oat')) {
|
|
1251
|
+
const cleaned = headers['anthropic-beta']
|
|
1252
|
+
.split(',')
|
|
1253
|
+
.map(b => b.trim())
|
|
1254
|
+
.filter(b => !OAT_UNSUPPORTED_BETA_FLAGS.has(b))
|
|
1255
|
+
.join(',');
|
|
1256
|
+
if (cleaned) {
|
|
1257
|
+
headers['anthropic-beta'] = cleaned;
|
|
1258
|
+
}
|
|
1259
|
+
else {
|
|
1260
|
+
delete headers['anthropic-beta'];
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1241
1264
|
// Pass through OAuth identity headers (required by Anthropic for OAuth token validation)
|
|
1242
1265
|
if (ctx.userAgent) {
|
|
1243
1266
|
headers['user-agent'] = ctx.userAgent;
|
|
@@ -1276,6 +1299,23 @@ function buildAnthropicHeaders(ctx, envApiKey) {
|
|
|
1276
1299
|
headers['anthropic-beta'] = `${existing},${ctx.betaHeaders}`;
|
|
1277
1300
|
}
|
|
1278
1301
|
}
|
|
1302
|
+
// Strip beta flags unsupported by OAT tokens
|
|
1303
|
+
if (headers['anthropic-beta']) {
|
|
1304
|
+
const token = ctx.authHeader?.replace(/^Bearer\s+/i, '') ?? ctx.apiKeyHeader ?? envApiKey ?? '';
|
|
1305
|
+
if (token.startsWith('sk-ant-oat')) {
|
|
1306
|
+
const cleaned = headers['anthropic-beta']
|
|
1307
|
+
.split(',')
|
|
1308
|
+
.map(b => b.trim())
|
|
1309
|
+
.filter(b => !OAT_UNSUPPORTED_BETA_FLAGS.has(b))
|
|
1310
|
+
.join(',');
|
|
1311
|
+
if (cleaned) {
|
|
1312
|
+
headers['anthropic-beta'] = cleaned;
|
|
1313
|
+
}
|
|
1314
|
+
else {
|
|
1315
|
+
delete headers['anthropic-beta'];
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1279
1319
|
// Pass through OAuth identity headers (required by Anthropic for OAuth token validation)
|
|
1280
1320
|
if (ctx.userAgent) {
|
|
1281
1321
|
headers['user-agent'] = ctx.userAgent;
|
|
@@ -4741,6 +4781,8 @@ async function startProxy(config = {}) {
|
|
|
4741
4781
|
// ── End rate limit check ──
|
|
4742
4782
|
const startTime = Date.now();
|
|
4743
4783
|
let nativeResponseData;
|
|
4784
|
+
let _strippedThinking = false;
|
|
4785
|
+
let _strippedBetaFlags = [];
|
|
4744
4786
|
try {
|
|
4745
4787
|
if (useCascade && cascadeConfig) {
|
|
4746
4788
|
const cascadeResult = await cascadeRequest(cascadeConfig, async (modelName) => {
|
|
@@ -4754,12 +4796,27 @@ async function startProxy(config = {}) {
|
|
|
4754
4796
|
if (proxyConfig.reliability?.cooldowns?.enabled && !cooldownManager.isAvailable(resolved.provider)) {
|
|
4755
4797
|
throw new CooldownError(resolved.provider);
|
|
4756
4798
|
}
|
|
4757
|
-
|
|
4799
|
+
let attemptBody = { ...requestBody, model: resolved.model };
|
|
4800
|
+
if (isHaikuModel(resolved.model) && 'thinking' in attemptBody) {
|
|
4801
|
+
const { thinking: _t, ...rest } = attemptBody;
|
|
4802
|
+
attemptBody = rest;
|
|
4803
|
+
_strippedThinking = true;
|
|
4804
|
+
log(`Stripped thinking from Haiku request (${resolved.model} does not support extended thinking)`);
|
|
4805
|
+
}
|
|
4758
4806
|
// Hybrid auth: use MAX token for Opus models, API key for others
|
|
4759
4807
|
const modelAuth = getAuthForModel(resolved.model, proxyConfig.auth, useAnthropicEnvKey);
|
|
4760
4808
|
if (modelAuth.isMax) {
|
|
4761
4809
|
log(`Using MAX token for ${resolved.model}`);
|
|
4762
4810
|
}
|
|
4811
|
+
// Log OAT beta flag stripping if applicable
|
|
4812
|
+
const cascadeEffectiveToken = ctx.authHeader?.replace(/^Bearer\s+/i, '') ?? ctx.apiKeyHeader ?? modelAuth.apiKey ?? '';
|
|
4813
|
+
const cascadeLocalStrippedBeta = cascadeEffectiveToken.startsWith('sk-ant-oat') && ctx.betaHeaders
|
|
4814
|
+
? ctx.betaHeaders.split(',').map(b => b.trim()).filter(b => OAT_UNSUPPORTED_BETA_FLAGS.has(b))
|
|
4815
|
+
: [];
|
|
4816
|
+
if (cascadeLocalStrippedBeta.length > 0) {
|
|
4817
|
+
_strippedBetaFlags = cascadeLocalStrippedBeta;
|
|
4818
|
+
log(`Stripped OAT-unsupported beta flags from request: ${cascadeLocalStrippedBeta.join(', ')}`);
|
|
4819
|
+
}
|
|
4763
4820
|
const isCascadeRerouted = resolved.model !== originalModel;
|
|
4764
4821
|
const providerResponse = await forwardNativeAnthropicRequest(attemptBody, ctx, modelAuth.apiKey, modelAuth.isMax, isCascadeRerouted);
|
|
4765
4822
|
const responseData = (await providerResponse.json());
|
|
@@ -4776,7 +4833,12 @@ async function startProxy(config = {}) {
|
|
|
4776
4833
|
}, log);
|
|
4777
4834
|
const cascadeResponseModel = checkResponseModelMismatch(cascadeResult.responseData, cascadeResult.model, cascadeResult.provider, log);
|
|
4778
4835
|
const cascadeRpHeaders = buildRelayPlaneResponseHeaders(cascadeResult.model, originalModel ?? 'unknown', complexity, cascadeResult.provider, 'cascade');
|
|
4779
|
-
|
|
4836
|
+
const cascadeStrippedRpHeaders = {};
|
|
4837
|
+
if (_strippedThinking)
|
|
4838
|
+
cascadeStrippedRpHeaders['X-RelayPlane-Stripped-Thinking'] = 'true';
|
|
4839
|
+
if (_strippedBetaFlags.length > 0)
|
|
4840
|
+
cascadeStrippedRpHeaders['X-RelayPlane-Stripped-Beta'] = _strippedBetaFlags.join(',');
|
|
4841
|
+
res.writeHead(200, { 'Content-Type': 'application/json', ...cascadeRpHeaders, ...cascadeStrippedRpHeaders });
|
|
4780
4842
|
res.end(JSON.stringify(cascadeResult.responseData));
|
|
4781
4843
|
targetProvider = cascadeResult.provider;
|
|
4782
4844
|
targetModel = cascadeResult.model;
|
|
@@ -4798,7 +4860,28 @@ async function startProxy(config = {}) {
|
|
|
4798
4860
|
const _nativeReqCtx = _poolSelectedToken
|
|
4799
4861
|
? { ...effectiveCtx, authHeader: undefined, apiKeyHeader: undefined }
|
|
4800
4862
|
: effectiveCtx;
|
|
4801
|
-
|
|
4863
|
+
// Strip thinking from body for Haiku models (does not support extended thinking)
|
|
4864
|
+
let _nativeReqBody = { ...requestBody, model: finalModel };
|
|
4865
|
+
if (isHaikuModel(finalModel) && 'thinking' in _nativeReqBody) {
|
|
4866
|
+
const { thinking: _t, ...rest } = _nativeReqBody;
|
|
4867
|
+
_nativeReqBody = rest;
|
|
4868
|
+
_strippedThinking = true;
|
|
4869
|
+
log(`Stripped thinking from Haiku request (${finalModel} does not support extended thinking)`);
|
|
4870
|
+
}
|
|
4871
|
+
// Log OAT beta flag stripping if applicable
|
|
4872
|
+
const _nativeEffectiveToken = _poolSelectedToken
|
|
4873
|
+
|| effectiveCtx.authHeader?.replace(/^Bearer\s+/i, '')
|
|
4874
|
+
|| effectiveCtx.apiKeyHeader
|
|
4875
|
+
|| modelAuth.apiKey
|
|
4876
|
+
|| '';
|
|
4877
|
+
const _nativeStrippedBeta = _nativeEffectiveToken.startsWith('sk-ant-oat') && effectiveCtx.betaHeaders
|
|
4878
|
+
? effectiveCtx.betaHeaders.split(',').map(b => b.trim()).filter(b => OAT_UNSUPPORTED_BETA_FLAGS.has(b))
|
|
4879
|
+
: [];
|
|
4880
|
+
if (_nativeStrippedBeta.length > 0) {
|
|
4881
|
+
_strippedBetaFlags = _nativeStrippedBeta;
|
|
4882
|
+
log(`Stripped OAT-unsupported beta flags from request: ${_nativeStrippedBeta.join(', ')}`);
|
|
4883
|
+
}
|
|
4884
|
+
let providerResponse = await forwardNativeAnthropicRequest(_nativeReqBody, _nativeReqCtx, modelAuth.apiKey, modelAuth.isMax, isRerouted);
|
|
4802
4885
|
// Token pool: on 429, record and retry with next available token
|
|
4803
4886
|
if (providerResponse.status === 429 && _poolSelectedToken) {
|
|
4804
4887
|
const _poolRetryAfterHeader = providerResponse.headers.get('retry-after');
|
|
@@ -4809,7 +4892,7 @@ async function startProxy(config = {}) {
|
|
|
4809
4892
|
log(`[TokenPool] 429 on token …${_poolSelectedToken.slice(-8)} — retrying with "${_nextPoolToken.label}"`);
|
|
4810
4893
|
_poolSelectedToken = _nextPoolToken.apiKey;
|
|
4811
4894
|
const _retryCtx = { ...ctx, authHeader: undefined, apiKeyHeader: undefined };
|
|
4812
|
-
providerResponse = await forwardNativeAnthropicRequest(
|
|
4895
|
+
providerResponse = await forwardNativeAnthropicRequest(_nativeReqBody, _retryCtx, _nextPoolToken.apiKey, _nextPoolToken.isOat, isRerouted);
|
|
4813
4896
|
}
|
|
4814
4897
|
}
|
|
4815
4898
|
// Token pool: learn rate limits from upstream response headers
|
|
@@ -4875,6 +4958,11 @@ async function startProxy(config = {}) {
|
|
|
4875
4958
|
}
|
|
4876
4959
|
if (isStreaming) {
|
|
4877
4960
|
const nativeStreamRpHeaders = buildRelayPlaneResponseHeaders(targetModel || requestedModel, originalModel ?? 'unknown', complexity, targetProvider, routingMode);
|
|
4961
|
+
const nativeStreamStrippedHeaders = {};
|
|
4962
|
+
if (_strippedThinking)
|
|
4963
|
+
nativeStreamStrippedHeaders['X-RelayPlane-Stripped-Thinking'] = 'true';
|
|
4964
|
+
if (_strippedBetaFlags.length > 0)
|
|
4965
|
+
nativeStreamStrippedHeaders['X-RelayPlane-Stripped-Beta'] = _strippedBetaFlags.join(',');
|
|
4878
4966
|
res.writeHead(providerResponse.status, {
|
|
4879
4967
|
'Content-Type': 'text/event-stream',
|
|
4880
4968
|
'Cache-Control': 'no-cache',
|
|
@@ -4883,6 +4971,7 @@ async function startProxy(config = {}) {
|
|
|
4883
4971
|
'X-Relay-Trace-Id': nativeTraceId,
|
|
4884
4972
|
'X-Relay-Memory-Hits': String((0, osmosis_store_js_1.countAtomsForSession)(nativeSessionId)),
|
|
4885
4973
|
...nativeStreamRpHeaders,
|
|
4974
|
+
...nativeStreamStrippedHeaders,
|
|
4886
4975
|
});
|
|
4887
4976
|
const reader = providerResponse.body?.getReader();
|
|
4888
4977
|
let streamTokensIn = 0;
|
|
@@ -4976,7 +5065,12 @@ async function startProxy(config = {}) {
|
|
|
4976
5065
|
});
|
|
4977
5066
|
log(`Cache STORE for ${targetModel || requestedModel} (hash: ${cacheHash.slice(0, 8)})`);
|
|
4978
5067
|
}
|
|
4979
|
-
|
|
5068
|
+
const nativeStrippedHeaders = {};
|
|
5069
|
+
if (_strippedThinking)
|
|
5070
|
+
nativeStrippedHeaders['X-RelayPlane-Stripped-Thinking'] = 'true';
|
|
5071
|
+
if (_strippedBetaFlags.length > 0)
|
|
5072
|
+
nativeStrippedHeaders['X-RelayPlane-Stripped-Beta'] = _strippedBetaFlags.join(',');
|
|
5073
|
+
res.writeHead(providerResponse.status, { 'Content-Type': 'application/json', 'X-RelayPlane-Cache': nativeCacheHeader, 'X-Relay-Trace-Id': nativeTraceId, 'X-Relay-Memory-Hits': String((0, osmosis_store_js_1.countAtomsForSession)(nativeSessionId)), ...nativeRpHeaders, ...nativeStrippedHeaders });
|
|
4980
5074
|
res.end(JSON.stringify(nativeResponseData));
|
|
4981
5075
|
}
|
|
4982
5076
|
}
|