@customerio/cdp-analytics-core 0.0.0-test-oidc
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/LICENSE.MD +22 -0
- package/README.md +3 -0
- package/dist/cjs/analytics/dispatch.js +54 -0
- package/dist/cjs/analytics/dispatch.js.map +1 -0
- package/dist/cjs/analytics/index.js +3 -0
- package/dist/cjs/analytics/index.js.map +1 -0
- package/dist/cjs/callback/index.js +46 -0
- package/dist/cjs/callback/index.js.map +1 -0
- package/dist/cjs/connection/index.js +16 -0
- package/dist/cjs/connection/index.js.map +1 -0
- package/dist/cjs/context/index.js +87 -0
- package/dist/cjs/context/index.js.map +1 -0
- package/dist/cjs/emitter/index.js +66 -0
- package/dist/cjs/emitter/index.js.map +1 -0
- package/dist/cjs/emitter/interface.js +3 -0
- package/dist/cjs/emitter/interface.js.map +1 -0
- package/dist/cjs/events/index.js +154 -0
- package/dist/cjs/events/index.js.map +1 -0
- package/dist/cjs/events/interfaces.js +3 -0
- package/dist/cjs/events/interfaces.js.map +1 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/logger/index.js +62 -0
- package/dist/cjs/logger/index.js.map +1 -0
- package/dist/cjs/plugins/index.js +3 -0
- package/dist/cjs/plugins/index.js.map +1 -0
- package/dist/cjs/priority-queue/backoff.js +10 -0
- package/dist/cjs/priority-queue/backoff.js.map +1 -0
- package/dist/cjs/priority-queue/index.js +92 -0
- package/dist/cjs/priority-queue/index.js.map +1 -0
- package/dist/cjs/queue/delivery.js +69 -0
- package/dist/cjs/queue/delivery.js.map +1 -0
- package/dist/cjs/queue/event-queue.js +340 -0
- package/dist/cjs/queue/event-queue.js.map +1 -0
- package/dist/cjs/stats/index.js +96 -0
- package/dist/cjs/stats/index.js.map +1 -0
- package/dist/cjs/task/task-group.js +24 -0
- package/dist/cjs/task/task-group.js.map +1 -0
- package/dist/cjs/user/index.js +3 -0
- package/dist/cjs/user/index.js.map +1 -0
- package/dist/cjs/utils/bind-all.js +18 -0
- package/dist/cjs/utils/bind-all.js.map +1 -0
- package/dist/cjs/utils/environment.js +12 -0
- package/dist/cjs/utils/environment.js.map +1 -0
- package/dist/cjs/utils/get-global.js +21 -0
- package/dist/cjs/utils/get-global.js.map +1 -0
- package/dist/cjs/utils/group-by.js +28 -0
- package/dist/cjs/utils/group-by.js.map +1 -0
- package/dist/cjs/utils/has-properties.js +13 -0
- package/dist/cjs/utils/has-properties.js.map +1 -0
- package/dist/cjs/utils/is-plain-object.js +28 -0
- package/dist/cjs/utils/is-plain-object.js.map +1 -0
- package/dist/cjs/utils/is-thenable.js +15 -0
- package/dist/cjs/utils/is-thenable.js.map +1 -0
- package/dist/cjs/utils/p-while.js +25 -0
- package/dist/cjs/utils/p-while.js.map +1 -0
- package/dist/cjs/utils/pick.js +10 -0
- package/dist/cjs/utils/pick.js.map +1 -0
- package/dist/cjs/utils/ts-helpers.js +3 -0
- package/dist/cjs/utils/ts-helpers.js.map +1 -0
- package/dist/cjs/validation/assertions.js +51 -0
- package/dist/cjs/validation/assertions.js.map +1 -0
- package/dist/cjs/validation/helpers.js +26 -0
- package/dist/cjs/validation/helpers.js.map +1 -0
- package/dist/esm/analytics/dispatch.js +49 -0
- package/dist/esm/analytics/dispatch.js.map +1 -0
- package/dist/esm/analytics/index.js +2 -0
- package/dist/esm/analytics/index.js.map +1 -0
- package/dist/esm/callback/index.js +40 -0
- package/dist/esm/callback/index.js.map +1 -0
- package/dist/esm/connection/index.js +11 -0
- package/dist/esm/connection/index.js.map +1 -0
- package/dist/esm/context/index.js +84 -0
- package/dist/esm/context/index.js.map +1 -0
- package/dist/esm/emitter/index.js +63 -0
- package/dist/esm/emitter/index.js.map +1 -0
- package/dist/esm/emitter/interface.js +2 -0
- package/dist/esm/emitter/interface.js.map +1 -0
- package/dist/esm/events/index.js +151 -0
- package/dist/esm/events/index.js.map +1 -0
- package/dist/esm/events/interfaces.js +2 -0
- package/dist/esm/events/interfaces.js.map +1 -0
- package/dist/esm/index.js +19 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logger/index.js +59 -0
- package/dist/esm/logger/index.js.map +1 -0
- package/dist/esm/plugins/index.js +2 -0
- package/dist/esm/plugins/index.js.map +1 -0
- package/dist/esm/priority-queue/backoff.js +6 -0
- package/dist/esm/priority-queue/backoff.js.map +1 -0
- package/dist/esm/priority-queue/index.js +89 -0
- package/dist/esm/priority-queue/index.js.map +1 -0
- package/dist/esm/queue/delivery.js +64 -0
- package/dist/esm/queue/delivery.js.map +1 -0
- package/dist/esm/queue/event-queue.js +337 -0
- package/dist/esm/queue/event-queue.js.map +1 -0
- package/dist/esm/stats/index.js +93 -0
- package/dist/esm/stats/index.js.map +1 -0
- package/dist/esm/task/task-group.js +20 -0
- package/dist/esm/task/task-group.js.map +1 -0
- package/dist/esm/user/index.js +2 -0
- package/dist/esm/user/index.js.map +1 -0
- package/dist/esm/utils/bind-all.js +14 -0
- package/dist/esm/utils/bind-all.js.map +1 -0
- package/dist/esm/utils/environment.js +7 -0
- package/dist/esm/utils/environment.js.map +1 -0
- package/dist/esm/utils/get-global.js +17 -0
- package/dist/esm/utils/get-global.js.map +1 -0
- package/dist/esm/utils/group-by.js +24 -0
- package/dist/esm/utils/group-by.js.map +1 -0
- package/dist/esm/utils/has-properties.js +9 -0
- package/dist/esm/utils/has-properties.js.map +1 -0
- package/dist/esm/utils/is-plain-object.js +24 -0
- package/dist/esm/utils/is-plain-object.js.map +1 -0
- package/dist/esm/utils/is-thenable.js +11 -0
- package/dist/esm/utils/is-thenable.js.map +1 -0
- package/dist/esm/utils/p-while.js +21 -0
- package/dist/esm/utils/p-while.js.map +1 -0
- package/dist/esm/utils/pick.js +6 -0
- package/dist/esm/utils/pick.js.map +1 -0
- package/dist/esm/utils/ts-helpers.js +2 -0
- package/dist/esm/utils/ts-helpers.js.map +1 -0
- package/dist/esm/validation/assertions.js +46 -0
- package/dist/esm/validation/assertions.js.map +1 -0
- package/dist/esm/validation/helpers.js +18 -0
- package/dist/esm/validation/helpers.js.map +1 -0
- package/dist/types/analytics/dispatch.d.ts +20 -0
- package/dist/types/analytics/dispatch.d.ts.map +1 -0
- package/dist/types/analytics/index.d.ts +12 -0
- package/dist/types/analytics/index.d.ts.map +1 -0
- package/dist/types/callback/index.d.ts +11 -0
- package/dist/types/callback/index.d.ts.map +1 -0
- package/dist/types/connection/index.d.ts +3 -0
- package/dist/types/connection/index.d.ts.map +1 -0
- package/dist/types/context/index.d.ts +44 -0
- package/dist/types/context/index.d.ts.map +1 -0
- package/dist/types/emitter/index.d.ts +25 -0
- package/dist/types/emitter/index.d.ts.map +1 -0
- package/dist/types/emitter/interface.d.ts +27 -0
- package/dist/types/emitter/interface.d.ts.map +1 -0
- package/dist/types/events/index.d.ts +31 -0
- package/dist/types/events/index.d.ts.map +1 -0
- package/dist/types/events/interfaces.d.ts +379 -0
- package/dist/types/events/interfaces.d.ts.map +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logger/index.d.ts +19 -0
- package/dist/types/logger/index.d.ts.map +1 -0
- package/dist/types/plugins/index.d.ts +25 -0
- package/dist/types/plugins/index.d.ts.map +1 -0
- package/dist/types/priority-queue/backoff.d.ts +13 -0
- package/dist/types/priority-queue/backoff.d.ts.map +1 -0
- package/dist/types/priority-queue/index.d.ts +25 -0
- package/dist/types/priority-queue/index.d.ts.map +1 -0
- package/dist/types/queue/delivery.d.ts +5 -0
- package/dist/types/queue/delivery.d.ts.map +1 -0
- package/dist/types/queue/event-queue.d.ts +43 -0
- package/dist/types/queue/event-queue.d.ts.map +1 -0
- package/dist/types/stats/index.d.ts +34 -0
- package/dist/types/stats/index.d.ts.map +1 -0
- package/dist/types/task/task-group.d.ts +6 -0
- package/dist/types/task/task-group.d.ts.map +1 -0
- package/dist/types/user/index.d.ts +6 -0
- package/dist/types/user/index.d.ts.map +1 -0
- package/dist/types/utils/bind-all.d.ts +4 -0
- package/dist/types/utils/bind-all.d.ts.map +1 -0
- package/dist/types/utils/environment.d.ts +3 -0
- package/dist/types/utils/environment.d.ts.map +1 -0
- package/dist/types/utils/get-global.d.ts +2 -0
- package/dist/types/utils/get-global.d.ts.map +1 -0
- package/dist/types/utils/group-by.d.ts +4 -0
- package/dist/types/utils/group-by.d.ts.map +1 -0
- package/dist/types/utils/has-properties.d.ts +4 -0
- package/dist/types/utils/has-properties.d.ts.map +1 -0
- package/dist/types/utils/is-plain-object.d.ts +2 -0
- package/dist/types/utils/is-plain-object.d.ts.map +1 -0
- package/dist/types/utils/is-thenable.d.ts +6 -0
- package/dist/types/utils/is-thenable.d.ts.map +1 -0
- package/dist/types/utils/p-while.d.ts +2 -0
- package/dist/types/utils/p-while.d.ts.map +1 -0
- package/dist/types/utils/pick.d.ts +2 -0
- package/dist/types/utils/pick.d.ts.map +1 -0
- package/dist/types/utils/ts-helpers.d.ts +13 -0
- package/dist/types/utils/ts-helpers.d.ts.map +1 -0
- package/dist/types/validation/assertions.d.ts +8 -0
- package/dist/types/validation/assertions.d.ts.map +1 -0
- package/dist/types/validation/helpers.d.ts +7 -0
- package/dist/types/validation/helpers.d.ts.map +1 -0
- package/package.json +40 -0
- package/src/analytics/dispatch.ts +58 -0
- package/src/analytics/index.ts +11 -0
- package/src/callback/index.ts +51 -0
- package/src/connection/index.ts +13 -0
- package/src/context/index.ts +123 -0
- package/src/emitter/index.ts +65 -0
- package/src/emitter/interface.ts +31 -0
- package/src/events/index.ts +285 -0
- package/src/events/interfaces.ts +453 -0
- package/src/index.ts +18 -0
- package/src/logger/index.ts +74 -0
- package/src/plugins/index.ts +43 -0
- package/src/priority-queue/backoff.ts +24 -0
- package/src/priority-queue/index.ts +103 -0
- package/src/queue/delivery.ts +73 -0
- package/src/queue/event-queue.ts +320 -0
- package/src/stats/index.ts +88 -0
- package/src/task/task-group.ts +31 -0
- package/src/user/index.ts +7 -0
- package/src/utils/bind-all.ts +19 -0
- package/src/utils/environment.ts +7 -0
- package/src/utils/get-global.ts +16 -0
- package/src/utils/group-by.ts +30 -0
- package/src/utils/has-properties.ts +7 -0
- package/src/utils/is-plain-object.ts +26 -0
- package/src/utils/is-thenable.ts +9 -0
- package/src/utils/p-while.ts +12 -0
- package/src/utils/pick.ts +8 -0
- package/src/utils/ts-helpers.ts +13 -0
- package/src/validation/assertions.ts +54 -0
- package/src/validation/helpers.ts +27 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-global.d.ts","sourceRoot":"","sources":["../../../src/utils/get-global.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,SAAS,gCAcrB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-by.d.ts","sourceRoot":"","sources":["../../../src/utils/group-by.ts"],"names":[],"mappings":"AAAA,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,CAAA;AAE7C,wBAAgB,OAAO,CAAC,CAAC,EACvB,UAAU,EAAE,CAAC,EAAE,EACf,OAAO,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAwBrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"has-properties.d.ts","sourceRoot":"","sources":["../../../src/utils/has-properties.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EAC9D,GAAG,EAAE,CAAC,EACN,GAAG,IAAI,EAAE,CAAC,EAAE,GACX,GAAG,IAAI,CAAC,GAAG;KAAG,CAAC,IAAI,CAAC,GAAG,OAAO;CAAE,CAGlC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-plain-object.d.ts","sourceRoot":"","sources":["../../../src/utils/is-plain-object.ts"],"names":[],"mappings":"AAMA,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAmB3E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-thenable.d.ts","sourceRoot":"","sources":["../../../src/utils/is-thenable.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,OAID,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p-while.d.ts","sourceRoot":"","sources":["../../../src/utils/p-while.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,2CACoB,OAAO,uCAE3C,QAAQ,IAAI,CAQd,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick.d.ts","sourceRoot":"","sources":["../../../src/utils/pick.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,yEAEQ,OAAO,eAKjC,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remove Index Signature
|
|
3
|
+
*/
|
|
4
|
+
export type RemoveIndexSignature<T> = {
|
|
5
|
+
[K in keyof T as {} extends Record<K, 1> ? never : K]: T[K];
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Recursively make all object properties nullable
|
|
9
|
+
*/
|
|
10
|
+
export type DeepNullable<T> = {
|
|
11
|
+
[K in keyof T]: T[K] extends object ? DeepNullable<T[K]> | null : T[K] | null;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=ts-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/ts-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;KACnC,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC5D,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;KAC3B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;CAC9E,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CoreCustomerioEvent } from '../events';
|
|
2
|
+
export declare class ValidationError extends Error {
|
|
3
|
+
field: string;
|
|
4
|
+
constructor(field: string, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function assertMessageId(event: CoreCustomerioEvent): void;
|
|
7
|
+
export declare function validateEvent(event?: CoreCustomerioEvent | null): void;
|
|
8
|
+
//# sourceMappingURL=assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../../src/validation/assertions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAG/C,qBAAa,eAAgB,SAAQ,KAAK;IACxC,KAAK,EAAE,MAAM,CAAA;gBAED,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI3C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAOhE;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,QAgC/D"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CoreCustomerioEvent } from '../events';
|
|
2
|
+
export declare function isString(obj: unknown): obj is string;
|
|
3
|
+
export declare function isNumber(obj: unknown): obj is number;
|
|
4
|
+
export declare function isFunction(obj: unknown): obj is Function;
|
|
5
|
+
export declare function isPlainObject(obj: unknown): obj is Record<string | symbol | number, any>;
|
|
6
|
+
export declare function hasUser(event: CoreCustomerioEvent): boolean;
|
|
7
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/validation/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAE/C,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAEpD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,QAAQ,CAExD;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,OAAO,GACX,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAI9C;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAI3D"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@customerio/cdp-analytics-core",
|
|
3
|
+
"version": "0.0.0-test-oidc",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/customerio/cdp-analytics-js",
|
|
7
|
+
"directory": "packages/core"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"main": "./dist/cjs/index.js",
|
|
11
|
+
"module": "./dist/esm/index.js",
|
|
12
|
+
"types": "./dist/types/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/",
|
|
15
|
+
"src/",
|
|
16
|
+
"!**/__tests__/**",
|
|
17
|
+
"!*.tsbuildinfo"
|
|
18
|
+
],
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"scripts": {
|
|
21
|
+
"test": "yarn jest",
|
|
22
|
+
"lint": "yarn concurrently 'yarn:eslint .' 'yarn:tsc --noEmit'",
|
|
23
|
+
"build": "yarn concurrently 'yarn:build:*'",
|
|
24
|
+
"build:esm": "yarn tsc -p tsconfig.build.json",
|
|
25
|
+
"build:cjs": "yarn tsc -p tsconfig.build.json --outDir ./dist/cjs --module commonjs",
|
|
26
|
+
"watch": "yarn build:esm --watch",
|
|
27
|
+
"watch:test": "yarn test --watch",
|
|
28
|
+
"tsc": "yarn run -T tsc",
|
|
29
|
+
"eslint": "yarn run -T eslint",
|
|
30
|
+
"concurrently": "yarn run -T concurrently",
|
|
31
|
+
"jest": "yarn run -T jest"
|
|
32
|
+
},
|
|
33
|
+
"packageManager": "yarn@3.2.1",
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@lukeed/uuid": "^2.0.0",
|
|
36
|
+
"dset": "^3.1.2",
|
|
37
|
+
"tslib": "^2.4.1"
|
|
38
|
+
},
|
|
39
|
+
"stableVersion": "0.3.8"
|
|
40
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { CoreContext } from '../context'
|
|
2
|
+
import { Callback } from '../events/interfaces'
|
|
3
|
+
import { CoreEventQueue } from '../queue/event-queue'
|
|
4
|
+
import { invokeCallback } from '../callback'
|
|
5
|
+
import { Emitter } from '../emitter'
|
|
6
|
+
|
|
7
|
+
export type DispatchOptions<Ctx extends CoreContext = CoreContext> = {
|
|
8
|
+
timeout?: number
|
|
9
|
+
debug?: boolean
|
|
10
|
+
callback?: Callback<Ctx>
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* The amount of time in ms to wait before invoking the callback. */
|
|
14
|
+
export const getDelay = (startTimeInEpochMS: number, timeoutInMS?: number) => {
|
|
15
|
+
const elapsedTime = Date.now() - startTimeInEpochMS
|
|
16
|
+
// increasing the timeout increases the delay by almost the same amount -- this is weird legacy behavior.
|
|
17
|
+
return Math.max((timeoutInMS ?? 300) - elapsedTime, 0)
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Push an event into the dispatch queue and invoke any callbacks.
|
|
21
|
+
*
|
|
22
|
+
* @param event - Event to enqueue.
|
|
23
|
+
* @param queue - Queue to dispatch against.
|
|
24
|
+
* @param emitter - This is typically an instance of "Analytics" -- used for metrics / progress information.
|
|
25
|
+
* @param options
|
|
26
|
+
*/
|
|
27
|
+
export async function dispatch<
|
|
28
|
+
Ctx extends CoreContext,
|
|
29
|
+
EQ extends CoreEventQueue<Ctx>
|
|
30
|
+
>(
|
|
31
|
+
ctx: Ctx,
|
|
32
|
+
queue: EQ,
|
|
33
|
+
emitter: Emitter,
|
|
34
|
+
options?: DispatchOptions<Ctx>
|
|
35
|
+
): Promise<Ctx> {
|
|
36
|
+
emitter.emit('dispatch_start', ctx)
|
|
37
|
+
|
|
38
|
+
const startTime = Date.now()
|
|
39
|
+
let dispatched: Ctx
|
|
40
|
+
if (queue.isEmpty()) {
|
|
41
|
+
dispatched = await queue.dispatchSingle(ctx)
|
|
42
|
+
} else {
|
|
43
|
+
dispatched = await queue.dispatch(ctx)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (options?.callback) {
|
|
47
|
+
dispatched = await invokeCallback(
|
|
48
|
+
dispatched,
|
|
49
|
+
options.callback,
|
|
50
|
+
getDelay(startTime, options.timeout)
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
if (options?.debug) {
|
|
54
|
+
dispatched.flush()
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return dispatched
|
|
58
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface CoreAnalytics {
|
|
2
|
+
track(...args: unknown[]): unknown
|
|
3
|
+
page(...args: unknown[]): unknown
|
|
4
|
+
identify(...args: unknown[]): unknown
|
|
5
|
+
group(...args: unknown[]): unknown
|
|
6
|
+
alias(...args: unknown[]): unknown
|
|
7
|
+
screen(...args: unknown[]): unknown
|
|
8
|
+
register(...plugins: unknown[]): Promise<unknown>
|
|
9
|
+
deregister(...plugins: unknown[]): Promise<unknown>
|
|
10
|
+
readonly VERSION: string
|
|
11
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { CoreContext } from '../context'
|
|
2
|
+
import type { Callback } from '../events'
|
|
3
|
+
|
|
4
|
+
export function pTimeout<T>(promise: Promise<T>, timeout: number): Promise<T> {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const timeoutId = setTimeout(() => {
|
|
7
|
+
reject(Error('Promise timed out'))
|
|
8
|
+
}, timeout)
|
|
9
|
+
|
|
10
|
+
promise
|
|
11
|
+
.then((val) => {
|
|
12
|
+
clearTimeout(timeoutId)
|
|
13
|
+
return resolve(val)
|
|
14
|
+
})
|
|
15
|
+
.catch(reject)
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function sleep(timeoutInMs: number): Promise<void> {
|
|
20
|
+
return new Promise((resolve) => setTimeout(resolve, timeoutInMs))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @param ctx
|
|
25
|
+
* @param callback - the function to invoke
|
|
26
|
+
* @param delay - aka "timeout". The amount of time in ms to wait before invoking the callback.
|
|
27
|
+
*/
|
|
28
|
+
export function invokeCallback<Ctx extends CoreContext>(
|
|
29
|
+
ctx: Ctx,
|
|
30
|
+
callback: Callback<Ctx>,
|
|
31
|
+
delay: number
|
|
32
|
+
): Promise<Ctx> {
|
|
33
|
+
const cb = () => {
|
|
34
|
+
try {
|
|
35
|
+
return Promise.resolve(callback(ctx))
|
|
36
|
+
} catch (err) {
|
|
37
|
+
return Promise.reject(err)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
sleep(delay)
|
|
43
|
+
// pTimeout ensures that the callback can't cause the context to hang
|
|
44
|
+
.then(() => pTimeout(cb(), 1000))
|
|
45
|
+
.catch((err) => {
|
|
46
|
+
ctx?.log('warn', 'Callback Error', { error: err })
|
|
47
|
+
ctx?.stats.increment('callback_error')
|
|
48
|
+
})
|
|
49
|
+
.then(() => ctx)
|
|
50
|
+
)
|
|
51
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { CoreCustomerioEvent } from '../events/interfaces'
|
|
2
|
+
|
|
3
|
+
import { v4 as uuid } from '@lukeed/uuid'
|
|
4
|
+
import { dset } from 'dset'
|
|
5
|
+
import { CoreLogger, LogLevel, LogMessage } from '../logger'
|
|
6
|
+
import { CoreStats, CoreMetric, NullStats } from '../stats'
|
|
7
|
+
|
|
8
|
+
export interface SerializedContext {
|
|
9
|
+
id: string
|
|
10
|
+
event: CoreCustomerioEvent
|
|
11
|
+
logs: LogMessage[]
|
|
12
|
+
metrics?: CoreMetric[]
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ContextFailedDelivery {
|
|
16
|
+
reason: unknown
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface CancelationOptions {
|
|
20
|
+
retry?: boolean
|
|
21
|
+
reason?: string
|
|
22
|
+
type?: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class ContextCancelation {
|
|
26
|
+
retry: boolean
|
|
27
|
+
type: string
|
|
28
|
+
reason?: string
|
|
29
|
+
|
|
30
|
+
constructor(options: CancelationOptions) {
|
|
31
|
+
this.retry = options.retry ?? true
|
|
32
|
+
this.type = options.type ?? 'plugin Error'
|
|
33
|
+
this.reason = options.reason ?? ''
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export abstract class CoreContext<
|
|
38
|
+
Event extends CoreCustomerioEvent = CoreCustomerioEvent
|
|
39
|
+
> {
|
|
40
|
+
event: Event
|
|
41
|
+
logger: CoreLogger
|
|
42
|
+
stats: CoreStats
|
|
43
|
+
attempts = 0
|
|
44
|
+
|
|
45
|
+
private _failedDelivery?: ContextFailedDelivery
|
|
46
|
+
private _id: string
|
|
47
|
+
|
|
48
|
+
constructor(
|
|
49
|
+
event: Event,
|
|
50
|
+
id = uuid(),
|
|
51
|
+
stats: CoreStats = new NullStats(),
|
|
52
|
+
logger = new CoreLogger()
|
|
53
|
+
) {
|
|
54
|
+
this.event = event
|
|
55
|
+
this._id = id
|
|
56
|
+
this.logger = logger
|
|
57
|
+
this.stats = stats
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static system(): void {
|
|
61
|
+
// This should be overridden by the subclass to return an instance of the subclass.
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
isSame(other: CoreContext): boolean {
|
|
65
|
+
return other.id === this.id
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
cancel(error?: Error | ContextCancelation): never {
|
|
69
|
+
if (error) {
|
|
70
|
+
throw error
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
throw new ContextCancelation({ reason: 'Context Cancel' })
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
log(level: LogLevel, message: string, extras?: object): void {
|
|
77
|
+
this.logger.log(level, message, extras)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
get id(): string {
|
|
81
|
+
return this._id
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
updateEvent(path: string, val: unknown): Event {
|
|
85
|
+
// Don't allow integrations that are set to false to be overwritten with integration settings.
|
|
86
|
+
if (path.split('.')[0] === 'integrations') {
|
|
87
|
+
const integrationName = path.split('.')[1]
|
|
88
|
+
|
|
89
|
+
if (this.event.integrations?.[integrationName] === false) {
|
|
90
|
+
return this.event
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
dset(this.event, path, val)
|
|
95
|
+
return this.event
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
failedDelivery(): ContextFailedDelivery | undefined {
|
|
99
|
+
return this._failedDelivery
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
setFailedDelivery(options: ContextFailedDelivery) {
|
|
103
|
+
this._failedDelivery = options
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
logs(): LogMessage[] {
|
|
107
|
+
return this.logger.logs
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
flush(): void {
|
|
111
|
+
this.logger.flush()
|
|
112
|
+
this.stats.flush()
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
toJSON(): SerializedContext {
|
|
116
|
+
return {
|
|
117
|
+
id: this._id,
|
|
118
|
+
event: this.event,
|
|
119
|
+
logs: this.logger.logs,
|
|
120
|
+
metrics: this.stats.metrics,
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
type EventName = string
|
|
2
|
+
type EventFnArgs = any[]
|
|
3
|
+
type EmitterContract = Record<EventName, EventFnArgs>
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Event Emitter that takes the expected contract as a generic
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* type Contract = {
|
|
10
|
+
* delivery_success: [DeliverySuccessResponse, Metrics],
|
|
11
|
+
* delivery_failure: [DeliveryError]
|
|
12
|
+
* }
|
|
13
|
+
* new Emitter<Contract>()
|
|
14
|
+
* .on('delivery_success', (res, metrics) => ...)
|
|
15
|
+
* .on('delivery_failure', (err) => ...)
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export class Emitter<Contract extends EmitterContract = EmitterContract> {
|
|
19
|
+
private callbacks: Partial<Contract> = {}
|
|
20
|
+
on<EventName extends keyof Contract>(
|
|
21
|
+
event: EventName,
|
|
22
|
+
callback: (...args: Contract[EventName]) => void
|
|
23
|
+
): this {
|
|
24
|
+
if (!this.callbacks[event]) {
|
|
25
|
+
this.callbacks[event] = [callback] as Contract[EventName]
|
|
26
|
+
} else {
|
|
27
|
+
this.callbacks[event]!.push(callback)
|
|
28
|
+
}
|
|
29
|
+
return this
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
once<EventName extends keyof Contract>(
|
|
33
|
+
event: EventName,
|
|
34
|
+
callback: (...args: Contract[EventName]) => void
|
|
35
|
+
): this {
|
|
36
|
+
const on = (...args: Contract[EventName]): void => {
|
|
37
|
+
this.off(event, on)
|
|
38
|
+
callback.apply(this, args)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
this.on(event, on)
|
|
42
|
+
return this
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
off<EventName extends keyof Contract>(
|
|
46
|
+
event: EventName,
|
|
47
|
+
callback: (...args: Contract[EventName]) => void
|
|
48
|
+
): this {
|
|
49
|
+
const fns = this.callbacks[event] ?? []
|
|
50
|
+
const without = fns.filter((fn) => fn !== callback) as Contract[EventName]
|
|
51
|
+
this.callbacks[event] = without
|
|
52
|
+
return this
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
emit<EventName extends keyof Contract>(
|
|
56
|
+
event: EventName,
|
|
57
|
+
...args: Contract[EventName]
|
|
58
|
+
): this {
|
|
59
|
+
const callbacks = this.callbacks[event] ?? []
|
|
60
|
+
callbacks.forEach((callback) => {
|
|
61
|
+
callback.apply(this, args)
|
|
62
|
+
})
|
|
63
|
+
return this
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CoreContext } from '../context'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This is the base contract for all emitted errors. This interface may be extended.
|
|
5
|
+
*/
|
|
6
|
+
export interface CoreEmittedError<Ctx extends CoreContext> {
|
|
7
|
+
/**
|
|
8
|
+
* e.g. 'delivery_failure'
|
|
9
|
+
*/
|
|
10
|
+
code: string
|
|
11
|
+
/**
|
|
12
|
+
* Why the error occurred. This can be an actual error object or a just a message.
|
|
13
|
+
*/
|
|
14
|
+
reason?: unknown
|
|
15
|
+
ctx?: Ctx
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type CoreEmitterContract<
|
|
19
|
+
Ctx extends CoreContext,
|
|
20
|
+
Err extends CoreEmittedError<Ctx> = CoreEmittedError<Ctx>
|
|
21
|
+
> = {
|
|
22
|
+
alias: [ctx: Ctx]
|
|
23
|
+
track: [ctx: Ctx]
|
|
24
|
+
identify: [ctx: Ctx]
|
|
25
|
+
page: [ctx: Ctx]
|
|
26
|
+
screen: [ctx: Ctx]
|
|
27
|
+
group: [ctx: Ctx]
|
|
28
|
+
register: [pluginNames: string[]]
|
|
29
|
+
deregister: [pluginNames: string[]]
|
|
30
|
+
error: [error: Err]
|
|
31
|
+
}
|