@segment/analytics-node
Version:
https://www.npmjs.com/package/@segment/analytics-node
52 lines • 1.72 kB
JavaScript
import { uuid } from '../../lib/uuid';
const MAX_EVENT_SIZE_IN_KB = 32;
const MAX_BATCH_SIZE_IN_KB = 480; // (500 KB is the limit, leaving some padding)
export class ContextBatch {
id = uuid();
items = [];
sizeInBytes = 0;
maxEventCount;
constructor(maxEventCount) {
this.maxEventCount = Math.max(1, maxEventCount);
}
tryAdd(item) {
if (this.length === this.maxEventCount)
return {
success: false,
message: `Event limit of ${this.maxEventCount} has been exceeded.`,
};
const eventSize = this.calculateSize(item.context);
if (eventSize > MAX_EVENT_SIZE_IN_KB * 1024) {
return {
success: false,
message: `Event exceeds maximum event size of ${MAX_EVENT_SIZE_IN_KB} KB`,
};
}
if (this.sizeInBytes + eventSize > MAX_BATCH_SIZE_IN_KB * 1024) {
return {
success: false,
message: `Event has caused batch size to exceed ${MAX_BATCH_SIZE_IN_KB} KB`,
};
}
this.items.push(item);
this.sizeInBytes += eventSize;
return { success: true };
}
get length() {
return this.items.length;
}
calculateSize(ctx) {
return encodeURI(JSON.stringify(ctx.event)).split(/%..|i/).length;
}
getEvents() {
const events = this.items.map(({ context }) => context.event);
return events;
}
getContexts() {
return this.items.map((item) => item.context);
}
resolveEvents() {
this.items.forEach(({ resolver, context }) => resolver(context));
}
}
//# sourceMappingURL=context-batch.js.map