@streamscloud/streams-analytics-collector 2.0.10 → 4.0.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.
Files changed (84) hide show
  1. package/dist/analytics-collector.d.ts +24 -0
  2. package/dist/analytics-collector.js +51 -0
  3. package/dist/appearance-events-tracker.d.ts +15 -0
  4. package/dist/appearance-events-tracker.js +27 -0
  5. package/dist/graphql/report-event.graphql.js +3 -0
  6. package/dist/graphql/report-external-event.graphql.js +3 -0
  7. package/dist/graphql/report-external-measurement.graphql.js +3 -0
  8. package/dist/graphql/report-measurement.graphql.js +3 -0
  9. package/dist/index.d.ts +6 -2
  10. package/dist/index.js +6 -4
  11. package/dist/measurements-batcher.d.ts +24 -0
  12. package/dist/measurements-batcher.js +91 -0
  13. package/dist/reporting/events-reporter.d.ts +15 -0
  14. package/dist/reporting/events-reporter.js +33 -0
  15. package/dist/reporting/gql-data-sender.d.ts +12 -0
  16. package/dist/reporting/gql-data-sender.js +35 -0
  17. package/dist/reporting/index.d.ts +4 -0
  18. package/dist/reporting/measurements-reporter.d.ts +16 -0
  19. package/dist/reporting/measurements-reporter.js +34 -0
  20. package/dist/reporting/types.d.ts +58 -0
  21. package/dist/reporting/types.js +35 -0
  22. package/dist/schemas.d.ts +5 -0
  23. package/dist/schemas.js +17 -0
  24. package/dist/viewport-visibility-tracker.d.ts +13 -0
  25. package/dist/viewport-visibility-tracker.js +104 -0
  26. package/package.json +5 -6
  27. package/dist/adcampaignsquery.graphql.js +0 -3
  28. package/dist/analytics/ViewportVisibilityTracker.d.ts +0 -46
  29. package/dist/analytics/ViewportVisibilityTracker.js +0 -117
  30. package/dist/analytics/app-events-tracker.d.ts +0 -243
  31. package/dist/analytics/app-events-tracker.js +0 -430
  32. package/dist/analytics/index.d.ts +0 -3
  33. package/dist/analytics/index.js +0 -3
  34. package/dist/analytics/types.d.ts +0 -37
  35. package/dist/analytics/types.js +0 -33
  36. package/dist/analytics.graphql.js +0 -3
  37. package/dist/articlequery.graphql.js +0 -3
  38. package/dist/components/index.d.ts +0 -2
  39. package/dist/components/index.js +0 -1
  40. package/dist/components/types.d.ts +0 -19
  41. package/dist/components/types.js +0 -12
  42. package/dist/components-data/component-data-provider.service.d.ts +0 -3
  43. package/dist/components-data/component-data-provider.service.js +0 -35
  44. package/dist/components-data/components-data-fetcher.service.d.ts +0 -5
  45. package/dist/components-data/components-data-fetcher.service.js +0 -35
  46. package/dist/components-data/components-data-parameters-reader.service.d.ts +0 -2
  47. package/dist/components-data/components-data-parameters-reader.service.js +0 -20
  48. package/dist/components-data/index.d.ts +0 -4
  49. package/dist/components-data/index.js +0 -3
  50. package/dist/components-data/types.d.ts +0 -24
  51. package/dist/components-data/types.js +0 -6
  52. package/dist/contentlistsquery.graphql.js +0 -3
  53. package/dist/data-loaders/index.d.ts +0 -2
  54. package/dist/data-loaders/index.js +0 -2
  55. package/dist/data-loaders/short-videos-data-loader/index.d.ts +0 -2
  56. package/dist/data-loaders/short-videos-data-loader/loader.d.ts +0 -4
  57. package/dist/data-loaders/short-videos-data-loader/loader.js +0 -14
  58. package/dist/data-loaders/short-videos-data-loader/mapper.d.ts +0 -3
  59. package/dist/data-loaders/short-videos-data-loader/mapper.js +0 -27
  60. package/dist/data-loaders/short-videos-data-loader/types.d.ts +0 -14
  61. package/dist/data-loaders/streams-data-loader/index.d.ts +0 -2
  62. package/dist/data-loaders/streams-data-loader/loader.d.ts +0 -4
  63. package/dist/data-loaders/streams-data-loader/loader.js +0 -14
  64. package/dist/data-loaders/streams-data-loader/mapper.d.ts +0 -3
  65. package/dist/data-loaders/streams-data-loader/mapper.js +0 -11
  66. package/dist/data-loaders/streams-data-loader/types.d.ts +0 -4
  67. package/dist/data-loaders/types.d.ts +0 -3
  68. package/dist/external-analytics.graphql.js +0 -3
  69. package/dist/internal-analytics.graphql.js +0 -3
  70. package/dist/postsquery.graphql.js +0 -3
  71. package/dist/services/embed-content-api-client.d.ts +0 -8
  72. package/dist/services/embed-content-api-client.js +0 -48
  73. package/dist/services/embed-content-client.service.d.ts +0 -2
  74. package/dist/services/embed-content-client.service.js +0 -5
  75. package/dist/services/index.d.ts +0 -2
  76. package/dist/services/index.js +0 -2
  77. package/dist/services/operations/posts-query.graphql.js +0 -3
  78. package/dist/services/operations/streams-query.graphql.js +0 -3
  79. package/dist/services/types.d.ts +0 -303
  80. package/dist/streams-api-client-model.d.ts +0 -5
  81. package/dist/streams-content-api-client.d.ts +0 -14
  82. package/dist/streams-content-api-client.js +0 -89
  83. package/dist/types.d.ts +0 -4
  84. package/dist/types.js +0 -1
@@ -0,0 +1,24 @@
1
+ import { AppearanceEventsTracker } from './appearance-events-tracker';
2
+ import { MeasurementsBatcher } from './measurements-batcher';
3
+ import { type AnalyticsMetadata, type AnalyticsSchema, type GqlDataSenderOptions, EventsReporter, MeasurementsReporter } from './reporting';
4
+ export type AnalyticsCollectorInitOptions = {
5
+ gqlDataSenderOptions: GqlDataSenderOptions;
6
+ schema: AnalyticsSchema;
7
+ metadata?: AnalyticsMetadata | null;
8
+ };
9
+ declare class AnalyticsCollectorContainer {
10
+ private _eventsReporter?;
11
+ private _measurementsReporter?;
12
+ private _appearanceEventsTracker?;
13
+ private _measurementsBatcher?;
14
+ private _isInitialized;
15
+ initialize(options: AnalyticsCollectorInitOptions): void;
16
+ get eventsReporter(): EventsReporter;
17
+ get measurementsReporter(): MeasurementsReporter;
18
+ get appearanceEventsTracker(): AppearanceEventsTracker;
19
+ get measurementsBatcher(): MeasurementsBatcher;
20
+ get isInitialized(): boolean;
21
+ private assertInitialized;
22
+ }
23
+ export declare const AnalyticsCollector: AnalyticsCollectorContainer;
24
+ export {};
@@ -0,0 +1,51 @@
1
+ import { AppearanceEventsTracker } from './appearance-events-tracker.js';
2
+ import { MeasurementsBatcher } from './measurements-batcher.js';
3
+ import { EventsReporter } from './reporting/events-reporter.js';
4
+ import { GqlDataSender } from './reporting/gql-data-sender.js';
5
+ import { MeasurementsReporter } from './reporting/measurements-reporter.js';
6
+ import './reporting/types.js';
7
+ import { ViewportVisibilityTracker } from './viewport-visibility-tracker.js';
8
+
9
+ class AnalyticsCollectorContainer {
10
+ _eventsReporter;
11
+ _measurementsReporter;
12
+ _appearanceEventsTracker;
13
+ _measurementsBatcher;
14
+ _isInitialized = false;
15
+ initialize(options) {
16
+ const gqlDataSender = new GqlDataSender(options.gqlDataSenderOptions);
17
+ const viewportVisibilityTracker = new ViewportVisibilityTracker();
18
+ this._eventsReporter = new EventsReporter(gqlDataSender, options.schema, options.metadata);
19
+ this._measurementsReporter = new MeasurementsReporter(gqlDataSender, options.schema, options.metadata);
20
+ this._appearanceEventsTracker = new AppearanceEventsTracker(viewportVisibilityTracker, this._eventsReporter);
21
+ this._measurementsBatcher = new MeasurementsBatcher(this._measurementsReporter);
22
+ this._isInitialized = true;
23
+ }
24
+ get eventsReporter() {
25
+ this.assertInitialized();
26
+ return this._eventsReporter;
27
+ }
28
+ get measurementsReporter() {
29
+ this.assertInitialized();
30
+ return this._measurementsReporter;
31
+ }
32
+ get appearanceEventsTracker() {
33
+ this.assertInitialized();
34
+ return this._appearanceEventsTracker;
35
+ }
36
+ get measurementsBatcher() {
37
+ this.assertInitialized();
38
+ return this._measurementsBatcher;
39
+ }
40
+ get isInitialized() {
41
+ return this._isInitialized;
42
+ }
43
+ assertInitialized() {
44
+ if (!this._isInitialized) {
45
+ throw new Error('AnalyticsCollector is not initialized. Call AnalyticsCollector.initialize() first.');
46
+ }
47
+ }
48
+ }
49
+ const AnalyticsCollector = new AnalyticsCollectorContainer();
50
+
51
+ export { AnalyticsCollector };
@@ -0,0 +1,15 @@
1
+ import { type EventsReporter, type Entity, type EntityRelation } from './reporting';
2
+ import type { ViewportVisibilityTracker } from './viewport-visibility-tracker';
3
+ export type TrackingEntityElement = {
4
+ element: HTMLElement;
5
+ entity: Entity;
6
+ relatedEntities?: EntityRelation[] | null;
7
+ attributes?: Record<string, string> | null;
8
+ };
9
+ export declare class AppearanceEventsTracker {
10
+ private viewportVisibilityTracker;
11
+ private eventsReporter;
12
+ constructor(viewportVisibilityTracker: ViewportVisibilityTracker, eventsReporter: EventsReporter);
13
+ trackElementAppearance({ entity, element, relatedEntities, attributes }: TrackingEntityElement): () => void;
14
+ untrackElementAppearance(el: HTMLElement): void;
15
+ }
@@ -0,0 +1,27 @@
1
+ import { EventType } from './reporting/types.js';
2
+
3
+ class AppearanceEventsTracker {
4
+ viewportVisibilityTracker;
5
+ eventsReporter;
6
+ constructor(viewportVisibilityTracker, eventsReporter) {
7
+ this.viewportVisibilityTracker = viewportVisibilityTracker;
8
+ this.eventsReporter = eventsReporter;
9
+ }
10
+ trackElementAppearance({ entity, element, relatedEntities, attributes }) {
11
+ this.viewportVisibilityTracker.registerElement(element, getTrackingId(entity), () => this.eventsReporter.reportEvent({
12
+ entity,
13
+ eventType: EventType.Appeared,
14
+ relatedEntities,
15
+ attributes,
16
+ }));
17
+ return () => this.viewportVisibilityTracker.unregisterElement(element);
18
+ }
19
+ untrackElementAppearance(el) {
20
+ this.viewportVisibilityTracker.unregisterElement(el);
21
+ }
22
+ }
23
+ function getTrackingId(entity) {
24
+ return `${entity.type}::${entity.id}`;
25
+ }
26
+
27
+ export { AppearanceEventsTracker };
@@ -0,0 +1,3 @@
1
+ var ReportEvent = "mutation ReportEvent($input: ReportEventInput!) {\n reportEvent(input: $input) {\n void\n }\n}\n";
2
+
3
+ export { ReportEvent as default };
@@ -0,0 +1,3 @@
1
+ var ReportExternalEvent = "mutation ReportExternalEvent($input: ReportExternalEventInput!) {\n reportExternalEvent(input: $input) {\n void\n }\n}\n";
2
+
3
+ export { ReportExternalEvent as default };
@@ -0,0 +1,3 @@
1
+ var ReportExternalMeasurement = "mutation ReportExternalMeasurement($input: ReportExternalMeasurementInput!) {\n reportExternalMeasurement(input: $input) {\n void\n }\n}\n";
2
+
3
+ export { ReportExternalMeasurement as default };
@@ -0,0 +1,3 @@
1
+ var ReportMeasurement = "mutation ReportMeasurement($input: ReportMeasurementInput!) {\n reportMeasurement(input: $input) {\n void\n }\n}\n";
2
+
3
+ export { ReportMeasurement as default };
package/dist/index.d.ts CHANGED
@@ -1,2 +1,6 @@
1
- export * as Types from "./types";
2
- export { AppEventsTracker, AppEventType, CommunityMessageStatus, } from "./analytics";
1
+ export { EntityRelationType, EntityType, EventType, MeasurementType, type AnalyticsMetadata, type AnalyticsSchema, type Entity, type EntityRelation, } from './reporting/types';
2
+ export { type AnalyticsCollectorInitOptions, AnalyticsCollector } from './analytics-collector';
3
+ export { type TrackingEntityElement, AppearanceEventsTracker } from './appearance-events-tracker';
4
+ export { ViewportVisibilityTracker } from './viewport-visibility-tracker';
5
+ export { type BatchedMeasurement, type MeasurementsBatchReportResult, type FailedBatchedMeasurement, MeasurementsBatcher, } from './measurements-batcher';
6
+ export { Schemas } from './schemas';
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
- import * as types from './types.js';
2
- export { types as Types };
3
- export { AppEventsTracker } from './analytics/app-events-tracker.js';
4
- export { AppEventType, CommunityMessageStatus } from './analytics/types.js';
1
+ export { EntityRelationType, EntityType, EventType, MeasurementType } from './reporting/types.js';
2
+ export { AnalyticsCollector } from './analytics-collector.js';
3
+ export { AppearanceEventsTracker } from './appearance-events-tracker.js';
4
+ export { ViewportVisibilityTracker } from './viewport-visibility-tracker.js';
5
+ export { MeasurementsBatcher } from './measurements-batcher.js';
6
+ export { Schemas } from './schemas.js';
@@ -0,0 +1,24 @@
1
+ import { type Entity, type MeasurementsReporter, type MeasurementType } from './reporting';
2
+ export type BatchedMeasurement = {
3
+ entity: Entity;
4
+ measurementType: MeasurementType;
5
+ value: number;
6
+ attributes?: Record<string, string> | null;
7
+ };
8
+ export type FailedBatchedMeasurement = {
9
+ measurement: BatchedMeasurement;
10
+ error: unknown;
11
+ };
12
+ export type MeasurementsBatchReportResult = {
13
+ succeeded: BatchedMeasurement[];
14
+ failed: FailedBatchedMeasurement[];
15
+ };
16
+ export declare class MeasurementsBatcher {
17
+ private measurementsReporter;
18
+ private containerEntities;
19
+ constructor(measurementsReporter: MeasurementsReporter);
20
+ collect(containers: Entity[], measurement: BatchedMeasurement): void;
21
+ reportBatch(containers: Entity[]): Promise<MeasurementsBatchReportResult>;
22
+ clearBatch(containers: Entity[]): void;
23
+ reset(): void;
24
+ }
@@ -0,0 +1,91 @@
1
+ import { EntityRelationType } from './reporting/types.js';
2
+
3
+ class MeasurementsBatcher {
4
+ measurementsReporter;
5
+ containerEntities = new Map();
6
+ constructor(measurementsReporter) {
7
+ this.measurementsReporter = measurementsReporter;
8
+ }
9
+ collect(containers, measurement) {
10
+ if (containers.length === 0) {
11
+ throw new Error('At least one container entity is required.');
12
+ }
13
+ const groupKey = getContainerGroupKey(containers);
14
+ let entitiesInGroup = this.containerEntities.get(groupKey);
15
+ if (!entitiesInGroup) {
16
+ entitiesInGroup = new Map();
17
+ this.containerEntities.set(groupKey, entitiesInGroup);
18
+ }
19
+ entitiesInGroup.set(getMeasurementKey(measurement), measurement);
20
+ }
21
+ async reportBatch(containers) {
22
+ if (containers.length === 0) {
23
+ throw new Error('At least one container entity is required.');
24
+ }
25
+ const groupKey = getContainerGroupKey(containers);
26
+ const entitiesInGroup = this.containerEntities.get(groupKey);
27
+ if (!entitiesInGroup || entitiesInGroup.size === 0) {
28
+ return { succeeded: [], failed: [] };
29
+ }
30
+ const containerRelations = getContainerRelations(containers);
31
+ const entries = Array.from(entitiesInGroup.entries());
32
+ const succeeded = [];
33
+ const failed = [];
34
+ await Promise.all(entries.map(async ([key, measurement]) => {
35
+ try {
36
+ await this.measurementsReporter.reportMeasurement({
37
+ entity: measurement.entity,
38
+ measurementType: measurement.measurementType,
39
+ value: measurement.value,
40
+ relatedEntities: containerRelations,
41
+ attributes: measurement.attributes
42
+ });
43
+ succeeded.push(measurement);
44
+ entitiesInGroup.delete(key);
45
+ }
46
+ catch (error) {
47
+ failed.push({ measurement, error });
48
+ }
49
+ }));
50
+ if (entitiesInGroup.size === 0) {
51
+ this.containerEntities.delete(groupKey);
52
+ }
53
+ return { succeeded, failed };
54
+ }
55
+ clearBatch(containers) {
56
+ const groupKey = getContainerGroupKey(containers);
57
+ this.containerEntities.delete(groupKey);
58
+ }
59
+ reset() {
60
+ this.containerEntities.clear();
61
+ }
62
+ }
63
+ function getEntityKey(entity) {
64
+ return `${entity.type}::${entity.id}`;
65
+ }
66
+ function getMeasurementKey(container) {
67
+ return `${getEntityKey(container.entity)}::${container.measurementType}`;
68
+ }
69
+ function normalizeContainers(containers) {
70
+ const uniq = new Map();
71
+ for (const c of containers) {
72
+ uniq.set(getEntityKey(c), c);
73
+ }
74
+ return Array.from(uniq.values()).sort((a, b) => {
75
+ const ka = getEntityKey(a);
76
+ const kb = getEntityKey(b);
77
+ return ka < kb ? -1 : ka > kb ? 1 : 0;
78
+ });
79
+ }
80
+ function getContainerGroupKey(containers) {
81
+ const keys = normalizeContainers(containers).map(getEntityKey);
82
+ return keys.join('||');
83
+ }
84
+ function getContainerRelations(containers) {
85
+ return normalizeContainers(containers).map((c) => ({
86
+ relationType: EntityRelationType.NestedIn,
87
+ entity: c,
88
+ }));
89
+ }
90
+
91
+ export { MeasurementsBatcher };
@@ -0,0 +1,15 @@
1
+ import type { AnalyticsSchema, AnalyticsMetadata, EventType, EntityRelation, Entity } from './types';
2
+ import type { GqlDataSender } from './gql-data-sender';
3
+ export type ReportedEvent = {
4
+ entity: Entity;
5
+ eventType: EventType;
6
+ relatedEntities?: EntityRelation[] | null;
7
+ attributes?: Record<string, string> | null;
8
+ };
9
+ export declare class EventsReporter {
10
+ private gqlDataSender;
11
+ private analyticsSchema;
12
+ private analyticsMetadata?;
13
+ constructor(gqlDataSender: GqlDataSender, analyticsSchema: AnalyticsSchema, analyticsMetadata?: AnalyticsMetadata | null);
14
+ reportEvent({ entity, eventType, relatedEntities, attributes }: ReportedEvent): Promise<void>;
15
+ }
@@ -0,0 +1,33 @@
1
+ class EventsReporter {
2
+ gqlDataSender;
3
+ analyticsSchema;
4
+ analyticsMetadata;
5
+ constructor(gqlDataSender, analyticsSchema, analyticsMetadata) {
6
+ this.gqlDataSender = gqlDataSender;
7
+ this.analyticsSchema = analyticsSchema;
8
+ this.analyticsMetadata = analyticsMetadata;
9
+ }
10
+ async reportEvent({ entity, eventType, relatedEntities, attributes }) {
11
+ const input = {
12
+ entityType: entity.type,
13
+ entityId: entity.id,
14
+ eventType,
15
+ relatedEntities: relatedEntities
16
+ ?.map(({ relationType, entity }) => ({
17
+ relationType,
18
+ entityType: entity.type,
19
+ entityId: entity.id,
20
+ })) ?? null,
21
+ installation: this.analyticsMetadata?.installationId
22
+ ? {
23
+ id: this.analyticsMetadata.installationId,
24
+ } : null,
25
+ attributes: attributes
26
+ ? Object.entries(attributes).map(([key, value]) => ({ key, value }))
27
+ : null,
28
+ };
29
+ await this.gqlDataSender.send(this.analyticsSchema.reportEvent, { input });
30
+ }
31
+ }
32
+
33
+ export { EventsReporter };
@@ -0,0 +1,12 @@
1
+ import type { Client } from '@urql/core';
2
+ export type GqlDataSenderOptions = {
3
+ client: Client;
4
+ } | {
5
+ endpoint: string;
6
+ };
7
+ export declare class GqlDataSender {
8
+ private gqlEndpoint;
9
+ private client;
10
+ constructor(options: GqlDataSenderOptions);
11
+ send(query: string, variables?: object): Promise<void>;
12
+ }
@@ -0,0 +1,35 @@
1
+ class GqlDataSender {
2
+ gqlEndpoint = null;
3
+ client = null;
4
+ constructor(options) {
5
+ if ('client' in options) {
6
+ this.client = options.client;
7
+ this.gqlEndpoint = null;
8
+ }
9
+ else {
10
+ this.gqlEndpoint = options.endpoint;
11
+ this.client = null;
12
+ }
13
+ }
14
+ async send(query, variables) {
15
+ if (this.gqlEndpoint) {
16
+ await sendGqlBeacon(this.gqlEndpoint, query, variables);
17
+ }
18
+ else if (this.client) {
19
+ await this.client.mutation(query, variables).toPromise();
20
+ }
21
+ else {
22
+ console.error('GqlDataSender not properly initialized.');
23
+ }
24
+ }
25
+ }
26
+ async function sendGqlBeacon(endpoint, query, variables) {
27
+ const body = JSON.stringify({ query, variables });
28
+ const blob = new Blob([body], { type: 'application/json' });
29
+ const accepted = navigator.sendBeacon(endpoint, blob);
30
+ if (!accepted) {
31
+ throw new Error('Failed to queue analytics beacon.');
32
+ }
33
+ }
34
+
35
+ export { GqlDataSender };
@@ -0,0 +1,4 @@
1
+ export { type ReportedEvent, EventsReporter } from './events-reporter';
2
+ export { type GqlDataSenderOptions, GqlDataSender } from './gql-data-sender';
3
+ export { type ReportedMeasurement, MeasurementsReporter } from './measurements-reporter';
4
+ export { EntityRelationType, EntityType, EventType, MeasurementType, type AnalyticsMetadata, type AnalyticsSchema, type Entity, type EntityRelation, } from './types';
@@ -0,0 +1,16 @@
1
+ import type { AnalyticsSchema, AnalyticsMetadata, MeasurementType, EntityRelation, Entity } from './types';
2
+ import type { GqlDataSender } from './gql-data-sender';
3
+ export type ReportedMeasurement = {
4
+ entity: Entity;
5
+ measurementType: MeasurementType;
6
+ value: number;
7
+ relatedEntities?: EntityRelation[] | null;
8
+ attributes?: Record<string, string> | null;
9
+ };
10
+ export declare class MeasurementsReporter {
11
+ private gqlDataSender;
12
+ private analyticsSchema;
13
+ private analyticsMetadata?;
14
+ constructor(gqlDataSender: GqlDataSender, analyticsSchema: AnalyticsSchema, analyticsMetadata?: AnalyticsMetadata | null);
15
+ reportMeasurement({ entity, measurementType, value, relatedEntities, attributes }: ReportedMeasurement): Promise<void>;
16
+ }
@@ -0,0 +1,34 @@
1
+ class MeasurementsReporter {
2
+ gqlDataSender;
3
+ analyticsSchema;
4
+ analyticsMetadata;
5
+ constructor(gqlDataSender, analyticsSchema, analyticsMetadata) {
6
+ this.gqlDataSender = gqlDataSender;
7
+ this.analyticsSchema = analyticsSchema;
8
+ this.analyticsMetadata = analyticsMetadata;
9
+ }
10
+ async reportMeasurement({ entity, measurementType, value, relatedEntities, attributes }) {
11
+ const input = {
12
+ entityType: entity.type,
13
+ entityId: entity.id,
14
+ measurementType,
15
+ value,
16
+ relatedEntities: relatedEntities
17
+ ?.map(({ relationType, entity }) => ({
18
+ relationType,
19
+ entityType: entity.type,
20
+ entityId: entity.id,
21
+ })) ?? null,
22
+ installation: this.analyticsMetadata?.installationId
23
+ ? {
24
+ id: this.analyticsMetadata.installationId,
25
+ } : null,
26
+ attributes: attributes
27
+ ? Object.entries(attributes).map(([key, value]) => ({ key, value }))
28
+ : null,
29
+ };
30
+ await this.gqlDataSender.send(this.analyticsSchema.reportMeasurement, { input });
31
+ }
32
+ }
33
+
34
+ export { MeasurementsReporter };
@@ -0,0 +1,58 @@
1
+ export declare enum EntityType {
2
+ Article = "ARTICLE",
3
+ Audio = "AUDIO",
4
+ Event = "EVENT",
5
+ Media = "MEDIA",
6
+ Moment = "MOMENT",
7
+ Link = "LINK",
8
+ ShortVideo = "SHORT_VIDEO",
9
+ Text = "TEXT",
10
+ Video = "VIDEO",
11
+ Product = "PRODUCT",
12
+ Stream = "STREAM",
13
+ StreamPage = "STREAM_PAGE",
14
+ Ad = "AD",
15
+ MediaPage = "MEDIA_PAGE"
16
+ }
17
+ export declare enum EventType {
18
+ Appeared = "APPEARED",
19
+ Viewed = "VIEWED",
20
+ Clicked = "CLICKED"
21
+ }
22
+ export declare enum MeasurementType {
23
+ ScrollDepth = "SCROLL_DEPTH",
24
+ EngagementTime = "ENGAGEMENT_TIME",
25
+ Progress = "PROGRESS"
26
+ }
27
+ export declare enum EntityRelationType {
28
+ NestedIn = "NESTED_IN"
29
+ }
30
+ export type AnalyticsSchema = {
31
+ reportEvent: string;
32
+ reportMeasurement: string;
33
+ };
34
+ export type AnalyticsMetadata = {
35
+ installationId?: string | null;
36
+ };
37
+ export type Entity = {
38
+ type: EntityType;
39
+ id: string;
40
+ };
41
+ export type EntityRelation = {
42
+ relationType: EntityRelationType;
43
+ entity: Entity;
44
+ };
45
+ export type EntityRelationInput = {
46
+ relationType: EntityRelationType;
47
+ entityType: EntityType;
48
+ entityId: string;
49
+ };
50
+ export type InstallationInput = {
51
+ id: string;
52
+ device?: string | null;
53
+ browser?: string | null;
54
+ };
55
+ export type KeyValuePair<TKey, TValue> = {
56
+ key: TKey;
57
+ value: TValue;
58
+ };
@@ -0,0 +1,35 @@
1
+ var EntityType;
2
+ (function (EntityType) {
3
+ EntityType["Article"] = "ARTICLE";
4
+ EntityType["Audio"] = "AUDIO";
5
+ EntityType["Event"] = "EVENT";
6
+ EntityType["Media"] = "MEDIA";
7
+ EntityType["Moment"] = "MOMENT";
8
+ EntityType["Link"] = "LINK";
9
+ EntityType["ShortVideo"] = "SHORT_VIDEO";
10
+ EntityType["Text"] = "TEXT";
11
+ EntityType["Video"] = "VIDEO";
12
+ EntityType["Product"] = "PRODUCT";
13
+ EntityType["Stream"] = "STREAM";
14
+ EntityType["StreamPage"] = "STREAM_PAGE";
15
+ EntityType["Ad"] = "AD";
16
+ EntityType["MediaPage"] = "MEDIA_PAGE";
17
+ })(EntityType || (EntityType = {}));
18
+ var EventType;
19
+ (function (EventType) {
20
+ EventType["Appeared"] = "APPEARED";
21
+ EventType["Viewed"] = "VIEWED";
22
+ EventType["Clicked"] = "CLICKED";
23
+ })(EventType || (EventType = {}));
24
+ var MeasurementType;
25
+ (function (MeasurementType) {
26
+ MeasurementType["ScrollDepth"] = "SCROLL_DEPTH";
27
+ MeasurementType["EngagementTime"] = "ENGAGEMENT_TIME";
28
+ MeasurementType["Progress"] = "PROGRESS";
29
+ })(MeasurementType || (MeasurementType = {}));
30
+ var EntityRelationType;
31
+ (function (EntityRelationType) {
32
+ EntityRelationType["NestedIn"] = "NESTED_IN";
33
+ })(EntityRelationType || (EntityRelationType = {}));
34
+
35
+ export { EntityRelationType, EntityType, EventType, MeasurementType };
@@ -0,0 +1,5 @@
1
+ import type { AnalyticsSchema } from './reporting';
2
+ export declare const Schemas: {
3
+ internal: AnalyticsSchema;
4
+ external: AnalyticsSchema;
5
+ };
@@ -0,0 +1,17 @@
1
+ import ReportEvent from './graphql/report-event.graphql.js';
2
+ import ReportExternalEvent from './graphql/report-external-event.graphql.js';
3
+ import ReportMeasurement from './graphql/report-measurement.graphql.js';
4
+ import ReportExternalMeasurement from './graphql/report-external-measurement.graphql.js';
5
+
6
+ const Schemas = {
7
+ internal: {
8
+ reportEvent: ReportEvent,
9
+ reportMeasurement: ReportMeasurement,
10
+ },
11
+ external: {
12
+ reportEvent: ReportExternalEvent,
13
+ reportMeasurement: ReportExternalMeasurement,
14
+ },
15
+ };
16
+
17
+ export { Schemas };
@@ -0,0 +1,13 @@
1
+ export declare class ViewportVisibilityTracker {
2
+ private trackedIds;
3
+ private targetToElements;
4
+ private elementToTargetId;
5
+ private callbacks;
6
+ private observer;
7
+ registerElement(el: HTMLElement, targetId: string, callback: (id: string) => void): void;
8
+ unregisterElement(el: HTMLElement): void;
9
+ unregisterAllElements(targetId: string): void;
10
+ reset(): void;
11
+ private getObserver;
12
+ private handleIntersections;
13
+ }