Skip to content

Commit

Permalink
Merge pull request #377 from elbwalker/372-push-events-via-elb
Browse files Browse the repository at this point in the history
372 push events via elb
  • Loading branch information
alexanderkirtzel committed May 29, 2024
2 parents eefb98e + 2602942 commit bf73cf8
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 73 deletions.
7 changes: 7 additions & 0 deletions .changeset/perfect-needles-walk.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@elbwalker/walker.js': minor
'@elbwalker/client-node': minor
'@elbwalker/types': minor
---

Push events via elb (#372)[https://github.com/elbwalker/walkerOS/issues/372]
56 changes: 32 additions & 24 deletions packages/clients/node/src/push.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,13 @@ function createEventOrCommand(
nameOrEvent: string | WalkerOS.PartialEvent,
pushData: unknown,
): { event?: WalkerOS.Event; command?: string } {
let partialEvent: WalkerOS.PartialEvent;
if (isSameType(nameOrEvent, '' as string))
partialEvent = { event: nameOrEvent };
else {
partialEvent = nameOrEvent || {};
}
// Determine the partial event
const partialEvent: WalkerOS.PartialEvent = isSameType(
nameOrEvent,
'' as string,
)
? { event: nameOrEvent }
: ((nameOrEvent || {}) as WalkerOS.PartialEvent);

if (!partialEvent.event) throw new Error('Event name is required');

Expand All @@ -54,16 +55,23 @@ function createEventOrCommand(
// Increase event counter
++instance.count;

const timestamp = partialEvent.timestamp || Date.now();
const group = partialEvent.group || instance.group;
const count = partialEvent.count || instance.count;
const source = partialEvent.source || {
type: 'node',
id: '',
previous_id: '',
};

const data =
// Extract properties with default fallbacks
const {
timestamp = Date.now(),
group = instance.group,
count = instance.count,
source = { type: 'node', id: '', previous_id: '' },
context = {},
custom = {},
globals = instance.globals,
user = instance.user,
nested = [],
consent = instance.consent,
trigger = '',
version = { tagging: instance.config.tagging },
} = partialEvent;

const data: WalkerOS.Properties =
partialEvent.data ||
(isSameType(pushData, {} as WalkerOS.Properties) ? pushData : {});

Expand All @@ -74,13 +82,13 @@ function createEventOrCommand(
const event: WalkerOS.Event = {
event: `${entity} ${action}`,
data,
context: partialEvent.context || {},
custom: partialEvent.custom || {},
globals: partialEvent.globals || instance.globals,
user: partialEvent.user || instance.user,
nested: partialEvent.nested || [],
consent: partialEvent.consent || instance.consent,
trigger: partialEvent.trigger || '',
context,
custom,
globals,
user,
nested,
consent,
trigger,
entity,
action,
timestamp,
Expand All @@ -90,7 +98,7 @@ function createEventOrCommand(
id: `${timestamp}-${group}-${count}`,
version: {
client: instance.client,
tagging: partialEvent.version?.tagging || instance.config.tagging,
tagging: version.tagging,
},
source,
};
Expand Down
12 changes: 10 additions & 2 deletions packages/clients/walkerjs/src/__tests__/web-client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,14 @@ describe('Walkerjs', () => {
expect(w.bar).toBe(instance);
});

test('empty push', () => {
test('push empty', () => {
(walkerjs as unknown as string[]).push();
elb('');
elb('entity');
expect(mockDataLayer).toHaveBeenCalledTimes(0);
});

test('regular push', () => {
test('push regular', () => {
elb('walker run');

elb('entity action');
Expand Down Expand Up @@ -109,6 +109,14 @@ describe('Walkerjs', () => {
});
});

test('push event', () => {
(walkerjs as unknown as string[]).push();
elb({ event: 'e a', timing: 42 });
expect(mockDataLayer).toHaveBeenCalledWith(
expect.objectContaining({ event: 'e a', timing: 42, data: {} }),
);
});

test('run option', () => {
walkerjs = Walkerjs({ run: false });
expect(walkerjs.allowed).toBeFalsy();
Expand Down
111 changes: 64 additions & 47 deletions packages/clients/walkerjs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,94 +183,111 @@ export function Walkerjs(
nameOrEvent: unknown,
pushData: WebClient.PushData,
pushContext: WebClient.PushContext,
nested: WalkerOS.Entities,
custom: WalkerOS.Properties,
trigger: WebClient.PushOptions = '',
initialNested: WalkerOS.Entities,
initialCustom: WalkerOS.Properties,
initialTrigger: WebClient.PushOptions = '',
): { event?: WalkerOS.Event; command?: string } {
if (!nameOrEvent || !isSameType(nameOrEvent, '' as string)) return {};
// Determine the partial event
const partialEvent: WalkerOS.PartialEvent = isSameType(
nameOrEvent,
'' as string,
)
? { event: nameOrEvent }
: ((nameOrEvent || {}) as WalkerOS.PartialEvent);

if (!partialEvent.event) return {};

// Check for valid entity and action event format
const [entity, action] = nameOrEvent.split(' ');
const [entity, action] = partialEvent.event.split(' ');
if (!entity || !action) return {};

// It's a walker command
if (isCommand(entity)) return { command: action };

// Regular event

// Increase event counter
++instance.count;

const timestamp = Date.now();
const { group, count } = instance;
const id = `${timestamp}-${group}-${count}`;
const source = {
type: 'web',
id: window.location.href,
previous_id: document.referrer,
};
// Extract properties with default fallbacks
const {
timestamp = Date.now(),
group = instance.group,
count = instance.count,
source = {
type: 'web',
id: window.location.href,
previous_id: document.referrer,
},
context = partialEvent.context || {},
globals = instance.globals,
user = instance.user,
nested = partialEvent.nested || initialNested || [],
consent = instance.consent,
trigger = isSameType(initialTrigger, '') ? initialTrigger : '',
version = { tagging: instance.config.tagging },
} = partialEvent;

// Get data and context either from elements or parameters
let data: WalkerOS.Properties = {};
let context: WalkerOS.OrderedProperties = {};
let data: WalkerOS.Properties =
partialEvent.data ||
(isSameType(pushData, {} as WalkerOS.Properties) ? pushData : {});

let eventContext: WalkerOS.OrderedProperties = context;

let elemParameter: undefined | Element;
let dataIsElem = false;
if (isElementOrDocument(pushData)) {
elemParameter = pushData;
dataIsElem = true;
} else if (isSameType(pushData, {} as WalkerOS.Properties)) {
data = pushData;
}

if (isElementOrDocument(pushContext)) {
elemParameter = pushContext;
} else if (isSameType(pushContext, {} as WalkerOS.OrderedProperties)) {
context = pushContext;
eventContext = pushContext;
}

if (elemParameter) {
// Filter for the entity type from the events name
const entityObj = getEntities(instance.config.prefix, elemParameter).find(
(obj) => obj.type == entity,
);

if (entityObj) {
if (dataIsElem) data = entityObj.data;
context = entityObj.context;
eventContext = entityObj.context;
}
}

// Special case for page entity to add the id by default
if (entity === 'page') {
data.id = data.id || window.location.pathname;
}

return {
event: {
event: `${entity} ${action}`,
data,
context,
custom: custom || {},
globals: instance.globals,
user: instance.user,
nested: nested || [],
consent: instance.consent,
id,
trigger: isSameType(trigger, '') ? trigger : '',
entity,
action,
timestamp,
timing: Math.round((performance.now() - instance.timing) / 10) / 100,
group,
count,
version: {
client: instance.client,
tagging: instance.config.tagging,
},
source,
const event: WalkerOS.Event = {
event: `${entity} ${action}`,
data,
context: eventContext,
custom: partialEvent.custom || initialCustom || {},
globals,
user,
nested,
consent,
trigger,
entity,
action,
timestamp,
timing:
partialEvent.timing ||
Math.round((performance.now() - instance.timing) / 10) / 100,
group,
count,
id: `${timestamp}-${group}-${count}`,
version: {
client: instance.client,
tagging: version.tagging,
},
source,
};

return { event };
}

function elbLayerInit(instance: WebClient.Instance) {
Expand Down Expand Up @@ -467,7 +484,7 @@ export function Walkerjs(
}

function push(
nameOrEvent?: unknown, // @TODO can also be an event object
nameOrEvent?: unknown,
pushData: WebClient.PushData = {},
options: WebClient.PushOptions = '',
pushContext: WebClient.PushContext = {},
Expand Down
1 change: 1 addition & 0 deletions packages/types/src/walkeros.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export interface Elb<R = void> {
nested?: Entities,
custom?: Properties,
): R;
(partialEvent: PartialEvent): R;
}

export type PushData = string | Partial<Config> | Consent | User | Properties;
Expand Down

0 comments on commit bf73cf8

Please sign in to comment.