@od-oneapp/analytics 2026.2.1701 → 2026.2.2001-canary.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 (82) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/{ai-YMnynb-t.mjs → ai-BSaTnqoc.mjs} +2 -2
  3. package/{ai-YMnynb-t.mjs.map → ai-BSaTnqoc.mjs.map} +1 -1
  4. package/{client-D339NFJS.mjs → client-B0v807xN.mjs} +1 -1
  5. package/{client-D339NFJS.mjs.map → client-B0v807xN.mjs.map} +1 -1
  6. package/{client-CcFTauAh.mjs → client-BrLI6DF9.mjs} +1 -1
  7. package/{client-CcFTauAh.mjs.map → client-BrLI6DF9.mjs.map} +1 -1
  8. package/{client-CeOLjbac.mjs → client-ClA-Qeks.mjs} +21 -6
  9. package/client-ClA-Qeks.mjs.map +1 -0
  10. package/client-next.d.mts +7 -7
  11. package/client-next.d.mts.map +1 -1
  12. package/client-next.mjs +1616 -31
  13. package/client-next.mjs.map +1 -1
  14. package/{client-CTzJVFU5.mjs → client-uX7stpb0.mjs} +2 -2
  15. package/{client-CTzJVFU5.mjs.map → client-uX7stpb0.mjs.map} +1 -1
  16. package/client.d.mts +9 -9
  17. package/client.mjs +8 -116
  18. package/client.mjs.map +1 -1
  19. package/{config-DPS6bSYo.d.mts → config-BA1zbRTh.d.mts} +2 -2
  20. package/{config-DPS6bSYo.d.mts.map → config-BA1zbRTh.d.mts.map} +1 -1
  21. package/{config-P6P5adJg.mjs → config-DKN8G0TI.mjs} +1 -1
  22. package/{config-P6P5adJg.mjs.map → config-DKN8G0TI.mjs.map} +1 -1
  23. package/{console-8bND3mMU.mjs → console-CDP0gY0K.mjs} +2 -2
  24. package/console-CDP0gY0K.mjs.map +1 -0
  25. package/core-C3oFD9Vr.mjs +95 -0
  26. package/core-C3oFD9Vr.mjs.map +1 -0
  27. package/{ecommerce-Cgu4wlux.mjs → ecommerce-DAo98u3I.mjs} +2 -2
  28. package/{ecommerce-Cgu4wlux.mjs.map → ecommerce-DAo98u3I.mjs.map} +1 -1
  29. package/{emitters-DldkVSPp.d.mts → emitters-B2gDJtjd.d.mts} +2 -2
  30. package/{emitters-DldkVSPp.d.mts.map → emitters-B2gDJtjd.d.mts.map} +1 -1
  31. package/{emitters-6-nKo8i-.mjs → emitters-RheHbeX2.mjs} +1 -1
  32. package/{emitters-6-nKo8i-.mjs.map → emitters-RheHbeX2.mjs.map} +1 -1
  33. package/{index-jPzXRn52.d.mts → index-Bq051UsT.d.mts} +3 -3
  34. package/{index-jPzXRn52.d.mts.map → index-Bq051UsT.d.mts.map} +1 -1
  35. package/{index-BfNWgfa5.d.mts → index-CuDXrdLY.d.mts} +14 -2
  36. package/{index-BfNWgfa5.d.mts.map → index-CuDXrdLY.d.mts.map} +1 -1
  37. package/{index-BkIWe--N.d.mts → index-uQHwlV0P.d.mts} +2 -2
  38. package/{index-BkIWe--N.d.mts.map → index-uQHwlV0P.d.mts.map} +1 -1
  39. package/logs-8LsA--uG.mjs +112 -0
  40. package/logs-8LsA--uG.mjs.map +1 -0
  41. package/{manager-DvRRjza6.d.mts → manager-Dh9loalA.d.mts} +3 -2
  42. package/manager-Dh9loalA.d.mts.map +1 -0
  43. package/module-D5xR4CAy.mjs +5808 -0
  44. package/module-D5xR4CAy.mjs.map +1 -0
  45. package/package.json +21 -27
  46. package/{posthog-bootstrap-DWxFrxlt.d.mts → posthog-bootstrap-D7Ot--Qc.d.mts} +3 -3
  47. package/{posthog-bootstrap-DWxFrxlt.d.mts.map → posthog-bootstrap-D7Ot--Qc.d.mts.map} +1 -1
  48. package/{posthog-bootstrap-CYfIy_WS.mjs → posthog-bootstrap-DkDBbvMJ.mjs} +81 -46
  49. package/posthog-bootstrap-DkDBbvMJ.mjs.map +1 -0
  50. package/providers-http-client.d.mts +1 -1
  51. package/providers-http-client.d.mts.map +1 -1
  52. package/providers-http-client.mjs +35 -7
  53. package/providers-http-client.mjs.map +1 -1
  54. package/providers-http-server.d.mts +1 -1
  55. package/providers-http-server.d.mts.map +1 -1
  56. package/providers-http-server.mjs +19 -3
  57. package/providers-http-server.mjs.map +1 -1
  58. package/providers-http.d.mts +9 -1
  59. package/providers-http.d.mts.map +1 -1
  60. package/server-edge.d.mts +3 -3
  61. package/server-edge.mjs +4 -4
  62. package/server-edge.mjs.map +1 -1
  63. package/server-next.d.mts +9 -9
  64. package/server-next.mjs +5 -5
  65. package/server.d.mts +9 -9
  66. package/server.mjs +5 -5
  67. package/{service-Duqnlppl.mjs → service-tn0JFfVH.mjs} +49 -116
  68. package/service-tn0JFfVH.mjs.map +1 -0
  69. package/shared.d.mts +4 -4
  70. package/shared.mjs +3 -3
  71. package/{types-BxBnNQ0V.d.mts → types-BbXOa_UL.d.mts} +1 -1
  72. package/{types-BxBnNQ0V.d.mts.map → types-BbXOa_UL.d.mts.map} +1 -1
  73. package/{types-CBvxUEaF.d.mts → types-DC5uYgdR.d.mts} +1 -1
  74. package/{types-CBvxUEaF.d.mts.map → types-DC5uYgdR.d.mts.map} +1 -1
  75. package/types.d.mts +3 -3
  76. package/{vercel-types-lwakUfoI.d.mts → vercel-types-tUdlBxJ-.d.mts} +1 -1
  77. package/{vercel-types-lwakUfoI.d.mts.map → vercel-types-tUdlBxJ-.d.mts.map} +1 -1
  78. package/client-CeOLjbac.mjs.map +0 -1
  79. package/console-8bND3mMU.mjs.map +0 -1
  80. package/manager-DvRRjza6.d.mts.map +0 -1
  81. package/posthog-bootstrap-CYfIy_WS.mjs.map +0 -1
  82. package/service-Duqnlppl.mjs.map +0 -1
package/package.json CHANGED
@@ -1,67 +1,61 @@
1
1
  {
2
2
  "name": "@od-oneapp/analytics",
3
- "version": "2026.2.1701",
3
+ "version": "2026.2.2001-canary.1",
4
4
  "description": "Multi-provider analytics package with type-safe event tracking",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "exports": {
8
8
  "./client": {
9
+ "types": "./client.d.mts",
9
10
  "import": "./client.mjs",
10
- "types": "./client.d.mts"
11
+ "default": "./client.mjs"
11
12
  },
12
13
  "./server": {
14
+ "types": "./server.d.mts",
13
15
  "import": "./server.mjs",
14
- "types": "./server.d.mts"
16
+ "default": "./server.mjs"
15
17
  },
16
18
  "./client/next": {
19
+ "types": "./client-next.d.mts",
17
20
  "import": "./client-next.mjs",
18
- "types": "./client-next.d.mts"
21
+ "default": "./client-next.mjs"
19
22
  },
20
23
  "./server/next": {
24
+ "types": "./server-next.d.mts",
21
25
  "import": "./server-next.mjs",
22
- "types": "./server-next.d.mts"
26
+ "default": "./server-next.mjs"
23
27
  },
24
28
  "./server/edge": {
29
+ "types": "./server-edge.d.mts",
25
30
  "import": "./server-edge.mjs",
26
- "types": "./server-edge.d.mts"
31
+ "default": "./server-edge.mjs"
27
32
  },
28
33
  "./shared": {
34
+ "types": "./shared.d.mts",
29
35
  "import": "./shared.mjs",
30
- "types": "./shared.d.mts"
36
+ "default": "./shared.mjs"
31
37
  },
32
38
  "./types": {
39
+ "types": "./types.d.mts",
33
40
  "import": "./types.mjs",
34
- "types": "./types.d.mts"
41
+ "default": "./types.mjs"
35
42
  },
36
43
  "./providers/http": {
44
+ "types": "./providers-http.d.mts",
37
45
  "import": "./providers-http.mjs",
38
- "types": "./providers-http.d.mts"
46
+ "default": "./providers-http.mjs"
39
47
  },
40
48
  "./providers/http/client": {
49
+ "types": "./providers-http-client.d.mts",
41
50
  "import": "./providers-http-client.mjs",
42
- "types": "./providers-http-client.d.mts"
51
+ "default": "./providers-http-client.mjs"
43
52
  },
44
53
  "./providers/http/server": {
54
+ "types": "./providers-http-server.d.mts",
45
55
  "import": "./providers-http-server.mjs",
46
- "types": "./providers-http-server.d.mts"
56
+ "default": "./providers-http-server.mjs"
47
57
  }
48
58
  },
49
- "dependencies": {
50
- "posthog-js": "^1.301.2",
51
- "posthog-node": "^5.24.15",
52
- "@segment/analytics-node": "^2.3.0",
53
- "@vercel/analytics": "^1.6.1",
54
- "@t3-oss/env-core": "^0.13.10",
55
- "@od-oneapp/observability": "2026.2.1701",
56
- "@od-oneapp/shared": "2026.2.1701"
57
- },
58
- "optionalDependencies": {
59
- "@segment/analytics-next": "^1.81.1",
60
- "@flags-sdk/edge-config": "^0.1.2",
61
- "@flags-sdk/openfeature": "^0.1.2",
62
- "@vercel/analytics": "^1.6.1",
63
- "@vercel/blob": "^2.2.0"
64
- },
65
59
  "peerDependencies": {
66
60
  "next": ">=14.0.0",
67
61
  "react": ">=18.0.0",
@@ -1,5 +1,5 @@
1
- import { C as EmitterPagePayload, D as EmitterTrackPayload, b as EmitterIdentifyPayload, g as EmitterContext, p as EmitterAliasPayload, v as EmitterGroupPayload, w as EmitterPayload } from "./types-BxBnNQ0V.mjs";
2
- import { s as BootstrapData } from "./vercel-types-lwakUfoI.mjs";
1
+ import { C as EmitterPagePayload, D as EmitterTrackPayload, b as EmitterIdentifyPayload, g as EmitterContext, p as EmitterAliasPayload, v as EmitterGroupPayload, w as EmitterPayload } from "./types-BbXOa_UL.mjs";
2
+ import { s as BootstrapData } from "./vercel-types-tUdlBxJ-.mjs";
3
3
 
4
4
  //#region src/shared/emitters/helpers.d.ts
5
5
  declare class ContextBuilder {
@@ -78,4 +78,4 @@ declare function createBootstrapData(distinctId: string): BootstrapData;
78
78
  declare function createMinimalBootstrapData(distinctId?: string): BootstrapData;
79
79
  //#endregion
80
80
  export { ContextBuilder as a, createAnonymousSession as c, isGroupPayload as d, isIdentifyPayload as f, withUTM as g, withMetadata as h, getDistinctIdFromCookies as i, createUserSession as l, isTrackPayload as m, createMinimalBootstrapData as n, EventBatch as o, isPagePayload as p, generateDistinctId as r, PayloadBuilder as s, createBootstrapData as t, isAliasPayload as u };
81
- //# sourceMappingURL=posthog-bootstrap-DWxFrxlt.d.mts.map
81
+ //# sourceMappingURL=posthog-bootstrap-D7Ot--Qc.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"posthog-bootstrap-DWxFrxlt.d.mts","names":[],"sources":["../src/shared/emitters/helpers.ts","../src/shared/utils/posthog-bootstrap.ts"],"mappings":"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"}
1
+ {"version":3,"file":"posthog-bootstrap-D7Ot--Qc.d.mts","names":[],"sources":["../src/shared/emitters/helpers.ts","../src/shared/utils/posthog-bootstrap.ts"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { i as page, n as group, o as track, r as identify, t as alias } from "./emitters-6-nKo8i-.mjs";
2
- import { logWarn } from "@od-oneapp/shared/logger";
1
+ import { i as logWarn } from "./core-C3oFD9Vr.mjs";
2
+ import { i as page, n as group, o as track, r as identify, t as alias } from "./emitters-RheHbeX2.mjs";
3
3
 
4
4
  //#region src/shared/utils/rate-limit.ts
5
5
  /**
@@ -253,7 +253,10 @@ const XSS_PATTERNS = {
253
253
  * ```
254
254
  */
255
255
  function containsPII(value) {
256
- return Object.values(PII_PATTERNS).some((pattern) => pattern.test(value));
256
+ return Object.values(PII_PATTERNS).some((pattern) => {
257
+ pattern.lastIndex = 0;
258
+ return pattern.test(value);
259
+ });
257
260
  }
258
261
  /**
259
262
  * Redact PII from a string.
@@ -272,7 +275,10 @@ function containsPII(value) {
272
275
  */
273
276
  function redactPII(value) {
274
277
  let redacted = value;
275
- for (const [type, pattern] of Object.entries(PII_PATTERNS)) redacted = redacted.replace(pattern, `[REDACTED_${type.toUpperCase()}]`);
278
+ for (const [type, pattern] of Object.entries(PII_PATTERNS)) {
279
+ pattern.lastIndex = 0;
280
+ redacted = redacted.replace(pattern, `[REDACTED_${type.toUpperCase()}]`);
281
+ }
276
282
  return redacted;
277
283
  }
278
284
  /**
@@ -488,6 +494,7 @@ function sanitizeProperties(properties, options = {}) {
488
494
  * - Non-empty string
489
495
  * - Not exceeding 255 characters
490
496
  * - No XSS patterns
497
+ * - Only alphanumeric characters, spaces, dots, underscores, and hyphens
491
498
  *
492
499
  * @param {string} event - Event name to validate
493
500
  * @returns {{ valid: boolean; reason?: string }} Validation result with reason if invalid
@@ -513,10 +520,17 @@ function validateEventName(event) {
513
520
  valid: false,
514
521
  reason: "Event name cannot exceed 255 characters"
515
522
  };
516
- if (Object.values(XSS_PATTERNS).some((pattern) => pattern.test(event))) return {
523
+ if (Object.values(XSS_PATTERNS).some((pattern) => {
524
+ pattern.lastIndex = 0;
525
+ return pattern.test(event);
526
+ })) return {
517
527
  valid: false,
518
528
  reason: "Event name contains potentially malicious content"
519
529
  };
530
+ if (!/^[\s\w.-]+$/.test(event)) return {
531
+ valid: false,
532
+ reason: "Event name can only contain alphanumeric characters, spaces, dots, underscores, and hyphens"
533
+ };
520
534
  return { valid: true };
521
535
  }
522
536
 
@@ -714,14 +728,24 @@ var AnalyticsManager = class {
714
728
  getContext() {
715
729
  return { ...this.context };
716
730
  }
731
+ /**
732
+ * Build per-call context without mutating global manager state.
733
+ */
734
+ mergeCallContext(options, extraContext) {
735
+ return {
736
+ ...this.context,
737
+ ...options?.context ?? {},
738
+ ...extraContext ?? {}
739
+ };
740
+ }
717
741
  async track(eventOrPayload, properties, options) {
718
742
  if (typeof eventOrPayload === "object") {
719
743
  const payload = eventOrPayload;
720
744
  return this.track(payload.event, payload.properties, {
721
745
  ...options,
722
746
  context: {
723
- ...this.context,
724
- ...payload.context
747
+ ...options?.context ?? {},
748
+ ...payload.context ?? {}
725
749
  }
726
750
  });
727
751
  }
@@ -748,9 +772,10 @@ var AnalyticsManager = class {
748
772
  stripHTML: true,
749
773
  allowDangerousKeys: false
750
774
  });
751
- const targetProviders = this.getTargetProviders(options);
775
+ const targetProviders = await this.getTargetProviders(options);
776
+ const callContext = this.mergeCallContext(options);
752
777
  const enhancedProperties = {
753
- ...this.context,
778
+ ...callContext,
754
779
  ...sanitized.data
755
780
  };
756
781
  const promises = [...targetProviders.entries()].map(async ([name, provider]) => {
@@ -764,7 +789,7 @@ var AnalyticsManager = class {
764
789
  return;
765
790
  }
766
791
  try {
767
- await provider.track(event, enhancedProperties, this.context);
792
+ await provider.track(event, enhancedProperties, callContext);
768
793
  const metrics = this.providerMetrics.get(name);
769
794
  if (metrics) {
770
795
  metrics.callCount++;
@@ -790,8 +815,8 @@ var AnalyticsManager = class {
790
815
  return this.identify(payload.userId, payload.traits, {
791
816
  ...options,
792
817
  context: {
793
- ...this.context,
794
- ...payload.context
818
+ ...options?.context ?? {},
819
+ ...payload.context ?? {}
795
820
  }
796
821
  });
797
822
  }
@@ -809,11 +834,11 @@ var AnalyticsManager = class {
809
834
  stripHTML: true,
810
835
  allowDangerousKeys: false
811
836
  });
812
- this.setContext({
837
+ const targetProviders = await this.getTargetProviders(options);
838
+ const callContext = this.mergeCallContext(options, {
813
839
  userId,
814
840
  ...sanitized.data
815
841
  });
816
- const targetProviders = this.getTargetProviders(options);
817
842
  const enhancedTraits = { ...sanitized.data };
818
843
  const promises = [...targetProviders.entries()].map(async ([name, provider]) => {
819
844
  if (provider.identify) {
@@ -829,7 +854,7 @@ var AnalyticsManager = class {
829
854
  try {
830
855
  await provider.identify(userId, enhancedTraits, {
831
856
  ...options,
832
- context: this.context
857
+ context: callContext
833
858
  });
834
859
  const metrics = this.providerMetrics.get(name);
835
860
  if (metrics) {
@@ -857,8 +882,8 @@ var AnalyticsManager = class {
857
882
  return this.page(payload.name, payload.properties, {
858
883
  ...options,
859
884
  context: {
860
- ...this.context,
861
- ...payload.context
885
+ ...options?.context ?? {},
886
+ ...payload.context ?? {}
862
887
  }
863
888
  });
864
889
  }
@@ -876,7 +901,8 @@ var AnalyticsManager = class {
876
901
  stripHTML: true,
877
902
  allowDangerousKeys: false
878
903
  });
879
- const targetProviders = this.getTargetProviders(options);
904
+ const targetProviders = await this.getTargetProviders(options);
905
+ const callContext = this.mergeCallContext(options);
880
906
  const enhancedProperties = { ...sanitized.data };
881
907
  const promises = [...targetProviders.entries()].map(async ([providerName, provider]) => {
882
908
  if (provider.page) {
@@ -892,7 +918,7 @@ var AnalyticsManager = class {
892
918
  try {
893
919
  await provider.page(name ?? "", enhancedProperties, {
894
920
  ...options,
895
- context: this.context
921
+ context: callContext
896
922
  });
897
923
  const metrics = this.providerMetrics.get(providerName);
898
924
  if (metrics) {
@@ -920,8 +946,8 @@ var AnalyticsManager = class {
920
946
  return this.screen(payload.name, payload.properties, {
921
947
  ...options,
922
948
  context: {
923
- ...this.context,
924
- ...payload.context
949
+ ...options?.context ?? {},
950
+ ...payload.context ?? {}
925
951
  }
926
952
  });
927
953
  }
@@ -939,7 +965,8 @@ var AnalyticsManager = class {
939
965
  stripHTML: true,
940
966
  allowDangerousKeys: false
941
967
  });
942
- const targetProviders = this.getTargetProviders(options);
968
+ const targetProviders = await this.getTargetProviders(options);
969
+ const callContext = this.mergeCallContext(options);
943
970
  const enhancedProperties = { ...sanitized.data };
944
971
  const promises = [...targetProviders.entries()].map(async ([providerName, provider]) => {
945
972
  if (provider.screen) {
@@ -955,7 +982,7 @@ var AnalyticsManager = class {
955
982
  try {
956
983
  await provider.screen(name ?? "", enhancedProperties, {
957
984
  ...options,
958
- context: this.context
985
+ context: callContext
959
986
  });
960
987
  const metrics = this.providerMetrics.get(providerName);
961
988
  if (metrics) {
@@ -983,8 +1010,8 @@ var AnalyticsManager = class {
983
1010
  return this.group(payload.groupId, payload.traits, {
984
1011
  ...options,
985
1012
  context: {
986
- ...this.context,
987
- ...payload.context
1013
+ ...options?.context ?? {},
1014
+ ...payload.context ?? {}
988
1015
  }
989
1016
  });
990
1017
  }
@@ -1002,11 +1029,11 @@ var AnalyticsManager = class {
1002
1029
  stripHTML: true,
1003
1030
  allowDangerousKeys: false
1004
1031
  });
1005
- this.setContext({
1032
+ const targetProviders = await this.getTargetProviders(options);
1033
+ const callContext = this.mergeCallContext(options, {
1006
1034
  organizationId: groupId,
1007
1035
  ...sanitized.data
1008
1036
  });
1009
- const targetProviders = this.getTargetProviders(options);
1010
1037
  const enhancedTraits = { ...sanitized.data };
1011
1038
  const promises = [...targetProviders.entries()].map(async ([providerName, provider]) => {
1012
1039
  if (provider.group) {
@@ -1022,7 +1049,7 @@ var AnalyticsManager = class {
1022
1049
  try {
1023
1050
  await provider.group(groupId, enhancedTraits, {
1024
1051
  ...options,
1025
- context: this.context
1052
+ context: callContext
1026
1053
  });
1027
1054
  const metrics = this.providerMetrics.get(providerName);
1028
1055
  if (metrics) {
@@ -1050,8 +1077,8 @@ var AnalyticsManager = class {
1050
1077
  return this.alias(payload.userId, payload.previousId, {
1051
1078
  ...options,
1052
1079
  context: {
1053
- ...this.context,
1054
- ...payload.context
1080
+ ...options?.context ?? {},
1081
+ ...payload.context ?? {}
1055
1082
  }
1056
1083
  });
1057
1084
  }
@@ -1066,7 +1093,9 @@ var AnalyticsManager = class {
1066
1093
  });
1067
1094
  return;
1068
1095
  }
1069
- const promises = [...this.getTargetProviders(options).entries()].map(async ([providerName, provider]) => {
1096
+ const targetProviders = await this.getTargetProviders(options);
1097
+ const callContext = this.mergeCallContext(options, { userId });
1098
+ const promises = [...targetProviders.entries()].map(async ([providerName, provider]) => {
1070
1099
  if (provider.alias) {
1071
1100
  if (!await this.rateLimiter.tryAcquire()) {
1072
1101
  if (this.config.debug && this.config.onInfo) this.config.onInfo(`Rate limit exceeded for provider ${providerName}`);
@@ -1079,7 +1108,7 @@ var AnalyticsManager = class {
1079
1108
  return;
1080
1109
  }
1081
1110
  try {
1082
- await provider.alias(userId, prevId, this.context);
1111
+ await provider.alias(userId, prevId, callContext);
1083
1112
  const metrics = this.providerMetrics.get(providerName);
1084
1113
  if (metrics) {
1085
1114
  metrics.callCount++;
@@ -1210,18 +1239,21 @@ var AnalyticsManager = class {
1210
1239
  */
1211
1240
  async emitBatch(payloads, options) {
1212
1241
  const batchStartTime = process.hrtime.bigint();
1213
- const concurrency = options?.concurrency ?? 10;
1242
+ const concurrency = Math.max(1, options?.concurrency ?? 10);
1214
1243
  if (payloads.length === 0) return;
1215
- const clonedPayloads = payloads.map((p) => structuredClone(p));
1216
- const chunks = [];
1217
- for (let i = 0; i < clonedPayloads.length; i += concurrency) chunks.push(clonedPayloads.slice(i, i + concurrency));
1218
- const processChunk = async (chunk) => {
1219
- const chunkPromises = chunk.map((payload) => this.emit(payload, options?.timeout !== void 0 ? { timeout: options.timeout } : void 0));
1220
- if (options?.failFast) await Promise.all(chunkPromises);
1221
- else await Promise.allSettled(chunkPromises);
1244
+ const workQueue = [...payloads.map((p) => structuredClone(p))];
1245
+ const workerCount = Math.min(concurrency, workQueue.length);
1246
+ const runWorker = async (failFast) => {
1247
+ while (workQueue.length > 0) {
1248
+ const payload = workQueue.shift();
1249
+ if (!payload) return;
1250
+ if (failFast) await this.emit(payload, options?.timeout !== void 0 ? { timeout: options.timeout } : void 0);
1251
+ else try {
1252
+ await this.emit(payload, options?.timeout !== void 0 ? { timeout: options.timeout } : void 0);
1253
+ } catch {}
1254
+ }
1222
1255
  };
1223
- const chunkPromises = chunks.map((chunk) => processChunk(chunk));
1224
- await Promise.all(chunkPromises);
1256
+ await Promise.all(Array.from({ length: workerCount }, () => runWorker(options?.failFast === true)));
1225
1257
  if (this.config.debug && this.config.onInfo) {
1226
1258
  const batchTime = Number(process.hrtime.bigint() - batchStartTime) / 1e6;
1227
1259
  this.config.onInfo(`Batch of ${payloads.length} events processed in ${batchTime.toFixed(2)}ms (concurrency: ${concurrency})`);
@@ -1243,19 +1275,22 @@ var AnalyticsManager = class {
1243
1275
  /**
1244
1276
  * Get target providers based on tracking options
1245
1277
  */
1246
- getTargetProviders(options) {
1278
+ async getTargetProviders(options) {
1247
1279
  let targetProviders = new Map(this.providers);
1248
1280
  if (options) {
1249
1281
  if (options.providers && Object.hasOwn(options, "providers")) for (const [name, config] of Object.entries(options.providers)) {
1250
1282
  const factory = this.availableProviders[name];
1251
1283
  if (factory) try {
1284
+ const providerInitStart = typeof process.hrtime?.bigint === "function" ? process.hrtime.bigint() : BigInt(Date.now() * 1e6);
1252
1285
  const provider = factory(config);
1286
+ await provider.initialize(config);
1253
1287
  targetProviders.set(name, provider);
1288
+ const now = typeof process.hrtime?.bigint === "function" ? process.hrtime.bigint() : BigInt(Date.now() * 1e6);
1254
1289
  this.providerMetrics.set(name, {
1255
- initTime: process.hrtime.bigint(),
1290
+ initTime: now - providerInitStart,
1256
1291
  callCount: 0,
1257
1292
  errorCount: 0,
1258
- lastUsed: process.hrtime.bigint()
1293
+ lastUsed: now
1259
1294
  });
1260
1295
  } catch (error) {
1261
1296
  if (this.config.onError) this.config.onError(error, {
@@ -1766,4 +1801,4 @@ function createMinimalBootstrapData(distinctId) {
1766
1801
 
1767
1802
  //#endregion
1768
1803
  export { AnalyticsManager as _, ContextBuilder as a, validateEventName as b, createAnonymousSession as c, isGroupPayload as d, isIdentifyPayload as f, withUTM as g, withMetadata as h, getDistinctIdFromCookies as i, createUserSession as l, isTrackPayload as m, createMinimalBootstrapData as n, EventBatch as o, isPagePayload as p, generateDistinctId as r, PayloadBuilder as s, createBootstrapData as t, isAliasPayload as u, createAnalyticsManager as v, sanitizeProperties as y };
1769
- //# sourceMappingURL=posthog-bootstrap-CYfIy_WS.mjs.map
1804
+ //# sourceMappingURL=posthog-bootstrap-DkDBbvMJ.mjs.map