@walkeros/server-destination-rudderstack 4.8.1 → 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.
- package/CHANGELOG.md +32 -0
- package/README.md +6 -1
- package/dist/dev.d.mts +41 -11
- package/dist/dev.d.ts +41 -11
- package/dist/dev.js +1 -1
- package/dist/dev.js.map +1 -1
- package/dist/dev.mjs +1 -1
- package/dist/dev.mjs.map +1 -1
- package/dist/examples/index.d.mts +39 -10
- package/dist/examples/index.d.ts +39 -10
- package/dist/examples/index.js +85 -13
- package/dist/examples/index.mjs +86 -14
- package/dist/index.d.mts +19 -10
- package/dist/index.d.ts +19 -10
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/walkerOS.json +238 -20
- package/package.json +4 -4
package/dist/examples/index.mjs
CHANGED
|
@@ -10,17 +10,16 @@ __export(env_exports, {
|
|
|
10
10
|
push: () => push,
|
|
11
11
|
simulation: () => simulation
|
|
12
12
|
});
|
|
13
|
-
var
|
|
14
|
-
};
|
|
13
|
+
var sent = (_params, callback) => callback?.();
|
|
15
14
|
var asyncNoop = () => Promise.resolve();
|
|
16
15
|
function createMockAnalytics() {
|
|
17
16
|
return {
|
|
18
|
-
track:
|
|
19
|
-
identify:
|
|
20
|
-
group:
|
|
21
|
-
page:
|
|
22
|
-
screen:
|
|
23
|
-
alias:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
/**
|
|
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?:
|
|
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
|
|
80
|
-
identify: (params: Record<string, unknown
|
|
81
|
-
group: (params: Record<string, unknown
|
|
82
|
-
page: (params: Record<string, unknown
|
|
83
|
-
screen: (params: Record<string, unknown
|
|
84
|
-
alias: (params: Record<string, unknown
|
|
85
|
-
flush: (callback?:
|
|
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
|
-
/**
|
|
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?:
|
|
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
|
|
80
|
-
identify: (params: Record<string, unknown
|
|
81
|
-
group: (params: Record<string, unknown
|
|
82
|
-
page: (params: Record<string, unknown
|
|
83
|
-
screen: (params: Record<string, unknown
|
|
84
|
-
alias: (params: Record<string, unknown
|
|
85
|
-
flush: (callback?:
|
|
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,
|
|
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"]}
|