@walkeros/server-destination-rudderstack 4.8.1-next-1792019907609 → 4.8.2

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.
@@ -10,17 +10,16 @@ __export(env_exports, {
10
10
  push: () => push,
11
11
  simulation: () => simulation
12
12
  });
13
- var noop = () => {
14
- };
13
+ var sent = (_params, callback) => callback?.();
15
14
  var asyncNoop = () => Promise.resolve();
16
15
  function createMockAnalytics() {
17
16
  return {
18
- track: noop,
19
- identify: noop,
20
- group: noop,
21
- page: noop,
22
- screen: noop,
23
- alias: noop,
17
+ track: sent,
18
+ identify: sent,
19
+ group: sent,
20
+ page: sent,
21
+ screen: sent,
22
+ alias: sent,
24
23
  flush: asyncNoop
25
24
  };
26
25
  }
@@ -42,19 +41,29 @@ __export(step_exports, {
42
41
  aliasUser: () => aliasUser,
43
42
  anonymousOnly: () => anonymousOnly,
44
43
  companyGroup: () => companyGroup,
44
+ companyGroupWithoutData: () => companyGroupWithoutData,
45
45
  defaultTrack: () => defaultTrack,
46
46
  destinationIdentify: () => destinationIdentify,
47
47
  mappedEventName: () => mappedEventName,
48
+ noIdentityCompany: () => noIdentityCompany,
49
+ noIdentityLogin: () => noIdentityLogin,
50
+ noIdentityMerge: () => noIdentityMerge,
51
+ noIdentityOrder: () => noIdentityOrder,
52
+ noIdentityPage: () => noIdentityPage,
53
+ noIdentityProduct: () => noIdentityProduct,
54
+ noIdentityScreen: () => noIdentityScreen,
48
55
  pageView: () => pageView,
49
56
  screenView: () => screenView,
57
+ silentRule: () => silentRule,
50
58
  userLoginIdentify: () => userLoginIdentify,
51
59
  wildcardIgnored: () => wildcardIgnored
52
60
  });
53
- import { getEvent } from "@walkeros/core";
61
+ import { createEvent, getEvent } from "@walkeros/core";
54
62
  var defaultTrack = {
55
63
  title: "Default track",
56
64
  description: "A walker event becomes a RudderStack analytics.track call with userId and anonymousId resolved from the event.",
57
65
  in: getEvent("product view", {
66
+ id: "ev1700000100",
58
67
  timestamp: 1700000100,
59
68
  user: { id: "us3r", session: "s3ss10n" }
60
69
  }),
@@ -62,6 +71,7 @@ var defaultTrack = {
62
71
  [
63
72
  "analytics.track",
64
73
  {
74
+ messageId: "ev1700000100",
65
75
  userId: "us3r",
66
76
  anonymousId: "s3ss10n",
67
77
  event: "product view",
@@ -75,6 +85,7 @@ var mappedEventName = {
75
85
  title: "Renamed event",
76
86
  description: "A mapping renames the event so the RudderStack track call uses a canonical name such as Order Completed.",
77
87
  in: getEvent("order complete", {
88
+ id: "ev1700000101",
78
89
  timestamp: 1700000101,
79
90
  user: { id: "us3r", session: "s3ss10n" }
80
91
  }),
@@ -85,6 +96,7 @@ var mappedEventName = {
85
96
  [
86
97
  "analytics.track",
87
98
  {
99
+ messageId: "ev1700000101",
88
100
  userId: "us3r",
89
101
  anonymousId: "s3ss10n",
90
102
  event: "Order Completed",
@@ -98,6 +110,7 @@ var destinationIdentify = {
98
110
  title: "Destination identify",
99
111
  description: "Destination-level identify fires analytics.identify with traits on the first push only, then the track call follows.",
100
112
  in: getEvent("page view", {
113
+ id: "ev1700000102",
101
114
  timestamp: 1700000102,
102
115
  user: { id: "us3r", session: "s3ss10n", email: "user@example.com" }
103
116
  }),
@@ -116,6 +129,7 @@ var destinationIdentify = {
116
129
  [
117
130
  "analytics.identify",
118
131
  {
132
+ messageId: "ev1700000102-identify",
119
133
  userId: "us3r",
120
134
  anonymousId: "s3ss10n",
121
135
  traits: { email: "user@example.com" },
@@ -125,6 +139,7 @@ var destinationIdentify = {
125
139
  [
126
140
  "analytics.track",
127
141
  {
142
+ messageId: "ev1700000102",
128
143
  userId: "us3r",
129
144
  anonymousId: "s3ss10n",
130
145
  event: "page view",
@@ -137,7 +152,9 @@ var destinationIdentify = {
137
152
  var userLoginIdentify = {
138
153
  title: "User login identify",
139
154
  description: "A user login fires only an analytics.identify call with the resolved userId and traits, skipping the track.",
140
- in: getEvent("user login", {
155
+ in: createEvent({
156
+ name: "user login",
157
+ id: "ev1700000103",
141
158
  timestamp: 1700000103,
142
159
  user: { id: "us3r", session: "s3ss10n" },
143
160
  data: {
@@ -168,6 +185,7 @@ var userLoginIdentify = {
168
185
  [
169
186
  "analytics.identify",
170
187
  {
188
+ messageId: "ev1700000103-identify",
171
189
  userId: "new-user-123",
172
190
  anonymousId: "s3ss10n",
173
191
  traits: { email: "user@acme.com", name: "Jane Doe", plan: "premium" },
@@ -179,7 +197,9 @@ var userLoginIdentify = {
179
197
  var companyGroup = {
180
198
  title: "Group company",
181
199
  description: "A company update fires analytics.group with the groupId and group traits for B2B account tracking.",
182
- in: getEvent("company update", {
200
+ in: createEvent({
201
+ name: "company update",
202
+ id: "ev1700000104",
183
203
  timestamp: 1700000104,
184
204
  user: { id: "us3r", session: "s3ss10n" },
185
205
  data: {
@@ -210,6 +230,7 @@ var companyGroup = {
210
230
  [
211
231
  "analytics.group",
212
232
  {
233
+ messageId: "ev1700000104-group",
213
234
  userId: "us3r",
214
235
  anonymousId: "s3ss10n",
215
236
  groupId: "comp-456",
@@ -223,6 +244,7 @@ var pageView = {
223
244
  title: "Page view",
224
245
  description: "A page view fires analytics.page with a resolved page name and properties instead of a generic track.",
225
246
  in: getEvent("page view", {
247
+ id: "ev1700000105",
226
248
  timestamp: 1700000105,
227
249
  user: { id: "us3r", session: "s3ss10n" },
228
250
  data: {
@@ -249,6 +271,7 @@ var pageView = {
249
271
  [
250
272
  "analytics.page",
251
273
  {
274
+ messageId: "ev1700000105-page",
252
275
  userId: "us3r",
253
276
  anonymousId: "s3ss10n",
254
277
  name: "Getting Started",
@@ -261,7 +284,9 @@ var pageView = {
261
284
  var screenView = {
262
285
  title: "Screen view",
263
286
  description: "A screen view from a mobile app backend fires analytics.screen with a screen name and properties.",
264
- in: getEvent("screen view", {
287
+ in: createEvent({
288
+ name: "screen view",
289
+ id: "ev1700000106",
265
290
  timestamp: 1700000106,
266
291
  user: { id: "us3r", session: "s3ss10n" },
267
292
  data: {
@@ -289,6 +314,7 @@ var screenView = {
289
314
  [
290
315
  "analytics.screen",
291
316
  {
317
+ messageId: "ev1700000106-screen",
292
318
  userId: "us3r",
293
319
  anonymousId: "s3ss10n",
294
320
  name: "Welcome",
@@ -301,7 +327,9 @@ var screenView = {
301
327
  var aliasUser = {
302
328
  title: "Alias user",
303
329
  description: "An identity merge fires analytics.alias to link a previous anonymous id to the newly registered user id.",
304
- in: getEvent("identity merge", {
330
+ in: createEvent({
331
+ name: "identity merge",
332
+ id: "ev1700000107",
305
333
  timestamp: 1700000107,
306
334
  user: { id: "registered-456", session: "s3ss10n" },
307
335
  data: {
@@ -322,6 +350,7 @@ var aliasUser = {
322
350
  [
323
351
  "analytics.alias",
324
352
  {
353
+ messageId: "ev1700000107-alias",
325
354
  userId: "registered-456",
326
355
  previousId: "anonymous-123",
327
356
  timestamp: /* @__PURE__ */ new Date(1700000107)
@@ -333,6 +362,7 @@ var anonymousOnly = {
333
362
  title: "Anonymous only",
334
363
  description: "When no userId is resolved RudderStack accepts the track call keyed solely by anonymousId.",
335
364
  in: getEvent("product view", {
365
+ id: "ev1700000108",
336
366
  timestamp: 1700000108,
337
367
  user: { session: "s3ss10n" }
338
368
  }),
@@ -343,6 +373,7 @@ var anonymousOnly = {
343
373
  [
344
374
  "analytics.track",
345
375
  {
376
+ messageId: "ev1700000108",
346
377
  anonymousId: "s3ss10n",
347
378
  event: "product view",
348
379
  properties: {},
@@ -351,15 +382,56 @@ var anonymousOnly = {
351
382
  ]
352
383
  ]
353
384
  };
385
+ function withoutIdentity(name, timestamp) {
386
+ const [entity, action] = name.split(" ");
387
+ return {
388
+ public: false,
389
+ description: `A ${name} event without userId or anonymousId cannot be sent to RudderStack: the push fails with missing-input instead of counting as delivered.`,
390
+ in: { name, entity, action, timestamp },
391
+ out: [],
392
+ outcome: { status: "failed", code: "missing-input", retryable: false }
393
+ };
394
+ }
395
+ var noIdentityProduct = withoutIdentity("product view", 1700000110);
396
+ var noIdentityOrder = withoutIdentity("order complete", 1700000111);
397
+ var noIdentityPage = withoutIdentity("page view", 1700000112);
398
+ var noIdentityLogin = withoutIdentity("user login", 1700000113);
399
+ var noIdentityCompany = withoutIdentity("company update", 1700000114);
400
+ var noIdentityScreen = withoutIdentity("screen view", 1700000115);
401
+ var noIdentityMerge = withoutIdentity("identity merge", 1700000116);
402
+ var silentRule = {
403
+ public: false,
404
+ description: "A rule with silent: true and no identify, group, page, screen or alias mapping sends nothing to RudderStack.",
405
+ in: getEvent("page view", {
406
+ timestamp: 1700000117,
407
+ user: { id: "us3r", session: "s3ss10n" }
408
+ }),
409
+ mapping: { silent: true },
410
+ out: []
411
+ };
354
412
  var wildcardIgnored = {
355
413
  public: false,
356
- in: getEvent("debug noise", {
414
+ in: createEvent({
415
+ name: "debug noise",
357
416
  timestamp: 1700000109,
358
417
  user: { id: "us3r", session: "s3ss10n" }
359
418
  }),
360
419
  mapping: { ignore: true },
361
420
  out: []
362
421
  };
422
+ var companyGroupWithoutData = {
423
+ public: false,
424
+ description: "A silent group rule whose groupId finds no data sends nothing: an unmet mapping, not a failure, so the push returns normally.",
425
+ in: {
426
+ name: "company update",
427
+ entity: "company",
428
+ action: "update",
429
+ timestamp: 1700000120,
430
+ user: { id: "us3r", session: "s3ss10n" }
431
+ },
432
+ mapping: companyGroup.mapping,
433
+ out: []
434
+ };
363
435
  export {
364
436
  env_exports as env,
365
437
  step_exports as step
package/dist/index.d.mts CHANGED
@@ -28,15 +28,19 @@ interface Settings {
28
28
  maxInternalQueueSize?: number;
29
29
  /** Log level. Default: 'info'. */
30
30
  logLevel?: string;
31
- /** Retry attempts for failed batches. Default: 3. */
31
+ /** Retries for a failed request. Default: 2, within config.timeout. */
32
32
  retryCount?: number;
33
+ /** Time one request may take (ms). Default: a quarter of config.timeout. */
34
+ timeout?: number;
33
35
  /** Completely disable the SDK. Default: false. */
34
36
  enable?: boolean;
35
37
  /** Enable gzip compression. Default: true. */
36
38
  gzip?: boolean;
37
39
  /** Runtime state -- not user-facing. Mutated by init/push. */
38
- _analytics?: unknown;
40
+ _analytics?: RudderStackAnalyticsMock;
39
41
  _state?: RuntimeState;
42
+ /** The running flush; the next one waits for it. Runtime only. */
43
+ _flushing?: Promise<void>;
40
44
  }
41
45
  interface RuntimeState {
42
46
  lastIdentity?: {
@@ -75,14 +79,16 @@ interface Env extends DestinationServer.Env {
75
79
  * destination actually calls. Tests can provide this via env.analytics
76
80
  * instead of the real SDK.
77
81
  */
82
+ /** Called once the SDK sent the call, with the error if it failed. */
83
+ type RudderStackCallback = (error?: Error, data?: unknown) => void;
78
84
  interface RudderStackAnalyticsMock {
79
- track: (params: Record<string, unknown>) => void;
80
- identify: (params: Record<string, unknown>) => void;
81
- group: (params: Record<string, unknown>) => void;
82
- page: (params: Record<string, unknown>) => void;
83
- screen: (params: Record<string, unknown>) => void;
84
- alias: (params: Record<string, unknown>) => void;
85
- flush: (callback?: (err?: Error, data?: unknown) => void) => Promise<void>;
85
+ track: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
86
+ identify: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
87
+ group: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
88
+ page: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
89
+ screen: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
90
+ alias: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
91
+ flush: (callback?: RudderStackCallback) => Promise<void>;
86
92
  }
87
93
  type Types = Destination$1.Types<Settings, Mapping, Env, InitSettings>;
88
94
  interface Destination extends DestinationServer.Destination<Types> {
@@ -93,6 +99,7 @@ type Config = {
93
99
  } & DestinationServer.Config<Types>;
94
100
  type InitFn = DestinationServer.InitFn<Types>;
95
101
  type PushFn = DestinationServer.PushFn<Types>;
102
+ type PushBatchFn = Destination$1.PushBatchFn<Types>;
96
103
  type PartialConfig = DestinationServer.PartialConfig<Types>;
97
104
  type PushEvents = DestinationServer.PushEvents<Mapping>;
98
105
  type Rule = Mapping$1.Rule<Mapping>;
@@ -105,16 +112,18 @@ type index_InitFn = InitFn;
105
112
  type index_InitSettings = InitSettings;
106
113
  type index_Mapping = Mapping;
107
114
  type index_PartialConfig = PartialConfig;
115
+ type index_PushBatchFn = PushBatchFn;
108
116
  type index_PushEvents = PushEvents;
109
117
  type index_PushFn = PushFn;
110
118
  type index_RudderStackAnalyticsMock = RudderStackAnalyticsMock;
119
+ type index_RudderStackCallback = RudderStackCallback;
111
120
  type index_Rule = Rule;
112
121
  type index_Rules = Rules;
113
122
  type index_RuntimeState = RuntimeState;
114
123
  type index_Settings = Settings;
115
124
  type index_Types = Types;
116
125
  declare namespace index {
117
- export type { index_Config as Config, index_Destination as Destination, index_Env as Env, index_InitFn as InitFn, index_InitSettings as InitSettings, index_Mapping as Mapping, index_PartialConfig as PartialConfig, index_PushEvents as PushEvents, index_PushFn as PushFn, index_RudderStackAnalyticsMock as RudderStackAnalyticsMock, index_Rule as Rule, index_Rules as Rules, index_RuntimeState as RuntimeState, index_Settings as Settings, index_Types as Types };
126
+ export type { index_Config as Config, index_Destination as Destination, index_Env as Env, index_InitFn as InitFn, index_InitSettings as InitSettings, index_Mapping as Mapping, index_PartialConfig as PartialConfig, index_PushBatchFn as PushBatchFn, index_PushEvents as PushEvents, index_PushFn as PushFn, index_RudderStackAnalyticsMock as RudderStackAnalyticsMock, index_RudderStackCallback as RudderStackCallback, index_Rule as Rule, index_Rules as Rules, index_RuntimeState as RuntimeState, index_Settings as Settings, index_Types as Types };
118
127
  }
119
128
 
120
129
  declare const destinationRudderStack: Destination;
package/dist/index.d.ts CHANGED
@@ -28,15 +28,19 @@ interface Settings {
28
28
  maxInternalQueueSize?: number;
29
29
  /** Log level. Default: 'info'. */
30
30
  logLevel?: string;
31
- /** Retry attempts for failed batches. Default: 3. */
31
+ /** Retries for a failed request. Default: 2, within config.timeout. */
32
32
  retryCount?: number;
33
+ /** Time one request may take (ms). Default: a quarter of config.timeout. */
34
+ timeout?: number;
33
35
  /** Completely disable the SDK. Default: false. */
34
36
  enable?: boolean;
35
37
  /** Enable gzip compression. Default: true. */
36
38
  gzip?: boolean;
37
39
  /** Runtime state -- not user-facing. Mutated by init/push. */
38
- _analytics?: unknown;
40
+ _analytics?: RudderStackAnalyticsMock;
39
41
  _state?: RuntimeState;
42
+ /** The running flush; the next one waits for it. Runtime only. */
43
+ _flushing?: Promise<void>;
40
44
  }
41
45
  interface RuntimeState {
42
46
  lastIdentity?: {
@@ -75,14 +79,16 @@ interface Env extends DestinationServer.Env {
75
79
  * destination actually calls. Tests can provide this via env.analytics
76
80
  * instead of the real SDK.
77
81
  */
82
+ /** Called once the SDK sent the call, with the error if it failed. */
83
+ type RudderStackCallback = (error?: Error, data?: unknown) => void;
78
84
  interface RudderStackAnalyticsMock {
79
- track: (params: Record<string, unknown>) => void;
80
- identify: (params: Record<string, unknown>) => void;
81
- group: (params: Record<string, unknown>) => void;
82
- page: (params: Record<string, unknown>) => void;
83
- screen: (params: Record<string, unknown>) => void;
84
- alias: (params: Record<string, unknown>) => void;
85
- flush: (callback?: (err?: Error, data?: unknown) => void) => Promise<void>;
85
+ track: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
86
+ identify: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
87
+ group: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
88
+ page: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
89
+ screen: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
90
+ alias: (params: Record<string, unknown>, callback?: RudderStackCallback) => unknown;
91
+ flush: (callback?: RudderStackCallback) => Promise<void>;
86
92
  }
87
93
  type Types = Destination$1.Types<Settings, Mapping, Env, InitSettings>;
88
94
  interface Destination extends DestinationServer.Destination<Types> {
@@ -93,6 +99,7 @@ type Config = {
93
99
  } & DestinationServer.Config<Types>;
94
100
  type InitFn = DestinationServer.InitFn<Types>;
95
101
  type PushFn = DestinationServer.PushFn<Types>;
102
+ type PushBatchFn = Destination$1.PushBatchFn<Types>;
96
103
  type PartialConfig = DestinationServer.PartialConfig<Types>;
97
104
  type PushEvents = DestinationServer.PushEvents<Mapping>;
98
105
  type Rule = Mapping$1.Rule<Mapping>;
@@ -105,16 +112,18 @@ type index_InitFn = InitFn;
105
112
  type index_InitSettings = InitSettings;
106
113
  type index_Mapping = Mapping;
107
114
  type index_PartialConfig = PartialConfig;
115
+ type index_PushBatchFn = PushBatchFn;
108
116
  type index_PushEvents = PushEvents;
109
117
  type index_PushFn = PushFn;
110
118
  type index_RudderStackAnalyticsMock = RudderStackAnalyticsMock;
119
+ type index_RudderStackCallback = RudderStackCallback;
111
120
  type index_Rule = Rule;
112
121
  type index_Rules = Rules;
113
122
  type index_RuntimeState = RuntimeState;
114
123
  type index_Settings = Settings;
115
124
  type index_Types = Types;
116
125
  declare namespace index {
117
- export type { index_Config as Config, index_Destination as Destination, index_Env as Env, index_InitFn as InitFn, index_InitSettings as InitSettings, index_Mapping as Mapping, index_PartialConfig as PartialConfig, index_PushEvents as PushEvents, index_PushFn as PushFn, index_RudderStackAnalyticsMock as RudderStackAnalyticsMock, index_Rule as Rule, index_Rules as Rules, index_RuntimeState as RuntimeState, index_Settings as Settings, index_Types as Types };
126
+ export type { index_Config as Config, index_Destination as Destination, index_Env as Env, index_InitFn as InitFn, index_InitSettings as InitSettings, index_Mapping as Mapping, index_PartialConfig as PartialConfig, index_PushBatchFn as PushBatchFn, index_PushEvents as PushEvents, index_PushFn as PushFn, index_RudderStackAnalyticsMock as RudderStackAnalyticsMock, index_RudderStackCallback as RudderStackCallback, index_Rule as Rule, index_Rules as Rules, index_RuntimeState as RuntimeState, index_Settings as Settings, index_Types as Types };
118
127
  }
119
128
 
120
129
  declare const destinationRudderStack: Destination;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var t,e=Object.defineProperty,i=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,s={};((t,i)=>{for(var r in i)e(t,r,{get:i[r],enumerable:!0})})(s,{DestinationRudderStack:()=>d,default:()=>l,destinationRudderStack:()=>p}),module.exports=(t=s,((t,s,a,o)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of r(s))n.call(t,c)||c===a||e(t,c,{get:()=>s[c],enumerable:!(o=i(s,c))||o.enumerable});return t})(e({},"__esModule",{value:!0}),t));var a=require("@walkeros/core"),o=async function(t,{config:e,rule:i,data:r,collector:n,env:s,logger:o}){const d=e.settings,p=d._analytics,l=s?.analytics,g=l||p;if(!g)return void o.warn("RudderStack Analytics not initialized");const y=d._state||{},f=i?.settings||{},m=new Date(t.timestamp||Date.now()),I=d.userId?c(await(0,a.getMappingValue)(t,d.userId,{collector:n})):void 0,v=d.anonymousId?c(await(0,a.getMappingValue)(t,d.anonymousId,{collector:n})):void 0;if(!I&&!v)return void o.warn("RudderStack requires userId or anonymousId; skipping event",{event:t.name});const w={};I&&(w.userId=I),v&&(w.anonymousId=v);const b=f.identify??d.identify;if(void 0!==b){const e=await(0,a.getMappingValue)(t,b,{collector:n});(0,a.isObject)(e)&&function(t,e,i,r,n){const s=r.lastIdentity||{},o=(0,a.isString)(e.userId)?e.userId:i.userId,c=(0,a.isObject)(e.traits)&&!(0,a.isArray)(e.traits)?e.traits:void 0,d=u(c),p=o!==s.userId,l=d!==(s.traitsHash??"");if(!p&&!l)return;const g={...i,timestamp:n};o&&(g.userId=o);c&&(g.traits=c);t.identify(g),r.lastIdentity={userId:o,anonymousId:i.anonymousId,traitsHash:d}}(g,e,w,y,m)}const O=f.group??d.group;if(void 0!==O){const e=await(0,a.getMappingValue)(t,O,{collector:n});(0,a.isObject)(e)&&function(t,e,i,r,n){const s=(0,a.isString)(e.groupId)?e.groupId:void 0;if(!s)return;const o=r.lastGroup||{},c=(0,a.isObject)(e.traits)&&!(0,a.isArray)(e.traits)?e.traits:void 0,d=u(c),p=s!==o.groupId,l=d!==(o.traitsHash??"");if(!p&&!l)return;const g={...i,groupId:s,timestamp:n};c&&(g.traits=c);t.group(g),r.lastGroup={groupId:s,traitsHash:d}}(g,e,w,y,m)}if(void 0!==f.page&&await async function(t,e,i,r,n,s){const o={...r,timestamp:s};if(!0===e)return o.name="",void t.page(o);const c=await(0,a.getMappingValue)(i,e,{collector:n});if(!(0,a.isObject)(c))return;const u=c;o.name=(0,a.isString)(u.name)?u.name:"",(0,a.isObject)(u.properties)&&!(0,a.isArray)(u.properties)&&(o.properties=u.properties);t.page(o)}(g,f.page,t,w,n,m),void 0!==f.screen&&await async function(t,e,i,r,n,s){const o={...r,timestamp:s};if(!0===e)return o.name="",void t.screen(o);const c=await(0,a.getMappingValue)(i,e,{collector:n});if(!(0,a.isObject)(c))return;const u=c;o.name=(0,a.isString)(u.name)?u.name:"",(0,a.isObject)(u.properties)&&!(0,a.isArray)(u.properties)&&(o.properties=u.properties);t.screen(o)}(g,f.screen,t,w,n,m),void 0!==f.alias&&await async function(t,e,i,r,n,s){const o=await(0,a.getMappingValue)(i,e,{collector:n});if(!(0,a.isObject)(o))return;const c=o,u=(0,a.isString)(c.previousId)?c.previousId:void 0;if(!u)return;const d={previousId:u,timestamp:s};r.userId&&(d.userId=r.userId);t.alias(d)}(g,f.alias,t,w,n,m),!0!==i?.silent){const e=(0,a.isString)(i?.name)?i.name:t.name,n=(0,a.isObject)(r)?r:{};g.track({...w,event:e,properties:n,timestamp:m})}d._state=y};function c(t){if((0,a.isString)(t)&&t.length>0)return t}function u(t){if(!t)return"";try{return JSON.stringify(t)}catch{return""}}var d={},p={type:"rudderstack",config:{},init({config:t,logger:e,env:i}){const r=function(t={},e){const i=t.settings||{},{writeKey:r,dataPlaneUrl:n}=i;r||e.throw("Config settings writeKey missing"),n||e.throw("Config settings dataPlaneUrl missing");const s={...i,writeKey:r,dataPlaneUrl:n,userId:i.userId??"user.id",anonymousId:i.anonymousId??"user.session"};return{...t,settings:s}}(t,e),n=r.settings,s=i?.analytics;if(!s)try{const t=require("@rudderstack/rudder-sdk-node"),{writeKey:e,dataPlaneUrl:i,userId:r,anonymousId:s,identify:a,group:o,integrations:c,_analytics:u,_state:d,...p}=n,l=new t(e,{dataPlaneUrl:i,...p});n._analytics=l}catch(t){e.throw(`Failed to initialize RudderStack SDK: ${t}`)}return n._state={},r},push:async(t,e)=>await o(t,e),async destroy({config:t}){const e=(t?.settings||{})._analytics;e&&await e.flush()}},l=p;//# sourceMappingURL=index.js.map
1
+ "use strict";var t,e=Object.defineProperty,r=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,i={};((t,r)=>{for(var n in r)e(t,n,{get:r[n],enumerable:!0})})(i,{DestinationRudderStack:()=>S,default:()=>b,destinationRudderStack:()=>k}),module.exports=(t=i,((t,i,a,o)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let c of n(i))s.call(t,c)||c===a||e(t,c,{get:()=>i[c],enumerable:!(o=r(i,c))||o.enumerable});return t})(e({},"__esModule",{value:!0}),t));var a=require("@walkeros/core"),o=require("@walkeros/server-core"),c=require("@walkeros/core");var u=require("@walkeros/core"),d=require("@walkeros/server-core");function l(t,e){const r=new Promise((r,n)=>{const s=e=>n(function(t,e){const r="object"==typeof e&&null!==e?Reflect.get(e,"code"):void 0,n="ECONNABORTED"===r||"ETIMEDOUT"===r;return new u.StepError(t,{code:n?"timeout":"transport",cause:e})}(t,e));let i;try{i=e(t=>t?s(t):r())}catch(t){return void s(t)}(0,u.isThenable)(i)&&i.then(()=>r(),s)});return r.catch(()=>{}),r}function p(t,e){if(t.id)return e?`${t.id}-${e}`:t.id}function g(t,e,r){const n=p(e,r);return n?{...t,messageId:n}:t}function f(t,e){const r=(t._flushing??Promise.resolve()).then(()=>e.flush());return t._flushing=r.catch(()=>{}),r}function y(t,e,r,n){t.debug(`RudderStack skipped ${r}: ${n} resolved to nothing`,{event:e.name})}async function m(t){for(const e of await t)if("rejected"===e.status)throw e.reason}async function h(t,e,r,n,s,i,a){const o=n._state||{};n._state=o;const c=e?.settings||{},d=new Date(t.timestamp||Date.now()),f=n.userId?I(await(0,u.getMappingValue)(t,n.userId,{collector:i})):void 0,m=n.anonymousId?I(await(0,u.getMappingValue)(t,n.anonymousId,{collector:i})):void 0;if(!f&&!m)throw new u.StepError("RudderStack needs a userId or anonymousId for the event",{code:"missing-input"});const h={};f&&(h.userId=f),m&&(h.anonymousId=m);const w=[],S=c.identify??n.identify;if(void 0!==S){const e=await(0,u.getMappingValue)(t,S,{collector:i});(0,u.isObject)(e)?w.push(function(t,e,r,n,s){const i=n.lastIdentity||{},a=(0,u.isString)(e.userId)?e.userId:r.userId,o=(0,u.isObject)(e.traits)&&!(0,u.isArray)(e.traits)?e.traits:void 0,c=v(o),d=a!==i.userId,p=c!==(i.traitsHash??"");if(!d&&!p)return;const g={...r,timestamp:s};a&&(g.userId=a);o&&(g.traits=o);const f={userId:a,anonymousId:r.anonymousId,traitsHash:c};return n.lastIdentity=f,l("RudderStack identify failed",e=>t.identify(g,e)).catch(t=>{throw n.lastIdentity===f&&(n.lastIdentity=void 0),t})}(s,e,g(h,t,"identify"),o,d)):y(a,t,"identify","identify")}const k=c.group??n.group;if(void 0!==k){const e=await(0,u.getMappingValue)(t,k,{collector:i});(0,u.isObject)(e)&&(0,u.isString)(e.groupId)?w.push(function(t,e,r,n,s){const i=(0,u.isString)(e.groupId)?e.groupId:void 0;if(!i)return;const a=n.lastGroup||{},o=(0,u.isObject)(e.traits)&&!(0,u.isArray)(e.traits)?e.traits:void 0,c=v(o),d=i!==a.groupId,p=c!==(a.traitsHash??"");if(!d&&!p)return;const g={...r,groupId:i,timestamp:s};o&&(g.traits=o);const f={groupId:i,traitsHash:c};return n.lastGroup=f,l("RudderStack group failed",e=>t.group(g,e)).catch(t=>{throw n.lastGroup===f&&(n.lastGroup=void 0),t})}(s,e,g(h,t,"group"),o,d)):y(a,t,"group","group")}if(void 0!==c.page){const{sent:e}=await async function(t,e,r,n,s,i){const a={...n,timestamp:i};if(!0===e)return{sent:l("RudderStack page failed",e=>t.page(a,e))};const o=await(0,u.getMappingValue)(r,e,{collector:s});if(!(0,u.isObject)(o))return{};const c=o;(0,u.isString)(c.category)&&(a.category=c.category);(0,u.isString)(c.name)&&(a.name=c.name);(0,u.isObject)(c.properties)&&!(0,u.isArray)(c.properties)&&(a.properties=c.properties);return{sent:l("RudderStack page failed",e=>t.page(a,e))}}(s,c.page,t,g(h,t,"page"),i,d);e?w.push(e):y(a,t,"page","page")}if(void 0!==c.screen){const{sent:e}=await async function(t,e,r,n,s,i){const a={...n,timestamp:i};if(!0===e)return{sent:l("RudderStack screen failed",e=>t.screen(a,e))};const o=await(0,u.getMappingValue)(r,e,{collector:s});if(!(0,u.isObject)(o))return{};const c=o;(0,u.isString)(c.category)&&(a.category=c.category);(0,u.isString)(c.name)&&(a.name=c.name);(0,u.isObject)(c.properties)&&!(0,u.isArray)(c.properties)&&(a.properties=c.properties);return{sent:l("RudderStack screen failed",e=>t.screen(a,e))}}(s,c.screen,t,g(h,t,"screen"),i,d);e?w.push(e):y(a,t,"screen","screen")}if(void 0!==c.alias){const{sent:e}=await async function(t,e,r,n,s,i){const a=await(0,u.getMappingValue)(r,e,{collector:s});if(!(0,u.isObject)(a))return{};const o=a,c=(0,u.isString)(o.previousId)?o.previousId:void 0;if(!c)return{};const d={previousId:c,timestamp:i};n.userId&&(d.userId=n.userId);n.messageId&&(d.messageId=n.messageId);return{sent:l("RudderStack alias failed",e=>t.alias(d,e))}}(s,c.alias,t,g(h,t,"alias"),i,d);e?w.push(e):y(a,t,"alias","alias")}if(!0!==e?.silent){const n=(0,u.isString)(e?.name)?e.name:t.name,i=(0,u.isObject)(r)?r:{},a={...h,event:n,properties:i,timestamp:d},o=p(t);o&&(a.messageId=o),w.push(l("RudderStack track failed",t=>s.track(a,t)))}return w.filter(t=>void 0!==t)}function w(t,e){const r=e?.analytics||t?._analytics;if(!t||!r)throw new u.StepError("RudderStack Analytics not initialized",{code:"not-ready"});return r}function I(t){if((0,u.isString)(t)&&t.length>0)return t}function v(t){if(!t)return"";try{return JSON.stringify(t)}catch{return""}}var S={},k={type:"rudderstack",config:{batch:{size:20,wait:1e4}},init({config:t,env:e}){const r=function(t={}){const e=t.settings||{},{writeKey:r,dataPlaneUrl:n}=e;if(!r||!n){const t=[...r?[]:["writeKey"],...n?[]:["dataPlaneUrl"]];throw new c.StepError(`Config settings ${t.join(", ")} missing`,{code:"config"})}const s={...e,writeKey:r,dataPlaneUrl:n,userId:e.userId??"user.id",anonymousId:e.anonymousId??"user.session"};return{...t,settings:s}}(t),{settings:n}=r;if(!e?.analytics)try{const e=require("@rudderstack/rudder-sdk-node"),{writeKey:r,dataPlaneUrl:s,userId:i,anonymousId:a,identify:c,group:u,integrations:d,_analytics:l,_state:p,...g}=n,f=(0,o.retryBudget)(t.timeout);n._analytics=new e(r,{dataPlaneUrl:s,timeout:f.attempt,retryCount:f.retries,axiosRetryConfig:{retryDelay:()=>f.wait,shouldResetTimeout:!0},...g,errorHandler:()=>{}})}catch(t){throw new a.StepError("Failed to initialize the RudderStack SDK",{code:"not-ready",cause:t})}return n._state={},r},push:async function(t,{config:e,rule:r,data:n,collector:s,env:i,logger:a}){const o=e.settings??{},c=w(e.settings,i),u=await h(t,r,n,o,c,s,a);if(u.length){const t=Promise.allSettled(u);await f(o,c),await m(t)}},pushBatch:async function(t,{config:e,collector:r,env:n,logger:s}){const i=e.settings??{},a=w(e.settings,n),o=[];for(const e of t.entries)try{const t=await h(e.event,e.rule,e.data,i,a,r,s);o.push({settled:Promise.allSettled(t)})}catch(t){o.push({error:t})}await f(i,a);const c=[];for(const[t,{settled:e,error:r}]of o.entries())e?await m(e).catch(e=>c.push({index:t,error:e})):c.push({index:t,error:r});return(0,d.batchOutcome)(t.entries.length,c)},async destroy({config:t}){const e=t?.settings?._analytics;e&&await e.flush()}},b=k;//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/push.ts","../src/types/index.ts"],"sourcesContent":["import type { Destination, Settings, RudderStackAnalyticsMock } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationRudderStack from './types';\n\nexport const destinationRudderStack: Destination = {\n type: 'rudderstack',\n\n config: {},\n\n init({ config: partialConfig, logger, env }) {\n const config = getConfig(partialConfig, logger);\n const settings = config.settings as Settings;\n\n // Use env.analytics mock if provided (testing), otherwise create real SDK\n const envAnalytics = (\n env as { analytics?: RudderStackAnalyticsMock } | undefined\n )?.analytics;\n\n if (!envAnalytics) {\n // Production path: create real Analytics instance\n try {\n const Analytics = require('@rudderstack/rudder-sdk-node');\n const {\n writeKey,\n dataPlaneUrl,\n userId: _u,\n anonymousId: _a,\n identify: _i,\n group: _g,\n integrations: _int,\n _analytics: _existing,\n _state: _existingState,\n ...sdkOptions\n } = settings;\n\n // RudderStack uses positional constructor: new Analytics(writeKey, opts)\n const analytics = new Analytics(writeKey, {\n dataPlaneUrl,\n ...sdkOptions,\n });\n settings._analytics = analytics;\n } catch (err) {\n logger.throw(`Failed to initialize RudderStack SDK: ${err}`);\n }\n }\n\n settings._state = {};\n\n return config;\n },\n\n async push(event, context) {\n return await push(event, context);\n },\n\n async destroy({ config }) {\n const settings = (config?.settings || {}) as Settings;\n const analytics = settings._analytics;\n if (analytics) {\n await (analytics as unknown as RudderStackAnalyticsMock).flush();\n }\n },\n};\n\nexport default destinationRudderStack;\n","import type { Config, Settings, PartialConfig } from './types';\nimport type { Logger } from '@walkeros/core';\n\nexport function getConfig(\n partialConfig: PartialConfig = {},\n logger: Logger.Instance,\n): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { writeKey, dataPlaneUrl } = settings;\n\n if (!writeKey) logger.throw('Config settings writeKey missing');\n if (!dataPlaneUrl) logger.throw('Config settings dataPlaneUrl missing');\n\n const settingsConfig: Settings = {\n ...settings,\n writeKey,\n dataPlaneUrl,\n userId: settings.userId ?? 'user.id',\n anonymousId: settings.anonymousId ?? 'user.session',\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type {\n PushFn,\n Settings,\n RuntimeState,\n RudderStackAnalyticsMock,\n} from './types';\nimport { getMappingValue, isObject, isString, isArray } from '@walkeros/core';\n\nexport const push: PushFn = async function (\n event,\n { config, rule, data, collector, env, logger },\n) {\n const settings = config.settings as Settings;\n const analytics = settings._analytics as unknown as\n | RudderStackAnalyticsMock\n | undefined;\n const envAnalytics = (\n env as { analytics?: RudderStackAnalyticsMock } | undefined\n )?.analytics;\n const sdk = envAnalytics || analytics;\n\n if (!sdk) {\n logger.warn('RudderStack Analytics not initialized');\n return;\n }\n\n const state: RuntimeState = settings._state || {};\n const mappingSettings = rule?.settings || {};\n const timestamp = new Date(event.timestamp || Date.now());\n\n // 1. Resolve identity from event\n const userId = settings.userId\n ? resolveString(\n await getMappingValue(event, settings.userId, { collector }),\n )\n : undefined;\n const anonymousId = settings.anonymousId\n ? resolveString(\n await getMappingValue(event, settings.anonymousId, { collector }),\n )\n : undefined;\n\n if (!userId && !anonymousId) {\n logger.warn('RudderStack requires userId or anonymousId; skipping event', {\n event: event.name,\n });\n return;\n }\n\n // Build identity object for every SDK call\n const identity: Record<string, unknown> = {};\n if (userId) identity.userId = userId;\n if (anonymousId) identity.anonymousId = anonymousId;\n\n // 2. Identify -- rule-level overrides destination-level\n const identifyMapping = mappingSettings.identify ?? settings.identify;\n if (identifyMapping !== undefined) {\n const resolved = await getMappingValue(event, identifyMapping, {\n collector,\n });\n if (isObject(resolved)) {\n applyIdentify(\n sdk,\n resolved as Record<string, unknown>,\n identity,\n state,\n timestamp,\n );\n }\n }\n\n // 3. Group -- rule-level overrides destination-level\n const groupMapping = mappingSettings.group ?? settings.group;\n if (groupMapping !== undefined) {\n const resolved = await getMappingValue(event, groupMapping, { collector });\n if (isObject(resolved)) {\n applyGroup(\n sdk,\n resolved as Record<string, unknown>,\n identity,\n state,\n timestamp,\n );\n }\n }\n\n // 4. Page\n if (mappingSettings.page !== undefined) {\n await applyPage(\n sdk,\n mappingSettings.page,\n event,\n identity,\n collector,\n timestamp,\n );\n }\n\n // 5. Screen\n if (mappingSettings.screen !== undefined) {\n await applyScreen(\n sdk,\n mappingSettings.screen,\n event,\n identity,\n collector,\n timestamp,\n );\n }\n\n // 6. Alias\n if (mappingSettings.alias !== undefined) {\n await applyAlias(\n sdk,\n mappingSettings.alias,\n event,\n identity,\n collector,\n timestamp,\n );\n }\n\n // 7. Track (unless silent: true)\n if (rule?.silent !== true) {\n const eventName = isString(rule?.name) ? rule.name : event.name;\n const properties = isObject(data) ? (data as Record<string, unknown>) : {};\n\n sdk.track({\n ...identity,\n event: eventName,\n properties,\n timestamp,\n });\n }\n\n settings._state = state;\n};\n\nfunction resolveString(value: unknown): string | undefined {\n if (isString(value) && value.length > 0) return value;\n return undefined;\n}\n\nfunction hashTraits(traits: Record<string, unknown> | undefined): string {\n if (!traits) return '';\n try {\n return JSON.stringify(traits);\n } catch {\n return '';\n }\n}\n\nfunction applyIdentify(\n sdk: RudderStackAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n): void {\n const last = state.lastIdentity || {};\n\n // Per-event identify can override userId\n const identifyUserId = isString(resolved.userId)\n ? resolved.userId\n : (identity.userId as string | undefined);\n const traits =\n isObject(resolved.traits) && !isArray(resolved.traits)\n ? (resolved.traits as Record<string, unknown>)\n : undefined;\n\n const traitsHash = hashTraits(traits);\n const userIdChanged = identifyUserId !== last.userId;\n const traitsChanged = traitsHash !== (last.traitsHash ?? '');\n\n if (!userIdChanged && !traitsChanged) return;\n\n const params: Record<string, unknown> = {\n ...identity,\n timestamp,\n };\n if (identifyUserId) params.userId = identifyUserId;\n if (traits) params.traits = traits;\n\n sdk.identify(params);\n\n state.lastIdentity = {\n userId: identifyUserId,\n anonymousId: identity.anonymousId as string | undefined,\n traitsHash,\n };\n}\n\nfunction applyGroup(\n sdk: RudderStackAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n): void {\n const groupId = isString(resolved.groupId) ? resolved.groupId : undefined;\n if (!groupId) return;\n\n const last = state.lastGroup || {};\n const traits =\n isObject(resolved.traits) && !isArray(resolved.traits)\n ? (resolved.traits as Record<string, unknown>)\n : undefined;\n\n const traitsHash = hashTraits(traits);\n const groupIdChanged = groupId !== last.groupId;\n const traitsChanged = traitsHash !== (last.traitsHash ?? '');\n if (!groupIdChanged && !traitsChanged) return;\n\n const params: Record<string, unknown> = {\n ...identity,\n groupId,\n timestamp,\n };\n if (traits) params.traits = traits;\n\n sdk.group(params);\n\n state.lastGroup = { groupId, traitsHash };\n}\n\nasync function applyPage(\n sdk: RudderStackAnalyticsMock,\n pageMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<void> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (pageMapping === true) {\n // Minimal page call -- RudderStack requires name, use empty string\n params.name = '';\n sdk.page(params);\n return;\n }\n\n const resolved = await getMappingValue(\n event,\n pageMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return;\n\n const r = resolved as {\n name?: unknown;\n properties?: unknown;\n };\n // RudderStack requires name -- fall back to empty string\n params.name = isString(r.name) ? r.name : '';\n if (isObject(r.properties) && !isArray(r.properties)) {\n params.properties = r.properties;\n }\n\n sdk.page(params);\n}\n\nasync function applyScreen(\n sdk: RudderStackAnalyticsMock,\n screenMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<void> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (screenMapping === true) {\n // Minimal screen call -- RudderStack requires name, use empty string\n params.name = '';\n sdk.screen(params);\n return;\n }\n\n const resolved = await getMappingValue(\n event,\n screenMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return;\n\n const r = resolved as {\n name?: unknown;\n properties?: unknown;\n };\n // RudderStack requires name -- fall back to empty string\n params.name = isString(r.name) ? r.name : '';\n if (isObject(r.properties) && !isArray(r.properties)) {\n params.properties = r.properties;\n }\n\n sdk.screen(params);\n}\n\nasync function applyAlias(\n sdk: RudderStackAnalyticsMock,\n aliasMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<void> {\n const resolved = await getMappingValue(\n event,\n aliasMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return;\n\n const r = resolved as { previousId?: unknown };\n const previousId = isString(r.previousId) ? r.previousId : undefined;\n if (!previousId) return;\n\n const params: Record<string, unknown> = {\n previousId,\n timestamp,\n };\n // Alias uses userId (the new canonical ID) -- not full identity spread\n if (identity.userId) params.userId = identity.userId;\n\n sdk.alias(params);\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationServer } from '@walkeros/server-core';\n\nexport interface Settings {\n /** RudderStack source write key (required). */\n writeKey: string;\n /** RudderStack data plane URL (required). */\n dataPlaneUrl: string;\n /** walkerOS mapping value path to resolve userId from each event. */\n userId?: string;\n /** walkerOS mapping value path to resolve anonymousId from each event. */\n anonymousId?: string;\n /** Destination-level identity mapping (fires identify() on first push / change). */\n identify?: WalkerOSMapping.Value;\n /** Destination-level group mapping (fires group() on first push / change). */\n group?: WalkerOSMapping.Value;\n /** Downstream destination filtering. Passthrough to SDK integrations param. */\n integrations?: Record<string, boolean | Record<string, unknown>>;\n // SDK constructor options (passthrough)\n /** API path. Default: '/v1/batch'. */\n path?: string;\n /** Events to enqueue before flushing. Default: 20. */\n flushAt?: number;\n /** Max milliseconds before auto-flush. Default: 10000. */\n flushInterval?: number;\n /** Maximum batch payload size in bytes. Default: 460800 (~500KB). */\n maxQueueSize?: number;\n /** Maximum in-memory queue length. Default: 20000. */\n maxInternalQueueSize?: number;\n /** Log level. Default: 'info'. */\n logLevel?: string;\n /** Retry attempts for failed batches. Default: 3. */\n retryCount?: number;\n /** Completely disable the SDK. Default: false. */\n enable?: boolean;\n /** Enable gzip compression. Default: true. */\n gzip?: boolean;\n /** Runtime state -- not user-facing. Mutated by init/push. */\n _analytics?: unknown;\n _state?: RuntimeState;\n}\n\nexport interface RuntimeState {\n lastIdentity?: {\n userId?: string;\n anonymousId?: string;\n traitsHash?: string;\n };\n lastGroup?: {\n groupId?: string;\n traitsHash?: string;\n };\n}\n\nexport type InitSettings = Partial<Settings>;\n\n/**\n * Per-rule mapping settings. Every feature is a walkerOS mapping value\n * resolved via getMappingValue(). The resolved object's keys drive\n * which RudderStack SDK methods to call.\n */\nexport interface Mapping {\n identify?: WalkerOSMapping.Value;\n group?: WalkerOSMapping.Value;\n page?: WalkerOSMapping.Value | boolean;\n screen?: WalkerOSMapping.Value | boolean;\n alias?: WalkerOSMapping.Value;\n}\n\n/**\n * Env -- optional SDK override. Production leaves this undefined and the\n * destination creates a real Analytics instance. Tests provide a mock via\n * env.analytics.\n */\nexport interface Env extends DestinationServer.Env {\n analytics?: RudderStackAnalyticsMock;\n}\n\n/**\n * Mock-friendly interface for the Analytics instance methods the\n * destination actually calls. Tests can provide this via env.analytics\n * instead of the real SDK.\n */\nexport interface RudderStackAnalyticsMock {\n track: (params: Record<string, unknown>) => void;\n identify: (params: Record<string, unknown>) => void;\n group: (params: Record<string, unknown>) => void;\n page: (params: Record<string, unknown>) => void;\n screen: (params: Record<string, unknown>) => void;\n alias: (params: Record<string, unknown>) => void;\n flush: (callback?: (err?: Error, data?: unknown) => void) => Promise<void>;\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport interface Destination extends DestinationServer.Destination<Types> {\n init: DestinationServer.InitFn<Types>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Types>;\n\nexport type InitFn = DestinationServer.InitFn<Types>;\nexport type PushFn = DestinationServer.PushFn<Types>;\nexport type PartialConfig = DestinationServer.PartialConfig<Types>;\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/push.ts","../src/types/index.ts"],"sourcesContent":["import type { Destination } from './types';\nimport { StepError } from '@walkeros/core';\nimport { retryBudget } from '@walkeros/server-core';\nimport { getConfig } from './config';\nimport { push, pushBatch } from './push';\n\n// Types\nexport * as DestinationRudderStack from './types';\n\nexport const destinationRudderStack: Destination = {\n type: 'rudderstack',\n\n // Batched by default, at the SDK's own former defaults (20 events, 10 s).\n config: { batch: { size: 20, wait: 10_000 } },\n\n init({ config: partialConfig, env }) {\n const config = getConfig(partialConfig);\n const { settings } = config;\n\n // Use env.analytics mock if provided (testing), otherwise create real SDK\n if (!env?.analytics) {\n // Production path: create real Analytics instance\n try {\n const Analytics = require('@rudderstack/rudder-sdk-node');\n const {\n writeKey,\n dataPlaneUrl,\n userId: _u,\n anonymousId: _a,\n identify: _i,\n group: _g,\n integrations: _int,\n _analytics: _existing,\n _state: _existingState,\n ...sdkOptions\n } = settings;\n\n // RudderStack uses positional constructor: new Analytics(writeKey, opts).\n // Each push and each batch flushes the SDK and waits until its calls\n // are sent. A failed send reaches each call's callback; the error\n // handler only keeps the SDK from rethrowing it as an unhandled\n // rejection. The SDK's own retry ends within config.timeout: a\n // quarter of it per request, two retries a tenth of it apart. A value\n // set in the settings wins.\n const budget = retryBudget(partialConfig.timeout);\n settings._analytics = new Analytics(writeKey, {\n dataPlaneUrl,\n timeout: budget.attempt,\n retryCount: budget.retries,\n axiosRetryConfig: {\n retryDelay: () => budget.wait,\n shouldResetTimeout: true,\n },\n ...sdkOptions,\n errorHandler: () => undefined,\n });\n } catch (err) {\n throw new StepError('Failed to initialize the RudderStack SDK', {\n code: 'not-ready',\n cause: err,\n });\n }\n }\n\n settings._state = {};\n\n return config;\n },\n\n push,\n\n pushBatch,\n\n async destroy({ config }) {\n const analytics = config?.settings?._analytics;\n if (analytics) await analytics.flush();\n },\n};\n\nexport default destinationRudderStack;\n","import type { Config, Settings, PartialConfig } from './types';\nimport { StepError } from '@walkeros/core';\n\nexport function getConfig(partialConfig: PartialConfig = {}): Config {\n const settings: Partial<Settings> = partialConfig.settings || {};\n const { writeKey, dataPlaneUrl } = settings;\n\n if (!writeKey || !dataPlaneUrl) {\n const missing = [\n ...(writeKey ? [] : ['writeKey']),\n ...(dataPlaneUrl ? [] : ['dataPlaneUrl']),\n ];\n throw new StepError(`Config settings ${missing.join(', ')} missing`, {\n code: 'config',\n });\n }\n\n const settingsConfig: Settings = {\n ...settings,\n writeKey,\n dataPlaneUrl,\n userId: settings.userId ?? 'user.id',\n anonymousId: settings.anonymousId ?? 'user.session',\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { Collector, Destination, Logger, WalkerOS } from '@walkeros/core';\nimport type {\n PushFn,\n PushBatchFn,\n Settings,\n RuntimeState,\n RudderStackAnalyticsMock,\n RudderStackCallback,\n Rule,\n} from './types';\nimport {\n getMappingValue,\n isObject,\n isString,\n isArray,\n isThenable,\n StepError,\n} from '@walkeros/core';\nimport { batchOutcome } from '@walkeros/server-core';\n\n/**\n * Hand one call to the SDK. The promise settles once RudderStack sent it: the\n * SDK answers through the callback, with the error when the send failed; an\n * injected client may answer with a promise instead. A call the SDK refuses\n * at once (it validates each message) fails the same way. The promise is\n * marked handled at once, since its event's outcome reads it only after the\n * flush.\n */\nfunction call(\n message: string,\n send: (done: RudderStackCallback) => unknown,\n): Promise<void> {\n const sent = new Promise<void>((resolve, reject) => {\n const fail = (error: unknown) => reject(failure(message, error));\n let answer: unknown;\n try {\n answer = send((error) => (error ? fail(error) : resolve()));\n } catch (error) {\n fail(error);\n return;\n }\n if (isThenable(answer)) answer.then(() => resolve(), fail);\n });\n sent.catch(() => undefined);\n return sent;\n}\n\n/**\n * A failed send: `timeout` when the SDK's last request timed out (axios\n * answers `ECONNABORTED`, or `ETIMEDOUT`), else `transport`.\n */\nfunction failure(message: string, error: unknown): StepError {\n const code: unknown =\n typeof error === 'object' && error !== null\n ? Reflect.get(error, 'code')\n : undefined;\n const timedOut = code === 'ECONNABORTED' || code === 'ETIMEDOUT';\n return new StepError(message, {\n code: timedOut ? 'timeout' : 'transport',\n cause: error,\n });\n}\n\n/**\n * The id RudderStack deduplicates a call by: the event id for the track\n * call, the event id and the call type for the others, so a resent event is\n * dropped and the calls of one event are not.\n */\nfunction messageIdOf(event: WalkerOS.Event, type?: string): string | undefined {\n if (!event.id) return undefined;\n return type ? `${event.id}-${type}` : event.id;\n}\n\n/** The identity of one call, with the call's own messageId. */\nfunction withMessageId(\n identity: Record<string, unknown>,\n event: WalkerOS.Event,\n type: string,\n): Record<string, unknown> {\n const messageId = messageIdOf(event, type);\n return messageId ? { ...identity, messageId } : identity;\n}\n\n/**\n * Ask the SDK to send what it holds, one flush at a time. A failed send\n * reaches each call's callback; the flush itself does not reject (the SDK's\n * error handler is set).\n */\nfunction flush(settings: Partial<Settings>, sdk: RudderStackAnalyticsMock) {\n const flushing = (settings._flushing ?? Promise.resolve()).then(() =>\n sdk.flush(),\n );\n settings._flushing = flushing.catch(() => undefined);\n return flushing;\n}\n\n/**\n * A configured mapping that resolved to nothing skips its call: a declared\n * skip, said once at DEBUG with the event and the mapping key, never the\n * value, so a wrong mapping path does not look like an event without data.\n */\nfunction skipped(\n logger: Logger.Instance,\n event: WalkerOS.Event,\n call: string,\n key: string,\n): void {\n logger.debug(`RudderStack skipped ${call}: ${key} resolved to nothing`, {\n event: event.name,\n });\n}\n\n/** The settled calls of one event: the first failure, if any. */\nasync function delivered(calls: Promise<PromiseSettledResult<void>[]>) {\n for (const result of await calls)\n if (result.status === 'rejected') throw result.reason;\n}\n\n/**\n * Hand the calls of one event to the SDK (identify, group, page, screen,\n * track) and answer their deliveries. An event without userId or anonymousId\n * cannot be sent and fails with missing-input.\n */\nasync function enqueue(\n event: WalkerOS.Event,\n rule: Rule | undefined,\n data: Destination.Data,\n settings: Partial<Settings>,\n sdk: RudderStackAnalyticsMock,\n collector: Collector.Instance,\n logger: Logger.Instance,\n): Promise<Promise<void>[]> {\n const state: RuntimeState = settings._state || {};\n settings._state = state;\n const mappingSettings = rule?.settings || {};\n const timestamp = new Date(event.timestamp || Date.now());\n\n // 1. Resolve identity from event\n const userId = settings.userId\n ? resolveString(\n await getMappingValue(event, settings.userId, { collector }),\n )\n : undefined;\n const anonymousId = settings.anonymousId\n ? resolveString(\n await getMappingValue(event, settings.anonymousId, { collector }),\n )\n : undefined;\n\n if (!userId && !anonymousId)\n throw new StepError(\n 'RudderStack needs a userId or anonymousId for the event',\n {\n code: 'missing-input',\n },\n );\n\n // Build identity object for every SDK call\n const identity: Record<string, unknown> = {};\n if (userId) identity.userId = userId;\n if (anonymousId) identity.anonymousId = anonymousId;\n\n const calls: Array<Promise<void> | undefined> = [];\n\n // 2. Identify -- rule-level overrides destination-level\n const identifyMapping = mappingSettings.identify ?? settings.identify;\n if (identifyMapping !== undefined) {\n const resolved = await getMappingValue(event, identifyMapping, {\n collector,\n });\n if (isObject(resolved))\n calls.push(\n applyIdentify(\n sdk,\n resolved,\n withMessageId(identity, event, 'identify'),\n state,\n timestamp,\n ),\n );\n else skipped(logger, event, 'identify', 'identify');\n }\n\n // 3. Group -- rule-level overrides destination-level\n const groupMapping = mappingSettings.group ?? settings.group;\n if (groupMapping !== undefined) {\n const resolved = await getMappingValue(event, groupMapping, {\n collector,\n });\n if (isObject(resolved) && isString(resolved.groupId))\n calls.push(\n applyGroup(\n sdk,\n resolved,\n withMessageId(identity, event, 'group'),\n state,\n timestamp,\n ),\n );\n else skipped(logger, event, 'group', 'group');\n }\n\n // 4. Page (the call is not awaited here: it is delivered at the flush)\n if (mappingSettings.page !== undefined) {\n const { sent } = await applyPage(\n sdk,\n mappingSettings.page,\n event,\n withMessageId(identity, event, 'page'),\n collector,\n timestamp,\n );\n if (sent) calls.push(sent);\n else skipped(logger, event, 'page', 'page');\n }\n\n // 5. Screen\n if (mappingSettings.screen !== undefined) {\n const { sent } = await applyScreen(\n sdk,\n mappingSettings.screen,\n event,\n withMessageId(identity, event, 'screen'),\n collector,\n timestamp,\n );\n if (sent) calls.push(sent);\n else skipped(logger, event, 'screen', 'screen');\n }\n\n // 6. Alias\n if (mappingSettings.alias !== undefined) {\n const { sent } = await applyAlias(\n sdk,\n mappingSettings.alias,\n event,\n withMessageId(identity, event, 'alias'),\n collector,\n timestamp,\n );\n if (sent) calls.push(sent);\n else skipped(logger, event, 'alias', 'alias');\n }\n\n // 7. Track (unless silent: true)\n if (rule?.silent !== true) {\n const eventName = isString(rule?.name) ? rule.name : event.name;\n const properties = isObject(data) ? (data as Record<string, unknown>) : {};\n\n const params: Record<string, unknown> = {\n ...identity,\n event: eventName,\n properties,\n timestamp,\n };\n const messageId = messageIdOf(event);\n if (messageId) params.messageId = messageId;\n\n calls.push(\n call('RudderStack track failed', (done) => sdk.track(params, done)),\n );\n }\n\n return calls.filter((sent): sent is Promise<void> => sent !== undefined);\n}\n\n/** The SDK the destination sends through, or a StepError. */\nfunction sdkOf(\n settings: Partial<Settings> | undefined,\n env: { analytics?: RudderStackAnalyticsMock } | undefined,\n): RudderStackAnalyticsMock {\n const sdk = env?.analytics || settings?._analytics;\n if (!settings || !sdk)\n throw new StepError('RudderStack Analytics not initialized', {\n code: 'not-ready',\n });\n return sdk;\n}\n\n/** One event: its calls handed to the SDK, sent, and their deliveries awaited. */\nexport const push: PushFn = async function (\n event,\n { config, rule, data, collector, env, logger },\n) {\n const settings = config.settings ?? {};\n const sdk = sdkOf(config.settings, env);\n const calls = await enqueue(\n event,\n rule,\n data,\n settings,\n sdk,\n collector,\n logger,\n );\n if (calls.length) {\n const settled = Promise.allSettled(calls);\n await flush(settings, sdk);\n await delivered(settled);\n }\n};\n\n/**\n * A flushed `config.batch` batch: every entry's calls handed to the SDK, one\n * flush, and each entry's own outcome from its deliveries. An entry that\n * cannot be sent fails alone; when nothing landed, the batch throws.\n */\nexport const pushBatch: PushBatchFn = async function (\n batch,\n { config, collector, env, logger },\n) {\n const settings = config.settings ?? {};\n const sdk = sdkOf(config.settings, env);\n // Each entry's deliveries, or why its calls could not be handed over.\n const outcomes: Array<{\n settled?: Promise<PromiseSettledResult<void>[]>;\n error?: unknown;\n }> = [];\n\n for (const entry of batch.entries) {\n try {\n const calls = await enqueue(\n entry.event,\n entry.rule,\n entry.data,\n settings,\n sdk,\n collector,\n logger,\n );\n outcomes.push({ settled: Promise.allSettled(calls) });\n } catch (error) {\n outcomes.push({ error });\n }\n }\n\n await flush(settings, sdk);\n\n const failed: Destination.BatchFailure[] = [];\n for (const [index, { settled, error }] of outcomes.entries()) {\n if (!settled) failed.push({ index, error });\n else\n await delivered(settled).catch((reason: unknown) =>\n failed.push({ index, error: reason }),\n );\n }\n\n return batchOutcome(batch.entries.length, failed);\n};\n\nfunction resolveString(value: unknown): string | undefined {\n if (isString(value) && value.length > 0) return value;\n return undefined;\n}\n\nfunction hashTraits(traits: Record<string, unknown> | undefined): string {\n if (!traits) return '';\n try {\n return JSON.stringify(traits);\n } catch {\n return '';\n }\n}\n\nfunction applyIdentify(\n sdk: RudderStackAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n): Promise<void> | undefined {\n const last = state.lastIdentity || {};\n\n // Per-event identify can override userId\n const identifyUserId = isString(resolved.userId)\n ? resolved.userId\n : (identity.userId as string | undefined);\n const traits =\n isObject(resolved.traits) && !isArray(resolved.traits)\n ? (resolved.traits as Record<string, unknown>)\n : undefined;\n\n const traitsHash = hashTraits(traits);\n const userIdChanged = identifyUserId !== last.userId;\n const traitsChanged = traitsHash !== (last.traitsHash ?? '');\n\n if (!userIdChanged && !traitsChanged) return undefined;\n\n const params: Record<string, unknown> = {\n ...identity,\n timestamp,\n };\n if (identifyUserId) params.userId = identifyUserId;\n if (traits) params.traits = traits;\n\n // Remembered at once, so a batch identifies a user once; forgotten again\n // when the delivery fails, so the next event identifies again.\n const current = {\n userId: identifyUserId,\n anonymousId: identity.anonymousId as string | undefined,\n traitsHash,\n };\n state.lastIdentity = current;\n return call('RudderStack identify failed', (done) =>\n sdk.identify(params, done),\n ).catch((error: unknown) => {\n if (state.lastIdentity === current) state.lastIdentity = undefined;\n throw error;\n });\n}\n\nfunction applyGroup(\n sdk: RudderStackAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n): Promise<void> | undefined {\n const groupId = isString(resolved.groupId) ? resolved.groupId : undefined;\n if (!groupId) return undefined;\n\n const last = state.lastGroup || {};\n const traits =\n isObject(resolved.traits) && !isArray(resolved.traits)\n ? (resolved.traits as Record<string, unknown>)\n : undefined;\n\n const traitsHash = hashTraits(traits);\n const groupIdChanged = groupId !== last.groupId;\n const traitsChanged = traitsHash !== (last.traitsHash ?? '');\n if (!groupIdChanged && !traitsChanged) return undefined;\n\n const params: Record<string, unknown> = {\n ...identity,\n groupId,\n timestamp,\n };\n if (traits) params.traits = traits;\n\n // Remembered at once, forgotten again when the delivery fails.\n const current = { groupId, traitsHash };\n state.lastGroup = current;\n return call('RudderStack group failed', (done) =>\n sdk.group(params, done),\n ).catch((error: unknown) => {\n if (state.lastGroup === current) state.lastGroup = undefined;\n throw error;\n });\n}\n\n/** The page call, handed to the SDK; its delivery settles at the flush. */\nasync function applyPage(\n sdk: RudderStackAnalyticsMock,\n pageMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<{ sent?: Promise<void> }> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (pageMapping === true) {\n return {\n sent: call('RudderStack page failed', (done) => sdk.page(params, done)),\n };\n }\n\n const resolved = await getMappingValue(\n event,\n pageMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return {};\n\n const r = resolved as {\n category?: unknown;\n name?: unknown;\n properties?: unknown;\n };\n if (isString(r.category)) params.category = r.category;\n if (isString(r.name)) params.name = r.name;\n if (isObject(r.properties) && !isArray(r.properties)) {\n params.properties = r.properties;\n }\n\n return {\n sent: call('RudderStack page failed', (done) => sdk.page(params, done)),\n };\n}\n\n/** The screen call, handed to the SDK; its delivery settles at the flush. */\nasync function applyScreen(\n sdk: RudderStackAnalyticsMock,\n screenMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<{ sent?: Promise<void> }> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (screenMapping === true) {\n return {\n sent: call('RudderStack screen failed', (done) =>\n sdk.screen(params, done),\n ),\n };\n }\n\n const resolved = await getMappingValue(\n event,\n screenMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return {};\n\n const r = resolved as {\n category?: unknown;\n name?: unknown;\n properties?: unknown;\n };\n if (isString(r.category)) params.category = r.category;\n if (isString(r.name)) params.name = r.name;\n if (isObject(r.properties) && !isArray(r.properties)) {\n params.properties = r.properties;\n }\n\n return {\n sent: call('RudderStack screen failed', (done) => sdk.screen(params, done)),\n };\n}\n\n/** The alias call, handed to the SDK; its delivery settles at the flush. */\nasync function applyAlias(\n sdk: RudderStackAnalyticsMock,\n aliasMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<{ sent?: Promise<void> }> {\n const resolved = await getMappingValue(\n event,\n aliasMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return {};\n\n const r = resolved as { previousId?: unknown };\n const previousId = isString(r.previousId) ? r.previousId : undefined;\n if (!previousId) return {};\n\n const params: Record<string, unknown> = {\n previousId,\n timestamp,\n };\n // Alias uses userId (the new canonical ID) -- not full identity spread\n if (identity.userId) params.userId = identity.userId;\n if (identity.messageId) params.messageId = identity.messageId;\n\n return {\n sent: call('RudderStack alias failed', (done) => sdk.alias(params, done)),\n };\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationServer } from '@walkeros/server-core';\n\nexport interface Settings {\n /** RudderStack source write key (required). */\n writeKey: string;\n /** RudderStack data plane URL (required). */\n dataPlaneUrl: string;\n /** walkerOS mapping value path to resolve userId from each event. */\n userId?: string;\n /** walkerOS mapping value path to resolve anonymousId from each event. */\n anonymousId?: string;\n /** Destination-level identity mapping (fires identify() on first push / change). */\n identify?: WalkerOSMapping.Value;\n /** Destination-level group mapping (fires group() on first push / change). */\n group?: WalkerOSMapping.Value;\n /** Downstream destination filtering. Passthrough to SDK integrations param. */\n integrations?: Record<string, boolean | Record<string, unknown>>;\n // SDK constructor options (passthrough)\n /** API path. Default: '/v1/batch'. */\n path?: string;\n /** Events to enqueue before flushing. Default: 20. */\n flushAt?: number;\n /** Max milliseconds before auto-flush. Default: 10000. */\n flushInterval?: number;\n /** Maximum batch payload size in bytes. Default: 460800 (~500KB). */\n maxQueueSize?: number;\n /** Maximum in-memory queue length. Default: 20000. */\n maxInternalQueueSize?: number;\n /** Log level. Default: 'info'. */\n logLevel?: string;\n /** Retries for a failed request. Default: 2, within config.timeout. */\n retryCount?: number;\n /** Time one request may take (ms). Default: a quarter of config.timeout. */\n timeout?: number;\n /** Completely disable the SDK. Default: false. */\n enable?: boolean;\n /** Enable gzip compression. Default: true. */\n gzip?: boolean;\n /** Runtime state -- not user-facing. Mutated by init/push. */\n _analytics?: RudderStackAnalyticsMock;\n _state?: RuntimeState;\n /** The running flush; the next one waits for it. Runtime only. */\n _flushing?: Promise<void>;\n}\n\nexport interface RuntimeState {\n lastIdentity?: {\n userId?: string;\n anonymousId?: string;\n traitsHash?: string;\n };\n lastGroup?: {\n groupId?: string;\n traitsHash?: string;\n };\n}\n\nexport type InitSettings = Partial<Settings>;\n\n/**\n * Per-rule mapping settings. Every feature is a walkerOS mapping value\n * resolved via getMappingValue(). The resolved object's keys drive\n * which RudderStack SDK methods to call.\n */\nexport interface Mapping {\n identify?: WalkerOSMapping.Value;\n group?: WalkerOSMapping.Value;\n page?: WalkerOSMapping.Value | boolean;\n screen?: WalkerOSMapping.Value | boolean;\n alias?: WalkerOSMapping.Value;\n}\n\n/**\n * Env -- optional SDK override. Production leaves this undefined and the\n * destination creates a real Analytics instance. Tests provide a mock via\n * env.analytics.\n */\nexport interface Env extends DestinationServer.Env {\n analytics?: RudderStackAnalyticsMock;\n}\n\n/**\n * Mock-friendly interface for the Analytics instance methods the\n * destination actually calls. Tests can provide this via env.analytics\n * instead of the real SDK.\n */\n/** Called once the SDK sent the call, with the error if it failed. */\nexport type RudderStackCallback = (error?: Error, data?: unknown) => void;\n\nexport interface RudderStackAnalyticsMock {\n track: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n identify: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n group: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n page: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n screen: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n alias: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n flush: (callback?: RudderStackCallback) => Promise<void>;\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport interface Destination extends DestinationServer.Destination<Types> {\n init: DestinationServer.InitFn<Types>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Types>;\n\nexport type InitFn = DestinationServer.InitFn<Types>;\nexport type PushFn = DestinationServer.PushFn<Types>;\nexport type PushBatchFn = CoreDestination.PushBatchFn<Types>;\nexport type PartialConfig = DestinationServer.PartialConfig<Types>;\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n"],"mappings":"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","names":["import_core","import_server_core","import_core","call"]}