@configdirector/nuxt-sdk 1.9.0 → 1.9.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/dist/module.json
CHANGED
|
@@ -8219,7 +8219,7 @@ var plugin_default = defineNitroPlugin((nitroApp) => {
|
|
|
8219
8219
|
const { serverSdkKey, baseUrl, connection } = runtimeConfig.configdirector;
|
|
8220
8220
|
const client = new DefaultConfigDirectorClient(serverSdkKey, {
|
|
8221
8221
|
sdkName: "nuxt-sdk",
|
|
8222
|
-
sdkVersion: "1.9.
|
|
8222
|
+
sdkVersion: "1.9.1"
|
|
8223
8223
|
}, {
|
|
8224
8224
|
logger,
|
|
8225
8225
|
connection: {
|
|
@@ -1104,7 +1104,7 @@ var DefaultConfigDirectorClient = class {
|
|
|
1104
1104
|
const startTime = (/* @__PURE__ */ new Date()).getTime();
|
|
1105
1105
|
await this.transport.connect(context ?? {}, this.timeout, caller);
|
|
1106
1106
|
this.currentContext = context;
|
|
1107
|
-
this.telemetryClient.updateContext(context);
|
|
1107
|
+
this.telemetryClient.updateContext(context).catch((error) => this.logger.warn("[ConfigDirectorClient] Telemetry could not update the context: ", error));
|
|
1108
1108
|
this.emit("contextUpdated", { context });
|
|
1109
1109
|
const elapsedTime = (/* @__PURE__ */ new Date()).getTime() - startTime;
|
|
1110
1110
|
const remainingTimeout = this.timeout - elapsedTime;
|
|
@@ -1261,7 +1261,7 @@ var DefaultConfigDirectorClient = class {
|
|
|
1261
1261
|
this.logger.debug("[ConfigDirectorClient] close() has been called, closing connection to server");
|
|
1262
1262
|
clearTimeout(this.timeoutTimer);
|
|
1263
1263
|
this.readyResolve?.(true);
|
|
1264
|
-
this.telemetryClient.close();
|
|
1264
|
+
this.telemetryClient.close().catch((error) => this.logger.warn("[ConfigDirectorClient] Telemetry could not close: ", error));
|
|
1265
1265
|
this.transport.close();
|
|
1266
1266
|
this.ready = false;
|
|
1267
1267
|
this.initializing = false;
|
|
@@ -1303,6 +1303,7 @@ var WebWorkerTelemetryClient = class {
|
|
|
1303
1303
|
logger;
|
|
1304
1304
|
initializeMessage;
|
|
1305
1305
|
worker;
|
|
1306
|
+
turnedOff = false;
|
|
1306
1307
|
pendingEvaluations = [];
|
|
1307
1308
|
pendingEvaluationLimit;
|
|
1308
1309
|
closePromise;
|
|
@@ -1330,9 +1331,27 @@ var WebWorkerTelemetryClient = class {
|
|
|
1330
1331
|
if (document.visibilityState === "hidden") this.flush();
|
|
1331
1332
|
};
|
|
1332
1333
|
}
|
|
1334
|
+
createWorkerOrTurnOff() {
|
|
1335
|
+
if (typeof Worker === "undefined") {
|
|
1336
|
+
this.turnOff("[WebWorkerTelemetryClient] Telemetry is off because Web Workers are not available in this environment.");
|
|
1337
|
+
return;
|
|
1338
|
+
}
|
|
1339
|
+
try {
|
|
1340
|
+
return new Worker(URL.createObjectURL(new Blob(["(function(){let e=async(e,t)=>e.valueId?{valueId:e.valueId}:e.value?e.value.length<=500&&e.type!=`json`?{value:e.value}:{valueId:await t(e.value)}:e,t=e=>{let t=Object.keys(e);if(t.length==0)return!0;for(let n of t)if((e[n]?.length??0)>0)return!1;return!0},n=e=>{if(!e)return!0;let t=Object.keys(e);if(t.length==0)return!0;for(let n of t)if((e[n]??0)>0)return!1;return!0},r=async(e,t,n,r)=>{let i=new AbortController,a=setTimeout(()=>{r.debug(`[fetchWithTimeout] Reached timeout, aborting request`),i.abort()},e);try{let e=await fetch(typeof t==`string`||t instanceof Request?t:t.toString(),{...n,signal:i.signal});return clearTimeout(a),e}catch(e){throw r.warn(`[fetchWithTimeout] Fetch error: `,e),clearTimeout(a),e}},i=e=>e?.name===`NotAllowedError`?!0:e instanceof TypeError;var a=class{constructor(e){this.executeRequests=!0,this.sdkKey=e.sdkKey,this.logger=e.logger,this.sdkIdentity=e.sdkIdentity,this.metaContext=e.metaContext,this.url=e.urlFactory(`client/telemetry/v1`,e.baseUrl)}async report({context:e,discreteEvents:t,aggregatedEvents:n,droppedEvents:r}){if(!this.executeRequests)return{success:!1,fatalError:!0};let i={clientSdkKey:this.sdkKey,metaContext:{sdkName:this.sdkIdentity.sdkName,sdkVersion:this.sdkIdentity.sdkVersion,appName:this.metaContext.appName,appVersion:this.metaContext.appVersion},context:e,discreteEvents:t,aggregatedEvents:n,droppedEvents:r};if(this.isReportEmpty(i))return{success:!0,fatalError:!1};let a=await this.sendReport(i);return a.fatalError&&(this.executeRequests=!1),a}isReportEmpty(e){return t(e.discreteEvents)&&t(e.aggregatedEvents)&&n(e.droppedEvents)}async sendReport(e){try{let t=await r(5e3,this.url,{method:`POST`,body:JSON.stringify(e),keepalive:!0},this.logger),n=this.isStatusFatal(t.status);return n&&this.logger.warn(`[EventReporter] Received a fatal status response (${t.status}) from the telemetry endpoint. No more telemetry data will be sent.`),{success:t.ok,fatalError:n}}catch(e){let t=i(e);return this.logger.warn(`[EventReporter] Error attempting to send telemetry data: ${e}`,{error:e}),{success:!1,fatalError:t}}}isStatusFatal(e){return!!e&&e>=400&&e<500&&e!=429}},o=class{aggregate(e){if(e.events.length==0)return[];let t=new Map;for(let n of e.events){let e=JSON.stringify(n),r=t.get(e)?.count||0;t.set(e,{event:n,count:r+1})}return Array.from(t).map(([,t])=>({startTime:e.startTime,endTime:e.endTime,count:t.count,event:t.event}))}},s=class{constructor(e){this._events=[],this._droppedEventCount=0,this.limit=e??1e3}get events(){return this._events}get reachedLimit(){return this._events.length>=this.limit}get droppedEventCount(){return this._droppedEventCount}push(...e){this.startTime||=new Date;let t=Math.max(0,e.length-this.limit),n=e.slice(t,e.length);if(this._droppedEventCount+=t,this._events.length+n.length>this.limit){let e=this._events.length+n.length-this.limit;this._events.splice(0,e),this._droppedEventCount+=e}return this._events.push(...n)}takeSnapshot(){let e=new Date,t=this.startTime??e,n=this._events.splice(0),r=this._droppedEventCount;return this.startTime=void 0,this._droppedEventCount=0,{startTime:t,endTime:e,events:n,droppedCount:r}}clear(){this._events=[],this.startTime=void 0,this._droppedEventCount=0}},c=class{constructor(e){this.aggregator=new o,this.collectEvents=!0,this.started=!1,this.logger=e.logger,this.evaluationEventQueue=new s(e.evaluationQueueLimit??1e3),this.flushIntervalDelay=e.flushIntervalDelay??3e4,this.initialFlushIntervalDelay=e.initialFlushIntervalDelay??5e3}start(){this.started||!this.collectEvents||(this.started=!0,this.flushTimeout=setTimeout(()=>this.flushAndScheduleNext(),this.initialFlushIntervalDelay))}async flushAndScheduleNext(){if(!this.collectEvents)return;let e;try{e=await this.flush()}catch(t){this.logger.warn(`[TelemetryEventCollector] Error flushing telemetry events: `,t),e={success:!1,fatalError:!1}}e.fatalError?(this.collectEvents=!1,this.close(),this.logger.warn(`[TelemetryEventCollector] Received a fatal error from telemetry collection. No longer collecting events.`)):this.collectEvents&&(this.cancelScheduledFlush(),this.flushTimeout=setTimeout(()=>this.flushAndScheduleNext(),this.flushIntervalDelay))}cancelScheduledFlush(){clearTimeout(this.flushTimeout)}async close(){this.collectEvents=!1,clearTimeout(this.flushTimeout);try{await this.flush()}catch(e){this.logger.warn(`[TelemetryEventCollector] Error flushing telemetry events during close: `,e)}this.evaluationEventQueue.clear()}dispose(){this.close()}},l=class{constructor(e){this.valueIdGenerator=e,this.valueIdGenerator=e}async process(t){let n=await Promise.all(t.events.map(async t=>({...t,defaultValue:await e(t.defaultValue,this.valueIdGenerator),evaluatedValue:await e(t.evaluatedValue,this.valueIdGenerator)})));return{...t,events:n}}},u=class extends c{constructor(e){super(e),this.reporter=new a(e),this.evaluationEventSnapshotPreprocessor=new l(e.valueIdGenerator)}async updateContext(e){this.cancelScheduledFlush(),await this.flush(),this._context=e,await this.flushAndScheduleNext()}evaluatedConfig(e){this.collectEvents&&this.evaluationEventQueue.push(e)}async forceFlush(){this.cancelScheduledFlush(),await this.flushAndScheduleNext()}async flush(){if(!this.reporter)return{success:!1,fatalError:!1};let e=await this.evaluationEventSnapshotPreprocessor.process(this.evaluationEventQueue.takeSnapshot());return await this.reporter?.report({context:this._context,discreteEvents:{},aggregatedEvents:{evaluatedConfig:this.aggregator.aggregate(e)},droppedEvents:{evaluatedConfig:e.droppedCount}})}};let d=(e,t)=>new URL(e,t?.toString()),f=(e,t)=>{let n=BigInt(0),r=BigInt(62),i=Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``),a=BigInt(`0x`+i),o=``;for(;a>n;)o=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`[Number(a%r)]+o,a/=r;return o.padStart(t,`0`)},p=Math.ceil(128/Math.log2(62)),m=new TextEncoder,h=async e=>{if(typeof crypto>`u`||crypto.subtle==null)return;let t=await crypto.subtle.digest(`SHA-256`,m.encode(e?.toString()??``));return f(new Uint8Array(t,0,16),p)},g,_=(e,t,...n)=>({type:`Log`,payload:{level:e,message:t,args:n}}),v=e=>{try{self.postMessage(e)}catch{self.postMessage(_(e.payload.level,e.payload.message))}},y={debug:function(e,...t){v(_(`debug`,e,t))},info:function(e,...t){v(_(`info`,e,t))},warn:function(e,...t){v(_(`warn`,e,t))},error:function(e,...t){v(_(`error`,e,t))}};addEventListener(`message`,e=>{let t=e.data;if(t.type!=`Initialize`&&!g){y.info(`[TelemetryWorker] Ignoring ${t.type} because no collector is configured`);return}switch(y.debug(`[TelemetryWorker] Received '${t.type}' event:`,t),t.type){case`Initialize`:if(g){y.warn(`[TelemetryWorker] Received a duplicate Initialize event, ignoring it`);break}g=new u({...t.payload,baseUrl:d(t.payload.baseUrl),urlFactory:d,valueIdGenerator:h,logger:y}),g.start();break;case`EvaluatedConfigEvent`:g?.evaluatedConfig(t.payload);break;case`UpdateContext`:g?.updateContext(t.payload.context);break;case`Flush`:g?.forceFlush();break;case`Close`:(g?.close()??Promise.resolve()).then(()=>{self.postMessage({type:`Closed`}),self.close()});break}})})();"], { type: "application/javascript" })));
|
|
1341
|
+
} catch (error) {
|
|
1342
|
+
this.turnOff("[WebWorkerTelemetryClient] Telemetry is off because the telemetry Web Worker could not be created: ", error);
|
|
1343
|
+
return;
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
turnOff(warning, ...details) {
|
|
1347
|
+
this.turnedOff = true;
|
|
1348
|
+
this.pendingEvaluations.length = 0;
|
|
1349
|
+
this.logger.warn(warning, ...details);
|
|
1350
|
+
}
|
|
1333
1351
|
startWorker() {
|
|
1334
|
-
if (this.worker) return this.worker;
|
|
1335
|
-
const worker =
|
|
1352
|
+
if (this.worker || this.turnedOff) return this.worker;
|
|
1353
|
+
const worker = this.createWorkerOrTurnOff();
|
|
1354
|
+
if (!worker) return;
|
|
1336
1355
|
worker.onmessage = (message) => {
|
|
1337
1356
|
this.handleWorkerEvent(message.data);
|
|
1338
1357
|
};
|
|
@@ -1353,9 +1372,10 @@ var WebWorkerTelemetryClient = class {
|
|
|
1353
1372
|
type: "UpdateContext",
|
|
1354
1373
|
payload: { context: value }
|
|
1355
1374
|
};
|
|
1356
|
-
this.startWorker()
|
|
1375
|
+
this.startWorker()?.postMessage(updateContextMessage);
|
|
1357
1376
|
}
|
|
1358
1377
|
evaluatedConfig(event) {
|
|
1378
|
+
if (this.turnedOff) return;
|
|
1359
1379
|
const evaluatedConfigMessage = {
|
|
1360
1380
|
type: "EvaluatedConfigEvent",
|
|
1361
1381
|
payload: this.sanitizeEvaluatedConfigEvent(event)
|
|
@@ -1597,7 +1617,7 @@ const buildClient = (configdirector, logger) => {
|
|
|
1597
1617
|
const { clientSdkKey, appName, appVersion, baseUrl, connection } = configdirector;
|
|
1598
1618
|
return createBrowserClient(clientSdkKey, {
|
|
1599
1619
|
sdkName: "nuxt-sdk",
|
|
1600
|
-
sdkVersion: "1.9.
|
|
1620
|
+
sdkVersion: "1.9.1"
|
|
1601
1621
|
}, {
|
|
1602
1622
|
metadata: {
|
|
1603
1623
|
appName,
|
package/dist/testing.mjs
CHANGED
|
@@ -1086,7 +1086,7 @@ var DefaultConfigDirectorClient = class {
|
|
|
1086
1086
|
const startTime = (/* @__PURE__ */ new Date()).getTime();
|
|
1087
1087
|
await this.transport.connect(context ?? {}, this.timeout, caller);
|
|
1088
1088
|
this.currentContext = context;
|
|
1089
|
-
this.telemetryClient.updateContext(context);
|
|
1089
|
+
this.telemetryClient.updateContext(context).catch((error) => this.logger.warn("[ConfigDirectorClient] Telemetry could not update the context: ", error));
|
|
1090
1090
|
this.emit("contextUpdated", { context });
|
|
1091
1091
|
const elapsedTime = (/* @__PURE__ */ new Date()).getTime() - startTime;
|
|
1092
1092
|
const remainingTimeout = this.timeout - elapsedTime;
|
|
@@ -1243,7 +1243,7 @@ var DefaultConfigDirectorClient = class {
|
|
|
1243
1243
|
this.logger.debug("[ConfigDirectorClient] close() has been called, closing connection to server");
|
|
1244
1244
|
clearTimeout(this.timeoutTimer);
|
|
1245
1245
|
this.readyResolve?.(true);
|
|
1246
|
-
this.telemetryClient.close();
|
|
1246
|
+
this.telemetryClient.close().catch((error) => this.logger.warn("[ConfigDirectorClient] Telemetry could not close: ", error));
|
|
1247
1247
|
this.transport.close();
|
|
1248
1248
|
this.ready = false;
|
|
1249
1249
|
this.initializing = false;
|
|
@@ -1638,7 +1638,7 @@ const installTestClient = (testClient) => {
|
|
|
1638
1638
|
const createTestClient = (options) => {
|
|
1639
1639
|
return createTestClient$1({
|
|
1640
1640
|
sdkName: "nuxt-sdk",
|
|
1641
|
-
sdkVersion: "1.9.
|
|
1641
|
+
sdkVersion: "1.9.1"
|
|
1642
1642
|
}, options);
|
|
1643
1643
|
};
|
|
1644
1644
|
//#endregion
|
package/package.json
CHANGED