@rudderhq/server 0.7.0 → 0.7.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.
Files changed (139) hide show
  1. package/dist/bootstrap/register-api-routes.js +1 -1
  2. package/dist/bootstrap/register-api-routes.js.map +1 -1
  3. package/dist/bundled-plugins/plugin-linear/dist/worker.js +3 -1
  4. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +2 -2
  5. package/dist/product-analytics-collector-config.d.ts +33 -0
  6. package/dist/product-analytics-collector-config.d.ts.map +1 -0
  7. package/dist/product-analytics-collector-config.js +67 -0
  8. package/dist/product-analytics-collector-config.js.map +1 -0
  9. package/dist/product-analytics-collector-server.d.ts +26 -0
  10. package/dist/product-analytics-collector-server.d.ts.map +1 -0
  11. package/dist/product-analytics-collector-server.js +150 -0
  12. package/dist/product-analytics-collector-server.js.map +1 -0
  13. package/dist/routes/instance-settings.d.ts +1 -0
  14. package/dist/routes/instance-settings.d.ts.map +1 -1
  15. package/dist/routes/instance-settings.js +58 -0
  16. package/dist/routes/instance-settings.js.map +1 -1
  17. package/dist/routes/product-analytics-collector-report.d.ts +7 -0
  18. package/dist/routes/product-analytics-collector-report.d.ts.map +1 -0
  19. package/dist/routes/product-analytics-collector-report.js +159 -0
  20. package/dist/routes/product-analytics-collector-report.js.map +1 -0
  21. package/dist/routes/product-analytics-collector.d.ts +14 -2
  22. package/dist/routes/product-analytics-collector.d.ts.map +1 -1
  23. package/dist/routes/product-analytics-collector.js +141 -4
  24. package/dist/routes/product-analytics-collector.js.map +1 -1
  25. package/dist/routes/product-analytics.d.ts.map +1 -1
  26. package/dist/routes/product-analytics.js +40 -3
  27. package/dist/routes/product-analytics.js.map +1 -1
  28. package/dist/services/instance-settings.d.ts.map +1 -1
  29. package/dist/services/instance-settings.js +4 -0
  30. package/dist/services/instance-settings.js.map +1 -1
  31. package/dist/services/product-analytics-collector-maintenance.d.ts +25 -0
  32. package/dist/services/product-analytics-collector-maintenance.d.ts.map +1 -0
  33. package/dist/services/product-analytics-collector-maintenance.js +309 -0
  34. package/dist/services/product-analytics-collector-maintenance.js.map +1 -0
  35. package/dist/services/product-analytics-collector-maintenance.test.d.ts +2 -0
  36. package/dist/services/product-analytics-collector-maintenance.test.d.ts.map +1 -0
  37. package/dist/services/product-analytics-collector-maintenance.test.js +14 -0
  38. package/dist/services/product-analytics-collector-maintenance.test.js.map +1 -0
  39. package/dist/services/product-analytics-collector.d.ts +75 -3
  40. package/dist/services/product-analytics-collector.d.ts.map +1 -1
  41. package/dist/services/product-analytics-collector.js +363 -12
  42. package/dist/services/product-analytics-collector.js.map +1 -1
  43. package/dist/services/product-analytics-collector.test.js +25 -0
  44. package/dist/services/product-analytics-collector.test.js.map +1 -1
  45. package/dist/services/product-analytics-fixture.d.ts +7 -0
  46. package/dist/services/product-analytics-fixture.d.ts.map +1 -0
  47. package/dist/services/product-analytics-fixture.js +65 -0
  48. package/dist/services/product-analytics-fixture.js.map +1 -0
  49. package/dist/services/product-analytics-prd-gates.test.d.ts +2 -0
  50. package/dist/services/product-analytics-prd-gates.test.d.ts.map +1 -0
  51. package/dist/services/product-analytics-prd-gates.test.js +135 -0
  52. package/dist/services/product-analytics-prd-gates.test.js.map +1 -0
  53. package/dist/services/product-analytics.d.ts +17 -5
  54. package/dist/services/product-analytics.d.ts.map +1 -1
  55. package/dist/services/product-analytics.js +94 -12
  56. package/dist/services/product-analytics.js.map +1 -1
  57. package/package.json +17 -14
  58. package/ui-dist/assets/{LibraryLiveSurface-DeUIV5N_.js → LibraryLiveSurface-CZED7oKj.js} +1 -1
  59. package/ui-dist/assets/{abnfDiagram-VRR7QNED-BaoLM9Pd.js → abnfDiagram-VRR7QNED-BoPyIoAq.js} +1 -1
  60. package/ui-dist/assets/{arc-Cx0L6o2z.js → arc-DTYs4RCH.js} +1 -1
  61. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-zVfZP7v4.js → architectureDiagram-ZJ3FMSHR-BGfp2S_3.js} +1 -1
  62. package/ui-dist/assets/{blockDiagram-677ZJIJ3-BiWWFP9R.js → blockDiagram-677ZJIJ3-aW0EGIUf.js} +1 -1
  63. package/ui-dist/assets/{c4Diagram-LMCZKHZV-CX65GSJ6.js → c4Diagram-LMCZKHZV--1itKgA2.js} +1 -1
  64. package/ui-dist/assets/channel-DLNwhPnC.js +1 -0
  65. package/ui-dist/assets/{chunk-2Q5K7J3B-CH6PlelX.js → chunk-2Q5K7J3B-ZIqIozPQ.js} +1 -1
  66. package/ui-dist/assets/{chunk-32BRIVSS-C7ZEXYO8.js → chunk-32BRIVSS-DiwBEZVQ.js} +1 -1
  67. package/ui-dist/assets/{chunk-5VM5RSS4-CyInWuue.js → chunk-5VM5RSS4-CLOrTmL8.js} +1 -1
  68. package/ui-dist/assets/{chunk-EX3LRPZG-D58qFIdM.js → chunk-EX3LRPZG-D6xZzF47.js} +1 -1
  69. package/ui-dist/assets/{chunk-JWPE2WC7-CJ3Qx30f.js → chunk-JWPE2WC7-B9tYvTZl.js} +1 -1
  70. package/ui-dist/assets/{chunk-MOJQB5TN-BO4bKVLH.js → chunk-MOJQB5TN-D_qo-SzM.js} +1 -1
  71. package/ui-dist/assets/{chunk-RYQCIY6F-DxBmxcYc.js → chunk-RYQCIY6F-ChPHGc2P.js} +1 -1
  72. package/ui-dist/assets/{chunk-V7JOEXUC-Chdnd6Lq.js → chunk-V7JOEXUC-Dk6GbZYp.js} +1 -1
  73. package/ui-dist/assets/{chunk-VR4S4FIN-GkW_x_pD.js → chunk-VR4S4FIN-B6AREC1T.js} +1 -1
  74. package/ui-dist/assets/{chunk-XXDRQBXY-BJyBGcSF.js → chunk-XXDRQBXY-CUyO-JUr.js} +1 -1
  75. package/ui-dist/assets/classDiagram-OUVF2IWQ-JsIc-rlc.js +1 -0
  76. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-JsIc-rlc.js +1 -0
  77. package/ui-dist/assets/{cose-bilkent-JH36ORCC-BWP2r8TX.js → cose-bilkent-JH36ORCC-BCxIInLZ.js} +1 -1
  78. package/ui-dist/assets/{cynefin-VYW2F7L2-C08dfI3w.js → cynefin-VYW2F7L2-DqsnpnHA.js} +1 -1
  79. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-h6dXjTaO.js → cynefinDiagram-TSTJHNR4-BD7QQNLW.js} +1 -1
  80. package/ui-dist/assets/{dagre-VKFMJZFB-CWDgoFQD.js → dagre-VKFMJZFB-DaE160f7.js} +1 -1
  81. package/ui-dist/assets/{diagram-FQU43EPY-CK1j48d-.js → diagram-FQU43EPY-DZ0c59y8.js} +1 -1
  82. package/ui-dist/assets/{diagram-G47NLZAW-CoSiG57q.js → diagram-G47NLZAW-C_413g5E.js} +1 -1
  83. package/ui-dist/assets/{diagram-NH7WQ7WH-DRG-xXGQ.js → diagram-NH7WQ7WH-D_o9pXB-.js} +1 -1
  84. package/ui-dist/assets/{diagram-OA4YK3LP-D04mMwYs.js → diagram-OA4YK3LP-BI2xMqiW.js} +1 -1
  85. package/ui-dist/assets/{diagram-WEI45ONY-ZkC1ZQMq.js → diagram-WEI45ONY-hhM8R_14.js} +1 -1
  86. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-BxMIw9PZ.js → ebnfDiagram-CCIWWBDH-DfFgEtmG.js} +1 -1
  87. package/ui-dist/assets/{erDiagram-Q63AITRT-B4Zwbn84.js → erDiagram-Q63AITRT-CCw4ysHK.js} +1 -1
  88. package/ui-dist/assets/{flowDiagram-23GEKE2U-D5pYz8Px.js → flowDiagram-23GEKE2U-CzC1SMmo.js} +1 -1
  89. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-RSramodc.js → ganttDiagram-NO4QXBWP-CbPJIrIw.js} +1 -1
  90. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-BFQfCkMd.js → gitGraphDiagram-IHSO6WYX-jCxJ66_C.js} +1 -1
  91. package/ui-dist/assets/{graph-DuSS8poS.js → graph-BfNZ9Jzj.js} +1 -1
  92. package/ui-dist/assets/{index-DRbt_Svi.js → index-B3h9Vdxx.js} +1 -1
  93. package/ui-dist/assets/{index-9U78M9Np.js → index-B8q4cbOz.js} +1 -1
  94. package/ui-dist/assets/{index-olsHIcXs.js → index-BE1vSI6a.js} +1 -1
  95. package/ui-dist/assets/{index-B-NP8fOI.js → index-BKn4zRjf.js} +1 -1
  96. package/ui-dist/assets/{index-BKXUkeeU.js → index-BULll2e0.js} +1 -1
  97. package/ui-dist/assets/{index-BpvytaKr.js → index-BjxRqzZK.js} +1 -1
  98. package/ui-dist/assets/{index-Cyq94-QT.js → index-Bwo-C8W5.js} +1 -1
  99. package/ui-dist/assets/{index-BADa8mxG.js → index-ByUFNj0O.js} +1 -1
  100. package/ui-dist/assets/{index-CHbXMgL0.js → index-Chop-Dpa.js} +1 -1
  101. package/ui-dist/assets/{index-BU0KLNTt.js → index-Ck-ZNQeD.js} +541 -528
  102. package/ui-dist/assets/index-CxPYXL3t.css +1 -0
  103. package/ui-dist/assets/{index-wZlfBtwh.js → index-D00XdcOq.js} +1 -1
  104. package/ui-dist/assets/{index-BGcgy63z.js → index-D_K-9VDs.js} +1 -1
  105. package/ui-dist/assets/{index-DzdRgH-y.js → index-DiMDROQY.js} +1 -1
  106. package/ui-dist/assets/{index-5tzBDABj.js → index-DmjAbzHq.js} +1 -1
  107. package/ui-dist/assets/{index-De3vaw_P.js → index-SkHIC7Ma.js} +1 -1
  108. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-f5i4pO3J.js → infoDiagram-FWYZ7A6U-BkDimGw3.js} +1 -1
  109. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-CVEdv5i_.js → ishikawaDiagram-FXEZZL3T-BAyUfn6x.js} +1 -1
  110. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-Cvp7vWcy.js → journeyDiagram-5HDEW3XC-DlbpTZHG.js} +1 -1
  111. package/ui-dist/assets/{kanban-definition-HUTT4EX6-C6dURjjK.js → kanban-definition-HUTT4EX6-Cd67S14K.js} +1 -1
  112. package/ui-dist/assets/{layout-DxdOu9MY.js → layout-Dc4YEiCC.js} +1 -1
  113. package/ui-dist/assets/{linear-CRi8RB_7.js → linear-BhRsbD_5.js} +1 -1
  114. package/ui-dist/assets/{map-BlpDrw_l.js → map-CEWybj6z.js} +1 -1
  115. package/ui-dist/assets/{mermaid.core-2Gz9YusH.js → mermaid.core-CqqAFYNg.js} +4 -4
  116. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-BmSjJLTI.js → mindmap-definition-LN4V7U3C-CCb-XmEi.js} +1 -1
  117. package/ui-dist/assets/{pegDiagram-2B236MQR-BTUboUw8.js → pegDiagram-2B236MQR-CqUV14VZ.js} +1 -1
  118. package/ui-dist/assets/{pieDiagram-ENE6RG2P-CVPP8SYv.js → pieDiagram-ENE6RG2P-Dn_M_GRM.js} +1 -1
  119. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-BG4FmirT.js → quadrantDiagram-ABIIQ3AL-rAEhJDr2.js} +1 -1
  120. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-DFRNo9hF.js → railroadDiagram-RFXS5EU6-iE2o_jkH.js} +1 -1
  121. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-DpnVF9qP.js → requirementDiagram-TGXJPOKE-BFyKBR1h.js} +1 -1
  122. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-D1ETFdSE.js → sankeyDiagram-HTMAVEWB-DRa_2YB6.js} +1 -1
  123. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-CNqzB_AL.js → sequenceDiagram-DBY2YBRQ-BG8VIjD7.js} +1 -1
  124. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-DuoMCjdH.js → sizeCapture-X5ZJPWSS-CS1xlbzG.js} +1 -1
  125. package/ui-dist/assets/{stateDiagram-2N3HPSRC-fmHeKL8l.js → stateDiagram-2N3HPSRC-BSl2RUJ1.js} +1 -1
  126. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DUVNSzI8.js +1 -0
  127. package/ui-dist/assets/{swimlanes-5IMT3BWC-hjosaIhT.js → swimlanes-5IMT3BWC-BT8Hrm9J.js} +2 -2
  128. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DfLFj7sh.js +8 -0
  129. package/ui-dist/assets/{timeline-definition-FHXFAJF6-xoMEClc-.js → timeline-definition-FHXFAJF6-CfYIqEuQ.js} +1 -1
  130. package/ui-dist/assets/{vennDiagram-L72KCM5P-sdSXQfX-.js → vennDiagram-L72KCM5P-C8zBH7o9.js} +1 -1
  131. package/ui-dist/assets/{wardleyDiagram-EHGQE667-BbQBSKlD.js → wardleyDiagram-EHGQE667-D5HyFfI9.js} +1 -1
  132. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-BfAtadyK.js → xychartDiagram-FW5EYKEG-CGItJmLx.js} +1 -1
  133. package/ui-dist/index.html +2 -2
  134. package/ui-dist/assets/channel-CHc3ibOz.js +0 -1
  135. package/ui-dist/assets/classDiagram-OUVF2IWQ-9iLZpz3t.js +0 -1
  136. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-9iLZpz3t.js +0 -1
  137. package/ui-dist/assets/index-QrRs-r-4.css +0 -1
  138. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DajAVikh.js +0 -1
  139. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DJjG9OJ-.js +0 -8
@@ -0,0 +1,33 @@
1
+ export type ProductAnalyticsCollectorConfig = {
2
+ databaseUrl: string;
3
+ maintenanceDatabaseUrl: string;
4
+ reportDatabaseUrl: string;
5
+ databaseRole: string | null;
6
+ expectedDatabaseRole: string | null;
7
+ maintenanceDatabaseRole: string | null;
8
+ reportDatabaseRole: string | null;
9
+ schema: "rudder_analytics";
10
+ host: string;
11
+ port: number;
12
+ identityPublicKey: string;
13
+ identityIssuer: string;
14
+ identityKeyId: string;
15
+ anonymousAuthorization: string | null;
16
+ reportSecret: string | null;
17
+ revokeSecret: string | null;
18
+ consentSyncSecret: string | null;
19
+ retentionDays: number;
20
+ privacyThreshold: number;
21
+ rollupIntervalMs: number;
22
+ };
23
+ /** Parse the central deployment contract. Missing identity or DB settings fail closed. */
24
+ export declare function parseProductAnalyticsCollectorConfig(env?: NodeJS.ProcessEnv): ProductAnalyticsCollectorConfig;
25
+ export declare const PRODUCT_ANALYTICS_COLLECTOR_DEFAULTS: {
26
+ readonly host: "127.0.0.1";
27
+ readonly port: 4318;
28
+ readonly schema: "rudder_analytics";
29
+ readonly retentionDays: 90;
30
+ readonly privacyThreshold: 10;
31
+ readonly rollupIntervalMs: number;
32
+ };
33
+ //# sourceMappingURL=product-analytics-collector-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-analytics-collector-config.d.ts","sourceRoot":"","sources":["../src/product-analytics-collector-config.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,+BAA+B,GAAG;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAiBF,0FAA0F;AAC1F,wBAAgB,oCAAoC,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,+BAA+B,CA+B1H;AAED,eAAO,MAAM,oCAAoC;;;;;;;CAOvC,CAAC"}
@@ -0,0 +1,67 @@
1
+ const DEFAULT_HOST = "127.0.0.1";
2
+ const DEFAULT_PORT = 4318;
3
+ const DEFAULT_SCHEMA = "rudder_analytics";
4
+ const DEFAULT_RETENTION_DAYS = 90;
5
+ const DEFAULT_PRIVACY_THRESHOLD = 10;
6
+ const DEFAULT_ROLLUP_INTERVAL_MS = 15 * 60 * 1000;
7
+ function required(env, key) {
8
+ const value = env[key]?.trim();
9
+ if (!value)
10
+ throw new Error(`missing_${key.toLowerCase()}`);
11
+ return value;
12
+ }
13
+ function positiveInteger(env, key, fallback, limits) {
14
+ const raw = env[key]?.trim();
15
+ if (!raw)
16
+ return fallback;
17
+ if (!/^\d+$/.test(raw))
18
+ throw new Error(`invalid_${key.toLowerCase()}`);
19
+ const value = Number(raw);
20
+ if (!Number.isSafeInteger(value) || value < limits.min || value > limits.max)
21
+ throw new Error(`invalid_${key.toLowerCase()}`);
22
+ return value;
23
+ }
24
+ /** Parse the central deployment contract. Missing identity or DB settings fail closed. */
25
+ export function parseProductAnalyticsCollectorConfig(env = process.env) {
26
+ const schema = env.RUDDER_TELEMETRY_COLLECTOR_SCHEMA?.trim() || DEFAULT_SCHEMA;
27
+ if (schema !== DEFAULT_SCHEMA)
28
+ throw new Error("invalid_rudder_telemetry_collector_schema");
29
+ const port = positiveInteger(env, "RUDDER_TELEMETRY_COLLECTOR_PORT", DEFAULT_PORT, { min: 1, max: 65535 });
30
+ const retentionDays = positiveInteger(env, "RUDDER_TELEMETRY_COLLECTOR_RETENTION_DAYS", DEFAULT_RETENTION_DAYS, { min: 1, max: 3650 });
31
+ const privacyThreshold = positiveInteger(env, "RUDDER_TELEMETRY_COLLECTOR_PRIVACY_THRESHOLD", DEFAULT_PRIVACY_THRESHOLD, { min: 2, max: 100000 });
32
+ const rollupIntervalMs = positiveInteger(env, "RUDDER_TELEMETRY_COLLECTOR_ROLLUP_INTERVAL_MS", DEFAULT_ROLLUP_INTERVAL_MS, { min: 1000, max: 24 * 60 * 60 * 1000 });
33
+ const host = env.RUDDER_TELEMETRY_COLLECTOR_HOST?.trim() || DEFAULT_HOST;
34
+ if (host.length > 255)
35
+ throw new Error("invalid_rudder_telemetry_collector_host");
36
+ return {
37
+ databaseUrl: required(env, "RUDDER_TELEMETRY_COLLECTOR_DATABASE_URL"),
38
+ maintenanceDatabaseUrl: required(env, "RUDDER_TELEMETRY_COLLECTOR_MAINTENANCE_DATABASE_URL"),
39
+ reportDatabaseUrl: required(env, "RUDDER_TELEMETRY_COLLECTOR_REPORT_DATABASE_URL"),
40
+ databaseRole: env.RUDDER_TELEMETRY_COLLECTOR_DATABASE_ROLE?.trim() || null,
41
+ expectedDatabaseRole: env.RUDDER_TELEMETRY_COLLECTOR_EXPECTED_DATABASE_ROLE?.trim() || env.RUDDER_TELEMETRY_COLLECTOR_DATABASE_ROLE?.trim() || null,
42
+ maintenanceDatabaseRole: env.RUDDER_TELEMETRY_COLLECTOR_MAINTENANCE_DATABASE_ROLE?.trim() || null,
43
+ reportDatabaseRole: env.RUDDER_TELEMETRY_COLLECTOR_REPORT_DATABASE_ROLE?.trim() || null,
44
+ schema,
45
+ host,
46
+ port,
47
+ identityPublicKey: required(env, "RUDDER_TELEMETRY_COLLECTOR_IDENTITY_PUBLIC_KEY"),
48
+ identityIssuer: required(env, "RUDDER_TELEMETRY_COLLECTOR_IDENTITY_ISSUER"),
49
+ identityKeyId: required(env, "RUDDER_TELEMETRY_COLLECTOR_IDENTITY_KEY_ID"),
50
+ anonymousAuthorization: env.RUDDER_TELEMETRY_COLLECTOR_ANONYMOUS_AUTHORIZATION?.trim() || null,
51
+ reportSecret: env.RUDDER_TELEMETRY_COLLECTOR_REPORT_SECRET?.trim() || null,
52
+ revokeSecret: env.RUDDER_TELEMETRY_COLLECTOR_REVOKE_SECRET?.trim() || null,
53
+ consentSyncSecret: env.RUDDER_TELEMETRY_COLLECTOR_CONSENT_SYNC_SECRET?.trim() || null,
54
+ retentionDays,
55
+ privacyThreshold,
56
+ rollupIntervalMs,
57
+ };
58
+ }
59
+ export const PRODUCT_ANALYTICS_COLLECTOR_DEFAULTS = {
60
+ host: DEFAULT_HOST,
61
+ port: DEFAULT_PORT,
62
+ schema: DEFAULT_SCHEMA,
63
+ retentionDays: DEFAULT_RETENTION_DAYS,
64
+ privacyThreshold: DEFAULT_PRIVACY_THRESHOLD,
65
+ rollupIntervalMs: DEFAULT_ROLLUP_INTERVAL_MS,
66
+ };
67
+ //# sourceMappingURL=product-analytics-collector-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-analytics-collector-config.js","sourceRoot":"","sources":["../src/product-analytics-collector-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type Db } from "@rudderhq/db";
2
+ import { type Express } from "express";
3
+ import { type Server } from "node:http";
4
+ import { type ProductAnalyticsCollectorConfig } from "./product-analytics-collector-config.js";
5
+ export type ProductAnalyticsCollectorAppOptions = {
6
+ config: ProductAnalyticsCollectorConfig;
7
+ db: Db;
8
+ maintenanceDb?: Db;
9
+ reportDb: Db;
10
+ maintenance?: boolean;
11
+ };
12
+ export declare function createProductAnalyticsCollectorApp(options: ProductAnalyticsCollectorAppOptions): Express;
13
+ export type StartedProductAnalyticsCollector = {
14
+ app: Express;
15
+ server: Server;
16
+ host: string;
17
+ port: number;
18
+ config: ProductAnalyticsCollectorConfig;
19
+ stop(): Promise<void>;
20
+ };
21
+ export declare function startProductAnalyticsCollector(options?: {
22
+ config?: ProductAnalyticsCollectorConfig;
23
+ db?: Db;
24
+ listen?: boolean;
25
+ }): Promise<StartedProductAnalyticsCollector>;
26
+ //# sourceMappingURL=product-analytics-collector-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-analytics-collector-server.d.ts","sourceRoot":"","sources":["../src/product-analytics-collector-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;AACjD,OAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAwC,KAAK,+BAA+B,EAAE,MAAM,yCAAyC,CAAC;AASrI,MAAM,MAAM,mCAAmC,GAAG;IAChD,MAAM,EAAE,+BAA+B,CAAC;IACxC,EAAE,EAAE,EAAE,CAAC;IACP,aAAa,CAAC,EAAE,EAAE,CAAC;IACnB,QAAQ,EAAE,EAAE,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,mCAAmC,GAAG,OAAO,CAqDxG;AAED,MAAM,MAAM,gCAAgC,GAAG;IAC7C,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,+BAA+B,CAAC;IACxC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAEF,wBAAsB,8BAA8B,CAAC,OAAO,GAAE;IAC5D,MAAM,CAAC,EAAE,+BAA+B,CAAC;IACzC,EAAE,CAAC,EAAE,EAAE,CAAC;IACR,MAAM,CAAC,EAAE,OAAO,CAAC;CACb,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAiEjD"}
@@ -0,0 +1,150 @@
1
+ import { createDb } from "@rudderhq/db";
2
+ import express from "express";
3
+ import { createServer } from "node:http";
4
+ import { parseProductAnalyticsCollectorConfig } from "./product-analytics-collector-config.js";
5
+ import { productAnalyticsCollectorReportRoutes } from "./routes/product-analytics-collector-report.js";
6
+ import { createProductAnalyticsAssertionAuthorizer, productAnalyticsCollectorRoutes } from "./routes/product-analytics-collector.js";
7
+ import { assertProductAnalyticsCollectorDatabaseBoundary, runProductAnalyticsCollectorMaintenance, } from "./services/product-analytics-collector-maintenance.js";
8
+ import { createProductAnalyticsPersistentCollector } from "./services/product-analytics-collector.js";
9
+ export function createProductAnalyticsCollectorApp(options) {
10
+ const app = express();
11
+ app.disable("x-powered-by");
12
+ app.use(express.json({ limit: "64kb", strict: true, type: "application/json" }));
13
+ app.get(["/healthz", "/api/health"], (_req, res) => {
14
+ res.status(200).json({ ok: true, service: "product-analytics-collector", schema: options.config.schema });
15
+ });
16
+ const collector = createProductAnalyticsPersistentCollector(options.db);
17
+ const authorize = createProductAnalyticsAssertionAuthorizer({
18
+ identityPublicKey: options.config.identityPublicKey,
19
+ expectedKeyId: options.config.identityKeyId,
20
+ expectedIssuer: options.config.identityIssuer,
21
+ anonymousAuthorization: options.config.anonymousAuthorization,
22
+ });
23
+ app.use(productAnalyticsCollectorRoutes(collector, authorize, {
24
+ anonymousAuthorization: options.config.anonymousAuthorization,
25
+ revokeSecret: options.config.revokeSecret,
26
+ consentSyncSecret: options.config.consentSyncSecret,
27
+ }));
28
+ // Reports use a distinct read-only connection. The reader role is granted
29
+ // only report rollups/aggregates; it never serves the ingest or maintenance
30
+ // connection to report callers.
31
+ app.use(productAnalyticsCollectorReportRoutes(options.reportDb, {
32
+ reportSecret: options.config.reportSecret,
33
+ privacyThreshold: options.config.privacyThreshold,
34
+ }));
35
+ app.use((error, _req, res, _next) => {
36
+ const message = error instanceof Error ? error.message : "collector_request_failed";
37
+ const details = error && typeof error === "object" ? error : null;
38
+ if (details?.status === 400 || details?.type === "entity.parse.failed") {
39
+ res.status(400).json({ errorCode: "invalid_schema" });
40
+ return;
41
+ }
42
+ if (message.startsWith("Telemetry assertion") || message.startsWith("Telemetry installation")) {
43
+ res.status(401).json({ errorCode: "unauthorized" });
44
+ return;
45
+ }
46
+ if (message === "request entity too large" || message === "entity.too.large") {
47
+ res.status(413).json({ errorCode: "too_large" });
48
+ return;
49
+ }
50
+ res.status(500).json({ errorCode: "collector_request_failed" });
51
+ });
52
+ if (options.maintenance === true) {
53
+ if (!options.maintenanceDb) {
54
+ throw new Error("product_analytics_maintenance_database_required");
55
+ }
56
+ void runProductAnalyticsCollectorMaintenance(options.maintenanceDb, {
57
+ retentionDays: options.config.retentionDays,
58
+ privacyThreshold: options.config.privacyThreshold,
59
+ }).catch((error) => console.error("[product-analytics-collector] maintenance failed", error));
60
+ }
61
+ return app;
62
+ }
63
+ export async function startProductAnalyticsCollector(options = {}) {
64
+ const config = options.config ?? parseProductAnalyticsCollectorConfig();
65
+ const db = options.db ?? createDb(config.databaseUrl);
66
+ const maintenanceDb = options.db ? options.db : createDb(config.maintenanceDatabaseUrl);
67
+ const reportDb = options.db ? options.db : createDb(config.reportDatabaseUrl);
68
+ await assertProductAnalyticsCollectorDatabaseBoundary(db, config.expectedDatabaseRole);
69
+ await assertProductAnalyticsCollectorDatabaseBoundary(maintenanceDb, options.db ? config.expectedDatabaseRole : config.maintenanceDatabaseRole);
70
+ await assertProductAnalyticsCollectorDatabaseBoundary(reportDb, options.db ? config.expectedDatabaseRole : config.reportDatabaseRole);
71
+ // Project once before accepting traffic so a restart cannot expose stale
72
+ // rollups or leave retention cleanup waiting for the first interval tick.
73
+ await runProductAnalyticsCollectorMaintenance(maintenanceDb, {
74
+ retentionDays: config.retentionDays,
75
+ privacyThreshold: config.privacyThreshold,
76
+ });
77
+ const app = createProductAnalyticsCollectorApp({ config, db, maintenanceDb, reportDb, maintenance: false });
78
+ const server = createServer(app);
79
+ if (options.listen !== false) {
80
+ await new Promise((resolve, reject) => {
81
+ const onError = (error) => {
82
+ server.off("listening", onListening);
83
+ reject(error);
84
+ };
85
+ const onListening = () => {
86
+ server.off("error", onError);
87
+ resolve();
88
+ };
89
+ server.once("error", onError);
90
+ server.once("listening", onListening);
91
+ server.listen(config.port, config.host);
92
+ });
93
+ }
94
+ const interval = setInterval(() => {
95
+ void runProductAnalyticsCollectorMaintenance(maintenanceDb, {
96
+ retentionDays: config.retentionDays,
97
+ privacyThreshold: config.privacyThreshold,
98
+ }).catch((error) => console.error("[product-analytics-collector] maintenance failed", error));
99
+ }, config.rollupIntervalMs);
100
+ interval.unref?.();
101
+ return {
102
+ app,
103
+ server,
104
+ host: config.host,
105
+ port: config.port,
106
+ config,
107
+ async stop() {
108
+ clearInterval(interval);
109
+ await new Promise((resolve) => {
110
+ if (!server.listening) {
111
+ resolve();
112
+ return;
113
+ }
114
+ server.close(() => resolve());
115
+ });
116
+ const closableDb = db;
117
+ await closableDb.$client?.end?.({ timeout: 5 }).catch(() => undefined);
118
+ if (maintenanceDb !== db) {
119
+ const closableMaintenanceDb = maintenanceDb;
120
+ await closableMaintenanceDb.$client?.end?.({ timeout: 5 }).catch(() => undefined);
121
+ }
122
+ if (reportDb !== db && reportDb !== maintenanceDb) {
123
+ const closableReportDb = reportDb;
124
+ await closableReportDb.$client?.end?.({ timeout: 5 }).catch(() => undefined);
125
+ }
126
+ },
127
+ };
128
+ }
129
+ if (import.meta.url === `file://${process.argv[1]}`) {
130
+ startProductAnalyticsCollector().then((started) => {
131
+ let stopping = false;
132
+ const stop = async () => {
133
+ if (stopping)
134
+ return;
135
+ stopping = true;
136
+ try {
137
+ await started.stop();
138
+ }
139
+ finally {
140
+ process.exit(0);
141
+ }
142
+ };
143
+ process.once("SIGTERM", stop);
144
+ process.once("SIGINT", stop);
145
+ }).catch((error) => {
146
+ console.error("[product-analytics-collector] startup failed", error);
147
+ process.exitCode = 1;
148
+ });
149
+ }
150
+ //# sourceMappingURL=product-analytics-collector-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-analytics-collector-server.js","sourceRoot":"","sources":["../src/product-analytics-collector-server.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,6 @@ import type { Db } from "@rudderhq/db";
2
2
  import { type DeploymentMode } from "@rudderhq/shared";
3
3
  export declare function instanceSettingsRoutes(db: Db, opts: {
4
4
  deploymentMode: DeploymentMode;
5
+ instanceId?: string;
5
6
  }): import("express-serve-static-core").Router;
6
7
  //# sourceMappingURL=instance-settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"instance-settings.d.ts","sourceRoot":"","sources":["../../src/routes/instance-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AA8B1B,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,EAAE,EACN,IAAI,EAAE;IAAE,cAAc,EAAE,cAAc,CAAA;CAAE,8CAyOzC"}
1
+ {"version":3,"file":"instance-settings.d.ts","sourceRoot":"","sources":["../../src/routes/instance-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAoC1B,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,EAAE,EACN,IAAI,EAAE;IAAE,cAAc,EAAE,cAAc,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,8CAmS9D"}
@@ -5,6 +5,7 @@ import { validate } from "../middleware/validate.js";
5
5
  import { browserBrokerRegistry } from "../services/browser-broker.js";
6
6
  import { boardAuthService, instanceSettingsService, logActivity, operatorProfileService, } from "../services/index.js";
7
7
  import { createNativePathPicker, NativePathPickerUnsupportedError } from "../services/native-path-picker.js";
8
+ import { getProductAnalyticsInstallationState, reconcileProductAnalyticsInstallationMode, recordProductAnalyticsConsent, registerProductAnalyticsInstallation, } from "../services/product-analytics.js";
8
9
  import { assertBoard, getActorInfo } from "./authz.js";
9
10
  function assertCanManageInstanceSettings(req) {
10
11
  if (req.actor.type !== "board") {
@@ -26,6 +27,63 @@ export function instanceSettingsRoutes(db, opts) {
26
27
  const operatorProfiles = operatorProfileService(db);
27
28
  const boardAuth = boardAuthService(db);
28
29
  const pathPicker = createNativePathPicker();
30
+ const telemetryInstallationId = opts.instanceId ?? process.env.RUDDER_INSTANCE_ID ?? "default";
31
+ router.get("/instance/settings/product-analytics", async (req, res) => {
32
+ assertCanManageInstanceSettings(req);
33
+ const state = await getProductAnalyticsInstallationState(db, telemetryInstallationId);
34
+ const general = await svc.getGeneral();
35
+ const installationState = state?.installation.state;
36
+ const installationId = state?.installation.installationId ?? telemetryInstallationId;
37
+ const hasAnonymousPayloadPreview = installationState?.lastPayloadMode === "anonymous";
38
+ const maskedInstallationId = installationId.length > 6
39
+ ? `****${installationId.slice(-6)}`
40
+ : installationId.length > 0 ? `****${installationId}` : null;
41
+ res.json({
42
+ mode: general.productAnalyticsMode,
43
+ consentVersion: "v1",
44
+ consentEpoch: general.productAnalyticsConsentEpoch,
45
+ maskedInstallationId,
46
+ pendingCount: state?.pendingCount ?? 0,
47
+ lastAttemptedAt: typeof installationState?.lastAttemptedAt === "string" ? installationState.lastAttemptedAt : null,
48
+ lastSucceededAt: typeof installationState?.lastSucceededAt === "string" ? installationState.lastSucceededAt : null,
49
+ lastErrorCode: typeof installationState?.lastErrorCode === "string" ? installationState.lastErrorCode : null,
50
+ coverageGap: installationState?.coverageGap === true,
51
+ lastPayloadAt: hasAnonymousPayloadPreview && typeof installationState?.lastPayloadAt === "string" ? installationState.lastPayloadAt : null,
52
+ lastPayload: hasAnonymousPayloadPreview && Array.isArray(installationState?.lastPayload) ? installationState.lastPayload : null,
53
+ disclosure: {
54
+ collected: ["event names", "coarse version/platform dimensions", "pseudonymous ids"],
55
+ excluded: ["prompts", "transcripts", "file paths", "issue titles", "output content", "credentials"],
56
+ },
57
+ });
58
+ });
59
+ router.patch("/instance/settings/product-analytics", async (req, res) => {
60
+ assertCanManageInstanceSettings(req);
61
+ const mode = req.body?.mode;
62
+ if (mode !== "off" && mode !== "anonymous" && mode !== "account_linked") {
63
+ throw unprocessable("Product analytics mode is invalid");
64
+ }
65
+ const installation = await registerProductAnalyticsInstallation(db, { installationId: telemetryInstallationId });
66
+ if (!installation.installation && !installation.installationSecret) {
67
+ // Existing registrations are intentionally not returned with their secret.
68
+ // The local uploader keeps its credential separately.
69
+ }
70
+ const actor = getActorInfo(req);
71
+ const localUserId = mode === "account_linked" && actor.actorType === "user" ? actor.actorId : null;
72
+ if (mode === "account_linked" && (!localUserId || req.actor.source === "local_implicit"))
73
+ throw forbidden("Account-linked telemetry requires a signed-in user");
74
+ const scope = mode === "account_linked" ? "account_linked_user" : "anonymous_installation";
75
+ await recordProductAnalyticsConsent(db, {
76
+ installationId: telemetryInstallationId,
77
+ scope,
78
+ localUserId,
79
+ decision: mode === "off" ? "revoked" : "granted",
80
+ policyVersion: "v1",
81
+ decidedByLocalUserId: actor.actorType === "user" ? actor.actorId : null,
82
+ });
83
+ await reconcileProductAnalyticsInstallationMode(db, telemetryInstallationId, mode);
84
+ const updated = await svc.updateGeneral({ productAnalyticsMode: mode });
85
+ res.json({ mode: updated.general.productAnalyticsMode, consentEpoch: updated.general.productAnalyticsConsentEpoch });
86
+ });
29
87
  router.get("/instance/settings/general", async (req, res) => {
30
88
  assertCanManageInstanceSettings(req);
31
89
  res.json(await svc.getGeneral());
@@ -1 +1 @@
1
- {"version":3,"file":"instance-settings.js","sourceRoot":"","sources":["../../src/routes/instance-settings.ts"],"names":[],"mappings":"AACA,OAAO,EACL,+BAA+B,EAC/B,kCAAkC,EAClC,kCAAkC,EAClC,uCAAuC,EACvC,mCAAmC,EACnC,kCAAkC,GAEnC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAgB,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,gCAAgC,EAAE,MAAM,mCAAmC,CAAC;AAC7G,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEvD,SAAS,+BAA+B,CAAC,GAAY;IACnD,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC/B,MAAM,SAAS,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,gBAAgB,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QACvE,OAAO;IACT,CAAC;IACD,MAAM,SAAS,CAAC,gCAAgC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,0BAA0B,CAAC,cAA8B;IAChE,IAAI,cAAc,KAAK,eAAe,EAAE,CAAC;QACvC,MAAM,aAAa,CAAC,4DAA4D,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,EAAM,EACN,IAAwC;IAExC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,GAAG,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,sBAAsB,EAAE,CAAC;IAE5C,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1D,+BAA+B,CAAC,GAAG,CAAC,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1D,+BAA+B,CAAC,GAAG,CAAC,CAAC;QACrC,0BAA0B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChD,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,kCAAkC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAChE,+BAA+B,CAAC,GAAG,CAAC,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CACV,4BAA4B,EAC5B,QAAQ,CAAC,kCAAkC,CAAC,EAC5C,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjB,+BAA+B,CAAC,GAAG,CAAC,CAAC;QACrC,0BAA0B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;YAAE,qBAAqB,CAAC,MAAM,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnB,WAAW,CAAC,EAAE,EAAE;YACd,KAAK;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,mCAAmC;YAC3C,UAAU,EAAE,mBAAmB;YAC/B,QAAQ,EAAE,OAAO,CAAC,EAAE;YACpB,OAAO,EAAE;gBACP,QAAQ,EAAE,OAAO,CAAC,OAAO;gBACzB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;aAC1C;SACF,CAAC,CACH,CACF,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,KAAK,CACV,4BAA4B,EAC5B,QAAQ,CAAC,kCAAkC,CAAC,EAC5C,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjB,+BAA+B,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnB,WAAW,CAAC,EAAE,EAAE;YACd,KAAK;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,mCAAmC;YAC3C,UAAU,EAAE,mBAAmB;YAC/B,QAAQ,EAAE,OAAO,CAAC,EAAE;YACpB,OAAO,EAAE;gBACP,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;aAC1C;SACF,CAAC,CACH,CACF,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,KAAK,CACV,kCAAkC,EAClC,QAAQ,CAAC,uCAAuC,CAAC,EACjD,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjB,+BAA+B,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnB,WAAW,CAAC,EAAE,EAAE;YACd,KAAK;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,yCAAyC;YACjD,UAAU,EAAE,mBAAmB;YAC/B,QAAQ,EAAE,OAAO,CAAC,EAAE;YACpB,OAAO,EAAE;gBACP,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;aAC1C;SACF,CAAC,CACH,CACF,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1D,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,MAAM,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CACV,4BAA4B,EAC5B,QAAQ,CAAC,kCAAkC,CAAC,EAC5C,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjB,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,8BAA8B,CAAC;YAC5D,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnB,WAAW,CAAC,EAAE,EAAE;YACd,KAAK;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,mCAAmC;YAC3C,UAAU,EAAE,kBAAkB;YAC9B,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,cAAc;YAC5C,OAAO,EAAE;gBACP,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;aAC1C;SACF,CAAC,CACH,CACF,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,GAAG,CAAC,8BAA8B,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5D,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,MAAM,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CACV,8BAA8B,EAC9B,QAAQ,CAAC,mCAAmC,CAAC,EAC7C,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjB,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACnF,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,8BAA8B,CAAC;YAC5D,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnB,WAAW,CAAC,EAAE,EAAE;YACd,KAAK;YACL,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,qCAAqC;YAC7C,UAAU,EAAE,kBAAkB;YAC9B,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,cAAc;YAC5C,OAAO,EAAE;gBACP,iBAAiB,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;gBAChF,iBAAiB,EAAE,OAAO,CAAC,SAAS;qBACjC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;qBAChD,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;qBACpC,IAAI,EAAE;aACV;SACF,CAAC,CACH,CACF,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,QAAQ,CAAC,+BAA+B,CAAC,EACzC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjB,+BAA+B,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,cAAc,KAAK,eAAe,EAAE,CAAC;YAC5C,MAAM,aAAa,CAAC,6DAA6D,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3D,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,gCAAgC,EAAE,CAAC;gBACtD,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"instance-settings.js","sourceRoot":"","sources":["../../src/routes/instance-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Db } from "@rudderhq/db";
2
+ /** Read-only, aggregate-only central reporting surface. It never returns IDs or raw properties. */
3
+ export declare function productAnalyticsCollectorReportRoutes(db: Db, options: {
4
+ reportSecret: string | null;
5
+ privacyThreshold?: number;
6
+ }): import("express-serve-static-core").Router;
7
+ //# sourceMappingURL=product-analytics-collector-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-analytics-collector-report.d.ts","sourceRoot":"","sources":["../../src/routes/product-analytics-collector-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAgCvC,mGAAmG;AACnG,wBAAgB,qCAAqC,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;IAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,8CAkIhI"}
@@ -0,0 +1,159 @@
1
+ import { privateProductAnalyticsCollectorDailyRollups, privateProductAnalyticsCollectorPrivacyAggregates, privateProductAnalyticsCollectorQualityCounters, } from "@rudderhq/db";
2
+ import { and, gte, lte, sql } from "drizzle-orm";
3
+ import { Router } from "express";
4
+ import { timingSafeEqual } from "node:crypto";
5
+ function authorized(value, expected) {
6
+ if (!value || !expected)
7
+ return false;
8
+ const actual = Buffer.from(value);
9
+ const target = Buffer.from(expected);
10
+ return actual.length === target.length && timingSafeEqual(actual, target);
11
+ }
12
+ function window(req) {
13
+ const toRaw = typeof req.query.to === "string" ? req.query.to : undefined;
14
+ const fromRaw = typeof req.query.from === "string" ? req.query.from : undefined;
15
+ const toInput = toRaw ? new Date(toRaw) : new Date();
16
+ const fromInput = fromRaw ? new Date(fromRaw) : new Date(toInput.getTime() - 6 * 24 * 60 * 60 * 1000);
17
+ if (Number.isNaN(fromInput.getTime()) || Number.isNaN(toInput.getTime()) || fromInput > toInput)
18
+ throw new Error("invalid_window");
19
+ // Reports are built from UTC daily rollups. Normalize arbitrary timestamps
20
+ // to complete UTC days instead of implying sub-day precision we cannot
21
+ // recover after the raw event has been projected.
22
+ const from = new Date(Date.UTC(fromInput.getUTCFullYear(), fromInput.getUTCMonth(), fromInput.getUTCDate()));
23
+ const to = new Date(Date.UTC(toInput.getUTCFullYear(), toInput.getUTCMonth(), toInput.getUTCDate() + 1) - 1);
24
+ if (from >= to)
25
+ throw new Error("invalid_window");
26
+ return { from, to };
27
+ }
28
+ /** Read-only, aggregate-only central reporting surface. It never returns IDs or raw properties. */
29
+ export function productAnalyticsCollectorReportRoutes(db, options) {
30
+ const router = Router();
31
+ const privacyThreshold = options.privacyThreshold ?? 10;
32
+ router.get("/api/analytics/v1/report", async (req, res) => {
33
+ const bearer = req.header("authorization")?.replace(/^Bearer\s+/iu, "");
34
+ if (!authorized(bearer, options.reportSecret)) {
35
+ res.status(401).json({ errorCode: "unauthorized" });
36
+ return;
37
+ }
38
+ let range;
39
+ try {
40
+ range = window(req);
41
+ }
42
+ catch {
43
+ res.status(422).json({ errorCode: "invalid_window" });
44
+ return;
45
+ }
46
+ const retentionEventTo = new Date(range.to.getTime() + 35 * 24 * 60 * 60 * 1000);
47
+ // The report connection is intentionally limited to installation rollups
48
+ // and thresholded aggregates. Raw events, subjects, and installation
49
+ // registry rows are never readable by this route or its DB role.
50
+ const rollupRows = await db.select({
51
+ day: privateProductAnalyticsCollectorDailyRollups.day,
52
+ installationId: privateProductAnalyticsCollectorDailyRollups.installationId,
53
+ eventName: privateProductAnalyticsCollectorDailyRollups.eventName,
54
+ origin: privateProductAnalyticsCollectorDailyRollups.origin,
55
+ dimensions: privateProductAnalyticsCollectorDailyRollups.dimensions,
56
+ eventCount: privateProductAnalyticsCollectorDailyRollups.eventCount,
57
+ firstOccurredAt: privateProductAnalyticsCollectorDailyRollups.firstOccurredAt,
58
+ lastOccurredAt: privateProductAnalyticsCollectorDailyRollups.lastOccurredAt,
59
+ }).from(privateProductAnalyticsCollectorDailyRollups).where(and(gte(privateProductAnalyticsCollectorDailyRollups.day, range.from.toISOString().slice(0, 10)), lte(privateProductAnalyticsCollectorDailyRollups.day, retentionEventTo.toISOString().slice(0, 10))));
60
+ const production = rollupRows.filter((event) => event.dimensions?.environment === "production");
61
+ const reportProduction = production.filter((event) => new Date(event.firstOccurredAt) <= range.to);
62
+ const retentionProduction = production.filter((event) => new Date(event.lastOccurredAt) <= retentionEventTo);
63
+ const meaningful = new Set(["human_work_started", "review_decision_recorded", "work_loop_completed"]);
64
+ const productive = new Set(["output_ready", "work_loop_completed"]);
65
+ const distinct = (rows) => new Set(rows.map((row) => row.installationId)).size;
66
+ const at = (days, names) => {
67
+ const cutoff = new Date(range.to.getTime() - days * 24 * 60 * 60 * 1000);
68
+ return distinct(reportProduction.filter((event) => new Date(event.lastOccurredAt) >= cutoff && names.has(event.eventName)));
69
+ };
70
+ const quality = await db.select({
71
+ receivedBatches: sql `coalesce(sum(${privateProductAnalyticsCollectorQualityCounters.receivedBatches}), 0)::int`,
72
+ accepted: sql `coalesce(sum(${privateProductAnalyticsCollectorQualityCounters.acceptedEvents}), 0)::int`,
73
+ late: sql `coalesce(sum(${privateProductAnalyticsCollectorQualityCounters.lateEvents}), 0)::int`,
74
+ duplicate: sql `coalesce(sum(${privateProductAnalyticsCollectorQualityCounters.duplicateEvents}), 0)::int`,
75
+ rejected: sql `coalesce(sum(${privateProductAnalyticsCollectorQualityCounters.rejectedEvents}), 0)::int`,
76
+ }).from(privateProductAnalyticsCollectorQualityCounters).where(and(gte(privateProductAnalyticsCollectorQualityCounters.day, range.from.toISOString().slice(0, 10)), lte(privateProductAnalyticsCollectorQualityCounters.day, range.to.toISOString().slice(0, 10))));
77
+ const aggregateRows = await db.select({
78
+ metricName: privateProductAnalyticsCollectorPrivacyAggregates.metricName,
79
+ metricValue: privateProductAnalyticsCollectorPrivacyAggregates.metricValue,
80
+ contributingInstallations: privateProductAnalyticsCollectorPrivacyAggregates.contributingInstallations,
81
+ privacyThreshold: privateProductAnalyticsCollectorPrivacyAggregates.privacyThreshold,
82
+ dimensionValues: privateProductAnalyticsCollectorPrivacyAggregates.dimensionValues,
83
+ }).from(privateProductAnalyticsCollectorPrivacyAggregates).where(and(gte(privateProductAnalyticsCollectorPrivacyAggregates.day, range.from.toISOString().slice(0, 10)), lte(privateProductAnalyticsCollectorPrivacyAggregates.day, range.to.toISOString().slice(0, 10))));
84
+ const loops = aggregateRows
85
+ .filter((row) => row.metricName === "weekly_completed_work_loops")
86
+ .reduce((sum, row) => sum + Number(row.metricValue), 0);
87
+ const firstSeenByInstallation = new Map();
88
+ for (const event of retentionProduction) {
89
+ const firstSeen = firstSeenByInstallation.get(event.installationId);
90
+ const candidate = new Date(event.firstOccurredAt);
91
+ if (!firstSeen || candidate < firstSeen)
92
+ firstSeenByInstallation.set(event.installationId, candidate);
93
+ }
94
+ const meaningfulEventsByInstallation = new Map();
95
+ for (const event of retentionProduction) {
96
+ if (meaningful.has(event.eventName)) {
97
+ const dates = meaningfulEventsByInstallation.get(event.installationId) ?? [];
98
+ dates.push(new Date(event.lastOccurredAt));
99
+ meaningfulEventsByInstallation.set(event.installationId, dates);
100
+ }
101
+ }
102
+ const loopRetentionByCohort = new Map();
103
+ for (const row of aggregateRows.filter((value) => value.metricName === "work_loop_retention")) {
104
+ const cohortDay = typeof row.dimensionValues?.cohort_day === "string" ? row.dimensionValues.cohort_day : null;
105
+ const window = row.dimensionValues?.window;
106
+ if (!cohortDay || (window !== "w1" && window !== "w4"))
107
+ continue;
108
+ const retention = loopRetentionByCohort.get(cohortDay) ?? { w1: 0, w4: 0 };
109
+ retention[window] = Number(row.metricValue);
110
+ loopRetentionByCohort.set(cohortDay, retention);
111
+ }
112
+ const cohorts = new Map();
113
+ for (const [installationId, firstSeen] of firstSeenByInstallation) {
114
+ const cohortDay = firstSeen.toISOString().slice(0, 10);
115
+ const row = cohorts.get(cohortDay) ?? { eligibleInstallations: 0, meaningfulW1: 0, loopW1: 0, loopW4: 0 };
116
+ const meaningfulDates = meaningfulEventsByInstallation.get(installationId) ?? [];
117
+ const inWindow = (date, startDays, endDays) => {
118
+ const start = firstSeen.getTime() + startDays * 24 * 60 * 60 * 1000;
119
+ const end = firstSeen.getTime() + endDays * 24 * 60 * 60 * 1000;
120
+ return date.getTime() >= start && date.getTime() < end;
121
+ };
122
+ if (firstSeen <= range.to && firstSeen >= range.from)
123
+ row.eligibleInstallations += 1;
124
+ if (firstSeen <= range.to && meaningfulDates.some((date) => inWindow(date, 7, 14)))
125
+ row.meaningfulW1 += 1;
126
+ const loopRetention = loopRetentionByCohort.get(cohortDay);
127
+ if (firstSeen <= range.to && loopRetention) {
128
+ row.loopW1 = loopRetention.w1;
129
+ row.loopW4 = loopRetention.w4;
130
+ }
131
+ cohorts.set(cohortDay, row);
132
+ }
133
+ res.json({
134
+ window: { from: range.from.toISOString(), to: range.to.toISOString(), timezone: "UTC" },
135
+ metrics: {
136
+ meaningfulActiveInstallations1d: at(1, meaningful),
137
+ meaningfulActiveInstallations7d: at(7, meaningful),
138
+ productiveInstallations7d: at(7, productive),
139
+ weeklyCompletedWorkLoops: loops,
140
+ meaningfulDau: at(1, meaningful),
141
+ productiveWau: at(7, productive),
142
+ },
143
+ quality: { receivedBatchCount: Number(quality[0]?.receivedBatches ?? 0), acceptedEventCount: Number(quality[0]?.accepted ?? 0), lateEventCount: Number(quality[0]?.late ?? 0), duplicateEventCount: Number(quality[0]?.duplicate ?? 0), rejectedEventCount: Number(quality[0]?.rejected ?? 0), aggregateRows: aggregateRows.length },
144
+ privacy: { aggregateRows: aggregateRows.map((row) => ({ metricName: row.metricName, metricValue: row.metricValue, contributingInstallations: row.contributingInstallations, privacyThreshold: row.privacyThreshold })) },
145
+ coverage: {
146
+ accountLinkedEventCount: reportProduction.filter((event) => event.dimensions?.analytics_mode === "account_linked").reduce((sum, event) => sum + Number(event.eventCount), 0),
147
+ anonymousEventCount: reportProduction.filter((event) => event.dimensions?.analytics_mode !== "account_linked").reduce((sum, event) => sum + Number(event.eventCount), 0),
148
+ },
149
+ retention: [...cohorts.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([cohortDay, row]) => {
150
+ const suppressed = row.eligibleInstallations < privacyThreshold;
151
+ return suppressed
152
+ ? { cohortDay, eligibleInstallations: null, meaningfulW1: null, loopW1: null, loopW4: null, suppressed: true }
153
+ : { cohortDay, ...row, suppressed: false };
154
+ }),
155
+ });
156
+ });
157
+ return router;
158
+ }
159
+ //# sourceMappingURL=product-analytics-collector-report.js.map