@powerhousedao/analytics-engine-core 0.3.1 → 0.4.0

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.
@@ -3,6 +3,7 @@ export declare class AnalyticsPath {
3
3
  get segments(): AnalyticsPathSegment[];
4
4
  private _segments;
5
5
  static fromString(path: string): AnalyticsPath;
6
+ static fromStringArray(segments: string[]): AnalyticsPath;
6
7
  static fromArray(segments: AnalyticsPathSegment[]): AnalyticsPath;
7
8
  static fromJSON(json: any): AnalyticsPath;
8
9
  constructor(segments: AnalyticsPathSegment[]);
@@ -8,6 +8,9 @@ export class AnalyticsPath {
8
8
  const segments = parseSeparatedList(path, "/").map((segment) => AnalyticsPathSegment.fromString(segment));
9
9
  return new AnalyticsPath(segments);
10
10
  }
11
+ static fromStringArray(segments) {
12
+ return new AnalyticsPath(segments.map((segment) => AnalyticsPathSegment.fromString(segment)));
13
+ }
11
14
  static fromArray(segments) {
12
15
  return new AnalyticsPath(segments);
13
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsPath.js","sourceRoot":"","sources":["../src/AnalyticsPath.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AnalyticsPath.js","sourceRoot":"","sources":["../src/AnalyticsPath.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { AnalyticsPath } from "./AnalyticsPath.js";
2
+ import { AnalyticsUpdateCallback } from "./IAnalyticsStore.js";
3
+ export declare class NotificationError extends Error {
4
+ readonly innerErrors: Error[];
5
+ constructor(errors: Error[]);
6
+ }
7
+ /**
8
+ * Manages subscriptions for analytics paths.
9
+ */
10
+ export declare class AnalyticsSubscriptionManager {
11
+ private _subscriptions;
12
+ /**
13
+ * Subscribe to updates for an analytics path. A subscribed function will be
14
+ * called for:
15
+ *
16
+ * - exact path matches
17
+ * - matching child paths (i.e. an update to /a/b/c will trigger a callback
18
+ * for /a/b/c, /a/b, and /a)
19
+ * - wildcard matches
20
+ *
21
+ * @param path The analytics path to subscribe to.
22
+ * @param callback Function to be called when the path is updated.
23
+ *
24
+ * @returns A function that, when called, unsubscribes from the updates.
25
+ */
26
+ subscribeToPath(path: AnalyticsPath, callback: AnalyticsUpdateCallback): () => void;
27
+ /**
28
+ * Notifies subscribers about updates to paths.
29
+ *
30
+ * @param paths The paths that were updated.
31
+ */
32
+ notifySubscribers(paths: AnalyticsPath[]): void;
33
+ /**
34
+ * Normalizes a path string to ensure consistent comparison.
35
+ */
36
+ private normalizePath;
37
+ /**
38
+ * Checks if a path matches a subscription pattern that may contain wildcards.
39
+ */
40
+ private pathMatchesWildcardPattern;
41
+ /**
42
+ * Gets all path prefixes for a given path.
43
+ *
44
+ * For example, for '/a/b/c' it returns ['/a', '/a/b', '/a/b/c'].
45
+ */
46
+ private getPathPrefixes;
47
+ }
@@ -0,0 +1,161 @@
1
+ export class NotificationError extends Error {
2
+ innerErrors;
3
+ constructor(errors) {
4
+ super(errors.map((e) => e.message).join("\n"));
5
+ this.name = "NotificationError";
6
+ this.innerErrors = errors;
7
+ }
8
+ }
9
+ /**
10
+ * Manages subscriptions for analytics paths.
11
+ */
12
+ export class AnalyticsSubscriptionManager {
13
+ _subscriptions = new Map();
14
+ /**
15
+ * Subscribe to updates for an analytics path. A subscribed function will be
16
+ * called for:
17
+ *
18
+ * - exact path matches
19
+ * - matching child paths (i.e. an update to /a/b/c will trigger a callback
20
+ * for /a/b/c, /a/b, and /a)
21
+ * - wildcard matches
22
+ *
23
+ * @param path The analytics path to subscribe to.
24
+ * @param callback Function to be called when the path is updated.
25
+ *
26
+ * @returns A function that, when called, unsubscribes from the updates.
27
+ */
28
+ subscribeToPath(path, callback) {
29
+ const pathString = this.normalizePath(path.toString("/"));
30
+ if (!this._subscriptions.has(pathString)) {
31
+ this._subscriptions.set(pathString, new Set());
32
+ }
33
+ this._subscriptions.get(pathString).add(callback);
34
+ return () => {
35
+ const callbacks = this._subscriptions.get(pathString);
36
+ if (callbacks) {
37
+ callbacks.delete(callback);
38
+ // only remove the path entry if there are no more callbacks
39
+ if (callbacks.size === 0) {
40
+ this._subscriptions.delete(pathString);
41
+ }
42
+ }
43
+ };
44
+ }
45
+ /**
46
+ * Notifies subscribers about updates to paths.
47
+ *
48
+ * @param paths The paths that were updated.
49
+ */
50
+ notifySubscribers(paths) {
51
+ if (paths.length === 0 || this._subscriptions.size === 0) {
52
+ return;
53
+ }
54
+ const errors = [];
55
+ for (const path of paths) {
56
+ const pathString = this.normalizePath(path.toString("/"));
57
+ const pathPrefixes = this.getPathPrefixes(pathString);
58
+ const matchingSubscriptions = [];
59
+ // add the exact prefix matches
60
+ pathPrefixes
61
+ .filter((prefix) => this._subscriptions.has(prefix))
62
+ .forEach((prefix) => {
63
+ matchingSubscriptions.push({
64
+ prefix,
65
+ callbacks: this._subscriptions.get(prefix),
66
+ });
67
+ });
68
+ // check all wildcard patterns
69
+ for (const [subscriptionPath, callbacks,] of this._subscriptions.entries()) {
70
+ // skip if it's already in the exact matches
71
+ if (pathPrefixes.includes(subscriptionPath)) {
72
+ continue;
73
+ }
74
+ // hceck if this subscription path (which might have wildcards) matches the update path
75
+ if (this.pathMatchesWildcardPattern(pathString, subscriptionPath)) {
76
+ matchingSubscriptions.push({
77
+ prefix: subscriptionPath,
78
+ callbacks,
79
+ });
80
+ }
81
+ }
82
+ if (matchingSubscriptions.length === 0)
83
+ continue;
84
+ // guarantee delivery to all subscribers
85
+ for (const { callbacks } of matchingSubscriptions) {
86
+ for (const callback of callbacks) {
87
+ try {
88
+ callback(path);
89
+ }
90
+ catch (e) {
91
+ errors.push(e);
92
+ }
93
+ }
94
+ }
95
+ }
96
+ if (errors.length > 0) {
97
+ throw new NotificationError(errors);
98
+ }
99
+ }
100
+ /**
101
+ * Normalizes a path string to ensure consistent comparison.
102
+ */
103
+ normalizePath(path) {
104
+ // Handle potential double slashes by first splitting on slashes and rejoining
105
+ const parts = path.split("/").filter((p) => p.length > 0);
106
+ let normalized = "/" + parts.join("/");
107
+ return normalized;
108
+ }
109
+ /**
110
+ * Checks if a path matches a subscription pattern that may contain wildcards.
111
+ */
112
+ pathMatchesWildcardPattern(updatePath, subscriptionPath) {
113
+ // Handle the wildcard segment case
114
+ if (subscriptionPath.includes("*")) {
115
+ const updateSegments = updatePath.split("/").filter((s) => s.length > 0);
116
+ const subscriptionSegments = subscriptionPath
117
+ .split("/")
118
+ .filter((s) => s.length > 0);
119
+ // If subscription is longer than the update path, it can't match
120
+ if (subscriptionSegments.length > updateSegments.length) {
121
+ return false;
122
+ }
123
+ // Compare each segment
124
+ for (let i = 0; i < subscriptionSegments.length; i++) {
125
+ const subSegment = subscriptionSegments[i];
126
+ const updateSegment = updateSegments[i];
127
+ // If segment is * or starts with * (wildcard), it matches anything
128
+ if (subSegment === "*" || subSegment.startsWith("*:")) {
129
+ continue;
130
+ }
131
+ // Otherwise, segments should match exactly
132
+ if (subSegment !== updateSegment) {
133
+ return false;
134
+ }
135
+ }
136
+ return true;
137
+ }
138
+ // If no wildcards, check if subscription is a prefix of the update path
139
+ return (updatePath === subscriptionPath ||
140
+ updatePath.startsWith(subscriptionPath + "/"));
141
+ }
142
+ /**
143
+ * Gets all path prefixes for a given path.
144
+ *
145
+ * For example, for '/a/b/c' it returns ['/a', '/a/b', '/a/b/c'].
146
+ */
147
+ getPathPrefixes(path) {
148
+ const segments = path.split("/").filter((s) => s.length > 0);
149
+ const prefixes = [];
150
+ let currentPath = "";
151
+ for (const segment of segments) {
152
+ currentPath = currentPath ? `${currentPath}/${segment}` : `/${segment}`;
153
+ prefixes.push(currentPath);
154
+ }
155
+ if (prefixes.length === 0 && path === "/") {
156
+ prefixes.push("/");
157
+ }
158
+ return prefixes;
159
+ }
160
+ }
161
+ //# sourceMappingURL=AnalyticsSubscriptionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsSubscriptionManager.js","sourceRoot":"","sources":["../src/AnalyticsSubscriptionManager.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ export type AnalyticsSeriesInput = {
13
13
  dimensions: Record<string, AnalyticsPath>;
14
14
  dimensionMetadata?: Record<string, string>;
15
15
  };
16
+ export type AnalyticsUpdateCallback = (source: AnalyticsPath) => void;
16
17
  export interface IAnalyticsStore {
17
18
  clearSeriesBySource: (source: AnalyticsPath, cleanUpDimensions?: boolean) => Promise<number>;
18
19
  clearEmptyAnalyticsDimensions: () => Promise<number>;
@@ -20,4 +21,5 @@ export interface IAnalyticsStore {
20
21
  addSeriesValue: (input: AnalyticsSeriesInput) => Promise<void>;
21
22
  addSeriesValues: (inputs: AnalyticsSeriesInput[]) => Promise<void>;
22
23
  getDimensions: () => Promise<any>;
24
+ subscribeToSource: (source: AnalyticsPath, callback: AnalyticsUpdateCallback) => () => void;
23
25
  }
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export type { IAnalyticsProfiler } from "./AnalyticsProfiler.js";
2
2
  export { AnalyticsProfiler, PassthroughAnalyticsProfiler, } from "./AnalyticsProfiler.js";
3
- export type { IAnalyticsStore, AnalyticsSeriesInput, } from "./IAnalyticsStore.js";
3
+ export type { IAnalyticsStore, AnalyticsSeriesInput, AnalyticsUpdateCallback, } from "./IAnalyticsStore.js";
4
4
  export { AnalyticsPath, AnalyticsPathSegment } from "./AnalyticsPath.js";
5
5
  export type { AnalyticsQuery, AnalyticsSeriesQuery, AnalyticsSeries, AnalyticsDimension, } from "./AnalyticsQuery.js";
6
6
  export { AnalyticsGranularity } from "./AnalyticsQuery.js";
7
7
  export { AnalyticsQueryEngine } from "./AnalyticsQueryEngine.js";
8
8
  export type { GroupedPeriodResult, GroupedPeriodResults, } from "./AnalyticsDiscretizer.js";
9
9
  export { AnalyticsSerializerTypes, AnalyticsPeriod, } from "./AnalyticsPeriod.js";
10
+ export * from "./AnalyticsSubscriptionManager.js";
package/dist/index.js CHANGED
@@ -3,4 +3,5 @@ export { AnalyticsPath, AnalyticsPathSegment } from "./AnalyticsPath.js";
3
3
  export { AnalyticsGranularity } from "./AnalyticsQuery.js";
4
4
  export { AnalyticsQueryEngine } from "./AnalyticsQueryEngine.js";
5
5
  export { AnalyticsSerializerTypes, AnalyticsPeriod, } from "./AnalyticsPeriod.js";
6
+ export * from "./AnalyticsSubscriptionManager.js";
6
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAOzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAKjE,OAAO,EACL,wBAAwB,EACxB,eAAe,GAChB,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAQhC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAOzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAKjE,OAAO,EACL,wBAAwB,EACxB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,mCAAmC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powerhousedao/analytics-engine-core",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "license": "AGPL-3.0-only",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",