@dxos/observability 0.8.4-main.c85a9c8dae → 0.8.4-main.d05539e30a

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.
Files changed (114) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/{chunk-K4VFBKST.mjs → chunk-PSFTIG54.mjs} +9 -2
  3. package/dist/lib/browser/chunk-PSFTIG54.mjs.map +7 -0
  4. package/dist/lib/browser/index.mjs +176 -217
  5. package/dist/lib/browser/index.mjs.map +3 -3
  6. package/dist/lib/browser/{log-processor-FDLTDQEM.mjs → log-processor-HPHWNBOK.mjs} +11 -18
  7. package/dist/lib/browser/log-processor-HPHWNBOK.mjs.map +7 -0
  8. package/dist/lib/browser/{logs-ATTRIUTL.mjs → logs-UTNIFYHF.mjs} +7 -4
  9. package/dist/lib/browser/logs-UTNIFYHF.mjs.map +7 -0
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/{metrics-PKTV6IGF.mjs → metrics-PRGSYAZJ.mjs} +7 -21
  12. package/dist/lib/browser/metrics-PRGSYAZJ.mjs.map +7 -0
  13. package/dist/lib/browser/traces-browser-XRINKQUA.mjs +154 -0
  14. package/dist/lib/browser/traces-browser-XRINKQUA.mjs.map +7 -0
  15. package/dist/lib/node-esm/{chunk-FEVP3MK4.mjs → chunk-EDDZWPYV.mjs} +9 -2
  16. package/dist/lib/node-esm/chunk-EDDZWPYV.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +161 -184
  18. package/dist/lib/node-esm/index.mjs.map +3 -3
  19. package/dist/lib/node-esm/{log-processor-TKJVJJSJ.mjs → log-processor-ZODHERST.mjs} +11 -18
  20. package/dist/lib/node-esm/log-processor-ZODHERST.mjs.map +7 -0
  21. package/dist/lib/node-esm/{logs-7J45KLM7.mjs → logs-ARJUVN3T.mjs} +7 -4
  22. package/dist/lib/node-esm/logs-ARJUVN3T.mjs.map +7 -0
  23. package/dist/lib/node-esm/meta.json +1 -1
  24. package/dist/lib/node-esm/{metrics-H7DDLYSG.mjs → metrics-DREJOOAC.mjs} +7 -21
  25. package/dist/lib/node-esm/metrics-DREJOOAC.mjs.map +7 -0
  26. package/dist/lib/node-esm/traces-74F7JUKF.mjs +125 -0
  27. package/dist/lib/node-esm/traces-74F7JUKF.mjs.map +7 -0
  28. package/dist/types/src/cli-observability-secrets.json +2 -2
  29. package/dist/types/src/extensions/otel/extension.d.ts.map +1 -1
  30. package/dist/types/src/extensions/otel/extension.js +112 -16
  31. package/dist/types/src/extensions/otel/extension.js.map +1 -1
  32. package/dist/types/src/extensions/otel/logs.d.ts.map +1 -1
  33. package/dist/types/src/extensions/otel/logs.js +6 -3
  34. package/dist/types/src/extensions/otel/logs.js.map +1 -1
  35. package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -1
  36. package/dist/types/src/extensions/otel/metrics.js +2 -2
  37. package/dist/types/src/extensions/otel/metrics.js.map +1 -1
  38. package/dist/types/src/extensions/otel/otel.d.ts +7 -0
  39. package/dist/types/src/extensions/otel/otel.d.ts.map +1 -1
  40. package/dist/types/src/extensions/otel/otel.js +12 -0
  41. package/dist/types/src/extensions/otel/otel.js.map +1 -1
  42. package/dist/types/src/extensions/otel/span-processors.d.ts +25 -0
  43. package/dist/types/src/extensions/otel/span-processors.d.ts.map +1 -0
  44. package/dist/types/src/extensions/otel/span-processors.js +41 -0
  45. package/dist/types/src/extensions/otel/span-processors.js.map +1 -0
  46. package/dist/types/src/extensions/otel/traces-browser.d.ts +17 -0
  47. package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -1
  48. package/dist/types/src/extensions/otel/traces-browser.js +69 -14
  49. package/dist/types/src/extensions/otel/traces-browser.js.map +1 -1
  50. package/dist/types/src/extensions/otel/traces.d.ts +17 -0
  51. package/dist/types/src/extensions/otel/traces.d.ts.map +1 -1
  52. package/dist/types/src/extensions/otel/traces.js +59 -9
  53. package/dist/types/src/extensions/otel/traces.js.map +1 -1
  54. package/dist/types/src/extensions/posthog/extension.d.ts +13 -3
  55. package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -1
  56. package/dist/types/src/extensions/posthog/extension.js +42 -28
  57. package/dist/types/src/extensions/posthog/extension.js.map +1 -1
  58. package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -1
  59. package/dist/types/src/extensions/posthog/log-processor.js +10 -19
  60. package/dist/types/src/extensions/posthog/log-processor.js.map +1 -1
  61. package/dist/types/src/extensions/posthog/log-processor.test.js +2 -2
  62. package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -1
  63. package/dist/types/src/observability-extension.d.ts +1 -1
  64. package/dist/types/src/observability-extension.d.ts.map +1 -1
  65. package/dist/types/src/observability.d.ts.map +1 -1
  66. package/dist/types/src/observability.js +4 -2
  67. package/dist/types/src/observability.js.map +1 -1
  68. package/dist/types/src/observability.test.js +1 -1
  69. package/dist/types/src/observability.test.js.map +1 -1
  70. package/dist/types/src/providers/client-observability.d.ts.map +1 -1
  71. package/dist/types/src/providers/client-observability.js +2 -0
  72. package/dist/types/src/providers/client-observability.js.map +1 -1
  73. package/dist/types/src/providers/ip-data.d.ts.map +1 -1
  74. package/dist/types/src/storage/browser.d.ts.map +1 -1
  75. package/dist/types/src/storage/browser.js +15 -4
  76. package/dist/types/src/storage/browser.js.map +1 -1
  77. package/dist/types/src/storage/node.d.ts.map +1 -1
  78. package/dist/types/src/storage/node.js +1 -1
  79. package/dist/types/src/storage/node.js.map +1 -1
  80. package/dist/types/src/storage/node.test.js +1 -1
  81. package/dist/types/src/storage/node.test.js.map +1 -1
  82. package/dist/types/tsconfig.tsbuildinfo +1 -1
  83. package/package.json +35 -31
  84. package/src/cli-observability-secrets.json +2 -2
  85. package/src/extensions/otel/extension.ts +118 -17
  86. package/src/extensions/otel/logs.ts +6 -3
  87. package/src/extensions/otel/metrics.ts +2 -2
  88. package/src/extensions/otel/otel.ts +13 -0
  89. package/src/extensions/otel/span-processors.ts +45 -0
  90. package/src/extensions/otel/traces-browser.ts +91 -15
  91. package/src/extensions/otel/traces.ts +76 -12
  92. package/src/extensions/posthog/extension.ts +55 -30
  93. package/src/extensions/posthog/log-processor.test.ts +7 -6
  94. package/src/extensions/posthog/log-processor.ts +10 -21
  95. package/src/observability-extension.ts +1 -1
  96. package/src/observability.test.ts +1 -1
  97. package/src/observability.ts +4 -2
  98. package/src/providers/client-observability.ts +2 -0
  99. package/src/storage/browser.ts +14 -4
  100. package/src/storage/node.test.ts +1 -2
  101. package/src/storage/node.ts +1 -2
  102. package/src/vite-import-meta.d.ts +14 -0
  103. package/dist/lib/browser/chunk-K4VFBKST.mjs.map +0 -7
  104. package/dist/lib/browser/log-processor-FDLTDQEM.mjs.map +0 -7
  105. package/dist/lib/browser/logs-ATTRIUTL.mjs.map +0 -7
  106. package/dist/lib/browser/metrics-PKTV6IGF.mjs.map +0 -7
  107. package/dist/lib/browser/traces-browser-5DQUYGQ7.mjs +0 -68
  108. package/dist/lib/browser/traces-browser-5DQUYGQ7.mjs.map +0 -7
  109. package/dist/lib/node-esm/chunk-FEVP3MK4.mjs.map +0 -7
  110. package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs.map +0 -7
  111. package/dist/lib/node-esm/logs-7J45KLM7.mjs.map +0 -7
  112. package/dist/lib/node-esm/metrics-H7DDLYSG.mjs.map +0 -7
  113. package/dist/lib/node-esm/traces-KMTHMYFX.mjs +0 -44
  114. package/dist/lib/node-esm/traces-KMTHMYFX.mjs.map +0 -7
@@ -24,10 +24,10 @@ import { invariant } from "@dxos/invariant";
24
24
  import { log } from "@dxos/log";
25
25
 
26
26
  // src/storage/node.ts
27
+ import yaml from "js-yaml";
27
28
  import { existsSync, statSync } from "node:fs";
28
29
  import { mkdir, readFile, writeFile } from "node:fs/promises";
29
30
  import { join } from "node:path";
30
- import yaml from "js-yaml";
31
31
  import { v4 as uuid, validate as validateUuid } from "uuid";
32
32
  var showObservabilityBanner = async (configDir, bannercb) => {
33
33
  const path = join(configDir, ".observability-banner-printed");
@@ -114,12 +114,7 @@ var ObservabilityImpl = class {
114
114
  this._subscriptions.add(...cleanups.filter((cleanup) => cleanup !== void 0));
115
115
  this._initialized = true;
116
116
  }).pipe(Effect.catchAll((error) => Effect.gen(this, function* () {
117
- log.catch(error, void 0, {
118
- F: __dxlog_file,
119
- L: 85,
120
- S: this,
121
- C: (f, a) => f(...a)
122
- });
117
+ log.catch(error, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 32, S: this });
123
118
  for (const extension of initializedExtensions) {
124
119
  if (extension.close) {
125
120
  yield* extension.close().pipe(Effect.catchAll(() => Effect.succeed(void 0)));
@@ -168,27 +163,11 @@ var ObservabilityImpl = class {
168
163
  });
169
164
  }
170
165
  _addExtension(extension) {
171
- invariant(!this._initialized, "Observability is already initialized", {
172
- F: __dxlog_file,
173
- L: 142,
174
- S: this,
175
- A: [
176
- "!this._initialized",
177
- "'Observability is already initialized'"
178
- ]
179
- });
166
+ invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 82, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
180
167
  this._extensions.push(extension);
181
168
  }
182
169
  _addDataProvider(dataProvider) {
183
- invariant(!this._initialized, "Observability is already initialized", {
184
- F: __dxlog_file,
185
- L: 147,
186
- S: this,
187
- A: [
188
- "!this._initialized",
189
- "'Observability is already initialized'"
190
- ]
191
- });
170
+ invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 86, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
192
171
  this._dataProviders.push(dataProvider);
193
172
  }
194
173
  /**
@@ -248,10 +227,12 @@ var ObservabilityImpl = class {
248
227
  }
249
228
  get feedback() {
250
229
  return {
251
- captureUserFeedback: (form) => {
230
+ captureUserFeedback: async (form) => {
231
+ let eventUuid;
252
232
  for (const extension of this._getExtensions("feedback")) {
253
- extension.captureUserFeedback(form);
233
+ eventUuid = await extension.captureUserFeedback(form) ?? eventUuid;
254
234
  }
235
+ return eventUuid;
255
236
  }
256
237
  };
257
238
  }
@@ -297,29 +278,13 @@ var make = () => Effect.succeed(new ObservabilityImpl());
297
278
  var addExtension = (_extension) => Effect.fn(function* (_observability) {
298
279
  const observability = yield* _observability;
299
280
  const extension = yield* _extension;
300
- invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, {
301
- F: __dxlog_file,
302
- L: 276,
303
- S: this,
304
- A: [
305
- "'_addExtension' in observability && typeof observability._addExtension === 'function'",
306
- ""
307
- ]
308
- });
281
+ invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 196, S: this, A: ["'_addExtension' in observability && typeof observability._addExtension === 'function'", ""] });
309
282
  observability._addExtension(extension);
310
283
  return observability;
311
284
  });
312
285
  var addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
313
286
  const observability = yield* _observability;
314
- invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, {
315
- F: __dxlog_file,
316
- L: 284,
317
- S: this,
318
- A: [
319
- "'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'",
320
- ""
321
- ]
322
- });
287
+ invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 202, S: this, A: ["'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'", ""] });
323
288
  observability._addDataProvider(dataProvider);
324
289
  return observability;
325
290
  });
@@ -349,6 +314,7 @@ import * as Effect3 from "effect/Effect";
349
314
  import * as Match from "effect/Match";
350
315
  import * as Option from "effect/Option";
351
316
  import * as Ref from "effect/Ref";
317
+ import { resolveTelemetryTag } from "@dxos/config";
352
318
  import { LogLevel, log as log2 } from "@dxos/log";
353
319
  import { isNode, isNonNullable } from "@dxos/util";
354
320
 
@@ -356,8 +322,8 @@ import { isNode, isNonNullable } from "@dxos/util";
356
322
  var cli_observability_secrets_default = {
357
323
  POSTHOG_API_KEY: null,
358
324
  IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
359
- OTEL_ENDPOINT: "https://ingest.eu.signoz.cloud:443",
360
- OTEL_HEADERS: "signoz-ingestion-key: 5300e0c9-a5e8-4a10-9c61-f473e539c0b7"
325
+ OTEL_ENDPOINT: "/api/otel",
326
+ OTEL_HEADERS: null
361
327
  };
362
328
 
363
329
  // src/extensions/stub.ts
@@ -392,49 +358,60 @@ var extensions = Effect3.fn(function* ({
392
358
  metrics: metricsEnabled = false,
393
359
  traces: tracesEnabled = false
394
360
  }) {
395
- const { OtelLogs } = yield* Effect3.promise(() => import("./logs-7J45KLM7.mjs"));
396
- const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-H7DDLYSG.mjs"));
397
- const { OtelTraces } = yield* Effect3.promise(() => import("./traces-KMTHMYFX.mjs"));
361
+ const { OtelLogs } = yield* Effect3.promise(() => import("./logs-ARJUVN3T.mjs"));
362
+ const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-DREJOOAC.mjs"));
363
+ const { OtelTraces } = yield* Effect3.promise(() => import("./traces-74F7JUKF.mjs"));
398
364
  const cachedDisabled = yield* Effect3.promise(() => isObservabilityDisabled(serviceName));
399
- const enabledRef = yield* Ref.make(!cachedDisabled);
365
+ const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
366
+ const enabledRef = yield* Ref.make(!disabled);
400
367
  const tags = /* @__PURE__ */ new Map();
401
- const endpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT;
368
+ const rawEndpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT ?? _endpoint;
369
+ const endpoint = !isNode() && rawEndpoint?.startsWith("/") ? resolveRelativeEndpoint(rawEndpoint) : rawEndpoint;
402
370
  const headers = _headers ?? Match.value(isNode()).pipe(Match.when(true, () => Option.fromNullable(process.env.DX_OTEL_HEADERS ?? cli_observability_secrets_default.OTEL_HEADERS)), Match.when(false, () => Option.fromNullable(config.values.runtime?.app?.env?.DX_OTEL_HEADERS)), Match.exhaustive, Option.map((raw) => parseHeaders(raw)), Option.getOrElse(() => void 0));
403
- if (!endpoint || !headers) {
404
- log2.info("Missing OTEL_ENDPOINT or OTEL_HEADERS", void 0, {
405
- F: __dxlog_file2,
406
- L: 77,
407
- S: this,
408
- C: (f, a) => f(...a)
409
- });
371
+ if (!endpoint) {
372
+ log2.info("Missing OTEL_ENDPOINT", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 35, S: this });
410
373
  return stubExtension;
411
374
  }
375
+ const resolvedHeaders = headers ?? {};
376
+ const resolvedEndpoint = !isNode() && endpoint.startsWith("/") ? `${globalThis.location.origin}${endpoint}` : endpoint;
377
+ const clientTag = resolveTelemetryTag(config);
378
+ if (clientTag) {
379
+ tags.set("ctx.tag", clientTag);
380
+ }
412
381
  const resource = defaultResource().merge(resourceFromAttributes({
413
382
  [ATTR_SERVICE_NAME]: serviceName,
414
383
  [ATTR_SERVICE_VERSION]: serviceVersion,
415
- "deployment.environment": environment
384
+ "session.id": crypto.randomUUID(),
385
+ "deployment.environment": environment,
386
+ "dxos.process.type": detectProcessType(),
387
+ ...clientTag ? {
388
+ "ctx.tag": clientTag
389
+ } : {}
416
390
  }));
417
391
  const logs = logsEnabled ? new OtelLogs({
418
- endpoint,
419
- headers,
392
+ endpoint: resolvedEndpoint,
393
+ headers: resolvedHeaders,
420
394
  resource,
421
395
  getTags: () => Object.fromEntries(tags),
422
396
  logLevel
423
397
  }) : void 0;
424
398
  const metrics = metricsEnabled ? new OtelMetrics({
425
- endpoint,
426
- headers,
399
+ endpoint: resolvedEndpoint,
400
+ headers: resolvedHeaders,
427
401
  resource,
428
402
  getTags: () => Object.fromEntries(tags)
429
403
  }) : void 0;
430
404
  const traces = tracesEnabled ? new OtelTraces({
431
- endpoint,
432
- headers,
405
+ endpoint: resolvedEndpoint,
406
+ headers: resolvedHeaders,
433
407
  resource,
434
408
  getTags: () => Object.fromEntries(tags)
435
409
  }) : void 0;
436
- return {
410
+ const extension = {
437
411
  initialize: () => Effect3.sync(() => {
412
+ if (disabled) {
413
+ return;
414
+ }
438
415
  if (logs) {
439
416
  log2.runtimeConfig.processors.push(logs.logProcessor);
440
417
  }
@@ -451,12 +428,28 @@ var extensions = Effect3.fn(function* ({
451
428
  yield* Ref.update(enabledRef, () => false);
452
429
  }),
453
430
  close: () => Effect3.promise(async () => {
454
- await logs?.close();
455
- await metrics?.close();
431
+ const results = await Promise.allSettled([
432
+ logs?.close(),
433
+ metrics?.close()
434
+ ]);
435
+ for (const result of results) {
436
+ if (result.status === "rejected") {
437
+ log2.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 120, S: this });
438
+ }
439
+ }
440
+ await traces?.close();
456
441
  }),
457
442
  flush: () => Effect3.promise(async () => {
458
- await logs?.flush();
459
- await metrics?.flush();
443
+ const results = await Promise.allSettled([
444
+ logs?.flush(),
445
+ metrics?.flush()
446
+ ]);
447
+ for (const result of results) {
448
+ if (result.status === "rejected") {
449
+ log2.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 135, S: this });
450
+ }
451
+ }
452
+ await traces?.flush();
460
453
  }),
461
454
  setTags: (incomingTags) => {
462
455
  for (const [key, value2] of Object.entries(incomingTags)) {
@@ -484,7 +477,39 @@ var extensions = Effect3.fn(function* ({
484
477
  } : void 0
485
478
  ].filter(isNonNullable)
486
479
  };
480
+ return extension;
487
481
  });
482
+ var isObservabilityDisabledSync = (serviceName) => {
483
+ if (isNode()) {
484
+ return process.env.DX_DISABLE_OBSERVABILITY === "true";
485
+ }
486
+ try {
487
+ if (typeof localStorage !== "undefined") {
488
+ return localStorage.getItem(`${serviceName}/observability-disabled`) === "true";
489
+ }
490
+ } catch {
491
+ }
492
+ return false;
493
+ };
494
+ var detectProcessType = () => {
495
+ if (isNode()) {
496
+ return "node";
497
+ }
498
+ if (typeof window !== "undefined") {
499
+ return "browser";
500
+ }
501
+ if (typeof globalThis.ServiceWorkerGlobalScope !== "undefined") {
502
+ return "service-worker";
503
+ }
504
+ if (typeof globalThis.SharedWorkerGlobalScope !== "undefined") {
505
+ return "shared-worker";
506
+ }
507
+ return "dedicated-worker";
508
+ };
509
+ var resolveRelativeEndpoint = (path) => {
510
+ const origin = globalThis.location?.origin;
511
+ return origin ? `${origin}${path}` : path;
512
+ };
488
513
  var parseHeaders = (unparsedHeaders) => {
489
514
  return unparsedHeaders.split(";").reduce((acc, header) => {
490
515
  const [key, ...rest] = header.split(":");
@@ -503,7 +528,7 @@ __export(posthog_exports, {
503
528
 
504
529
  // src/extensions/posthog/extension.ts
505
530
  import * as Effect4 from "effect/Effect";
506
- import { LogBuffer, log as log3 } from "@dxos/log";
531
+ import { log as log3 } from "@dxos/log";
507
532
  var __dxlog_file3 = "/__w/dxos/dxos/packages/sdk/observability/src/extensions/posthog/extension.ts";
508
533
  var uploadLogs = async (body) => {
509
534
  try {
@@ -517,12 +542,7 @@ var uploadLogs = async (body) => {
517
542
  if (!response.ok) {
518
543
  log3.warn("feedback log upload failed", {
519
544
  status: response.status
520
- }, {
521
- F: __dxlog_file3,
522
- L: 34,
523
- S: void 0,
524
- C: (f, a) => f(...a)
525
- });
545
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 17, S: void 0 });
526
546
  return void 0;
527
547
  }
528
548
  const { key } = await response.json();
@@ -530,41 +550,26 @@ var uploadLogs = async (body) => {
530
550
  } catch (err) {
531
551
  log3.warn("feedback log upload error", {
532
552
  error: err
533
- }, {
534
- F: __dxlog_file3,
535
- L: 40,
536
- S: void 0,
537
- C: (f, a) => f(...a)
538
- });
553
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 25, S: void 0 });
539
554
  return void 0;
540
555
  }
541
556
  };
542
- var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logBuffer: externalLogBuffer }) {
557
+ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logStore, feedbackLogMaxSize }) {
543
558
  if (typeof window === "undefined") {
544
- log3("PostHog is being stubbed because it is running in a worker.", void 0, {
545
- F: __dxlog_file3,
546
- L: 54,
547
- S: this,
548
- C: (f, a) => f(...a)
549
- });
559
+ log3("PostHog is being stubbed because it is running in a worker.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 33, S: this });
550
560
  return stubExtension;
551
561
  }
552
562
  const feedbackSurveyId = config.get("runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID");
553
563
  const apiKey = config.get("runtime.app.env.DX_POSTHOG_API_KEY");
554
564
  const api_host = config.get("runtime.app.env.DX_POSTHOG_API_HOST");
555
565
  if (!apiKey || !api_host) {
556
- log3.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, {
557
- F: __dxlog_file3,
558
- L: 62,
559
- S: this,
560
- C: (f, a) => f(...a)
561
- });
566
+ log3.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 40, S: this });
562
567
  return stubExtension;
563
568
  }
564
569
  const { default: posthog } = yield* Effect4.promise(() => import("posthog-js"));
565
- const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-TKJVJJSJ.mjs"));
566
- const logBuffer = externalLogBuffer ?? new LogBuffer();
570
+ const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-ZODHERST.mjs"));
567
571
  let feedbackSurveyAvailable = null;
572
+ let unregisterPosthogProcessors;
568
573
  const checkFeedbackSurveyAvailable = () => feedbackSurveyId ? Effect4.promise(() => {
569
574
  if (feedbackSurveyAvailable !== null) {
570
575
  return Promise.resolve(feedbackSurveyAvailable);
@@ -595,19 +600,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
595
600
  } : {}
596
601
  });
597
602
  }
598
- log3.runtimeConfig.processors.push(logProcessor);
599
- log3.runtimeConfig.processors.push(logBuffer.logProcessor);
603
+ unregisterPosthogProcessors?.();
604
+ const removePosthogLog = log3.addProcessor(logProcessor, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 79, S: this });
605
+ unregisterPosthogProcessors = () => {
606
+ removePosthogLog();
607
+ };
600
608
  }),
601
609
  close: () => Effect4.sync(() => {
602
- for (const processor of [
603
- logProcessor,
604
- logBuffer.logProcessor
605
- ]) {
606
- const index = log3.runtimeConfig.processors.indexOf(processor);
607
- if (index !== -1) {
608
- log3.runtimeConfig.processors.splice(index, 1);
609
- }
610
- }
610
+ unregisterPosthogProcessors?.();
611
+ unregisterPosthogProcessors = void 0;
611
612
  }),
612
613
  enable: () => Effect4.sync(() => posthog.opt_in_capturing()),
613
614
  disable: () => Effect4.sync(() => posthog.opt_out_capturing()),
@@ -642,36 +643,47 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
642
643
  kind: "feedback",
643
644
  // TODO(wittjosiah): Support custom surveys.
644
645
  captureUserFeedback: (form) => {
645
- posthog.getSurveys(async (surveys) => {
646
- const survey = surveys.find((survey2) => survey2.id === feedbackSurveyId);
647
- if (!survey || survey.questions.length === 0) {
648
- log3.error("Missing feedback survey or survey has no questions", {
649
- feedbackSurveyId
650
- }, {
651
- F: __dxlog_file3,
652
- L: 151,
653
- S: this,
654
- C: (f, a) => f(...a)
655
- });
656
- return;
657
- }
658
- let debugLogDumpKey;
659
- if (form.includeLogs !== false && logBuffer.size > 0) {
660
- debugLogDumpKey = await uploadLogs(logBuffer.serialize());
661
- }
662
- const question = survey.questions[0];
663
- posthog.capture("survey sent", {
664
- $survey_id: survey.id,
665
- $survey_questions: [
666
- {
667
- id: question.id,
668
- question: question.question
646
+ return new Promise((resolve, reject) => {
647
+ posthog.getSurveys((surveys) => {
648
+ void (async () => {
649
+ try {
650
+ const survey = surveys.find((survey2) => survey2.id === feedbackSurveyId);
651
+ if (!survey || survey.questions.length === 0) {
652
+ log3.error("Missing feedback survey or survey has no questions", {
653
+ feedbackSurveyId
654
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 127, S: this });
655
+ resolve(void 0);
656
+ return;
657
+ }
658
+ let debugLogDumpKey = null;
659
+ if (form.includeLogs !== false && logStore !== void 0) {
660
+ const ndjson = await logStore.export({
661
+ maxSize: feedbackLogMaxSize
662
+ });
663
+ if (ndjson.length > 0) {
664
+ debugLogDumpKey = await uploadLogs(ndjson) ?? "failed";
665
+ }
666
+ }
667
+ const question = survey.questions[0];
668
+ const result = posthog.capture("survey sent", {
669
+ $survey_id: survey.id,
670
+ $survey_questions: [
671
+ {
672
+ id: question.id,
673
+ question: question.question
674
+ }
675
+ ],
676
+ [`$survey_response_${question.id}`]: form.message,
677
+ debug_log_dump_key: debugLogDumpKey
678
+ });
679
+ resolve(result?.uuid);
680
+ } catch (err) {
681
+ log3.error("Failed to capture user feedback", {
682
+ err
683
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 157, S: this });
684
+ reject(err);
669
685
  }
670
- ],
671
- [`$survey_response_${question.id}`]: form.message,
672
- ...debugLogDumpKey ? {
673
- debug_log_dump_key: debugLogDumpKey
674
- } : {}
686
+ })();
675
687
  });
676
688
  });
677
689
  },
@@ -737,19 +749,11 @@ var identityProvider = (clientServices) => Effect5.fn(function* (observability)
737
749
  });
738
750
  });
739
751
  var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
740
- const ctx = new Context(void 0, {
741
- F: __dxlog_file4,
742
- L: 61
743
- });
752
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 50 });
744
753
  let lastNetworkStatus;
745
754
  const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
746
755
  updateSignalMetrics.on(ctx, async () => {
747
- log4("send signal metrics", void 0, {
748
- F: __dxlog_file4,
749
- L: 67,
750
- S: this,
751
- C: (f, a) => f(...a)
752
- });
756
+ log4("send signal metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 55, S: this });
753
757
  lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
754
758
  observability.metrics.gauge("dxos.client.network.signal.connectionState", state, {
755
759
  server
@@ -794,20 +798,11 @@ var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
794
798
  };
795
799
  });
796
800
  var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
797
- const ctx = new Context(void 0, {
798
- F: __dxlog_file4,
799
- L: 121
800
- });
801
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 100 });
802
+ log4("runtimeMetricsProvider: requesting platform from SystemService", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 101, S: this });
801
803
  const platform = yield* Effect5.promise(() => clientServices.SystemService.getPlatform());
802
- invariant2(platform, "platform is required", {
803
- F: __dxlog_file4,
804
- L: 123,
805
- S: this,
806
- A: [
807
- "platform",
808
- "'platform is required'"
809
- ]
810
- });
804
+ log4("runtimeMetricsProvider: platform received", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 103, S: this });
805
+ invariant2(platform, "platform is required", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 104, S: this, A: ["platform", "'platform is required'"] });
811
806
  observability.setTags({
812
807
  platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
813
808
  platform: platform.platform,
@@ -831,33 +826,20 @@ var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
831
826
  }
832
827
  }).catch((error) => log4("platform error", {
833
828
  error
834
- }, {
835
- F: __dxlog_file4,
836
- L: 152,
837
- S: this,
838
- C: (f, a) => f(...a)
839
- }));
829
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 126, S: this }));
840
830
  }, RUNTIME_METRICS_MIN_INTERVAL);
841
831
  return async () => {
842
832
  await ctx.dispose();
843
833
  };
844
834
  });
845
835
  var spacesMetricsProvider = (client) => Effect5.fn(function* (observability) {
846
- const ctx = new Context(void 0, {
847
- F: __dxlog_file4,
848
- L: 165
849
- });
836
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 135 });
850
837
  const spaces = client.spaces.get();
851
838
  const subscriptions = /* @__PURE__ */ new Map();
852
839
  ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
853
840
  const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
854
841
  updateSpaceMetrics.on(ctx, async () => {
855
- log4("send space metrics", void 0, {
856
- F: __dxlog_file4,
857
- L: 173,
858
- S: this,
859
- C: (f, a) => f(...a)
860
- });
842
+ log4("send space metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 142, S: this });
861
843
  for (const data of mapSpaces(spaces, {
862
844
  truncateKeys: true
863
845
  })) {
@@ -978,12 +960,7 @@ var provider = (config) => (observability) => Effect6.gen(function* () {
978
960
  }).pipe(Effect6.provide(FetchHttpClient.layer), Effect6.catchAll((err) => Effect6.sync(() => {
979
961
  log5.verbose("ipdata fetch failed", {
980
962
  err
981
- }, {
982
- F: __dxlog_file5,
983
- L: 88,
984
- S: void 0,
985
- C: (f, a) => f(...a)
986
- });
963
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 54, S: void 0 });
987
964
  })));
988
965
 
989
966
  // src/providers/storage.ts