@glomex/integration-analytics 1.1480.0 → 1.1481.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 (44) hide show
  1. package/README.md +241 -11
  2. package/dist/base-event-mapper.d.ts +56 -0
  3. package/dist/base-event-mapper.js +313 -0
  4. package/dist/comscore/comscore-event-mapper.d.ts +26 -0
  5. package/dist/comscore/comscore-event-mapper.js +218 -0
  6. package/dist/comscore/comscore-metadata.d.ts +15 -0
  7. package/dist/comscore/comscore-metadata.js +58 -0
  8. package/dist/comscore/comscore-sdk-loader.d.ts +12 -0
  9. package/dist/comscore/comscore-sdk-loader.js +35 -0
  10. package/dist/comscore/comscore-types.d.ts +11 -0
  11. package/dist/comscore/comscore-types.js +6 -0
  12. package/dist/comscore/index.d.ts +72 -0
  13. package/dist/comscore/index.js +101 -0
  14. package/dist/nielsen/index.d.ts +70 -0
  15. package/dist/nielsen/index.js +87 -0
  16. package/dist/nielsen/nielsen-event-mapper.d.ts +23 -0
  17. package/dist/nielsen/nielsen-event-mapper.js +167 -0
  18. package/dist/nielsen/nielsen-metadata.d.ts +35 -0
  19. package/dist/nielsen/nielsen-metadata.js +134 -0
  20. package/dist/nielsen/nielsen-sdk-loader.d.ts +13 -0
  21. package/dist/nielsen/nielsen-sdk-loader.js +70 -0
  22. package/dist/nielsen/nielsen-types.d.ts +128 -0
  23. package/dist/nielsen/nielsen-types.js +4 -0
  24. package/dist/npaw/index.d.ts +7 -291
  25. package/dist/npaw/index.js +32 -313
  26. package/dist/npaw/npaw-turbo-player-ad-adapter.d.ts +43 -0
  27. package/dist/npaw/npaw-turbo-player-ad-adapter.js +142 -0
  28. package/dist/npaw/npaw-turbo-player-adapter.d.ts +47 -0
  29. package/dist/npaw/npaw-turbo-player-adapter.js +136 -0
  30. package/dist/npaw/npaw-types.d.ts +202 -0
  31. package/dist/npaw/npaw-types.js +6 -0
  32. package/dist/npaw/package-info.d.ts +2 -0
  33. package/dist/npaw/package-info.js +3 -0
  34. package/dist/sensic/index.d.ts +89 -0
  35. package/dist/sensic/index.js +103 -0
  36. package/dist/sensic/sensic-event-mapper.d.ts +25 -0
  37. package/dist/sensic/sensic-event-mapper.js +147 -0
  38. package/dist/sensic/sensic-metadata.d.ts +34 -0
  39. package/dist/sensic/sensic-metadata.js +102 -0
  40. package/dist/sensic/sensic-sdk-loader.d.ts +16 -0
  41. package/dist/sensic/sensic-sdk-loader.js +102 -0
  42. package/dist/sensic/sensic-types.d.ts +80 -0
  43. package/dist/sensic/sensic-types.js +6 -0
  44. package/package.json +19 -8
@@ -0,0 +1,43 @@
1
+ import { type IntegrationElement, type IntegrationElementEventMap } from '@glomex/integration-web-component';
2
+ import type { AdapterAd } from './npaw-types';
3
+ declare module './npaw-turbo-player-ad-adapter' {
4
+ interface NpawTurboPlayerAdAdapter extends AdapterAd {
5
+ player: IntegrationElement;
6
+ }
7
+ }
8
+ type AdapterEventListeners = {
9
+ [K in keyof IntegrationElementEventMap]?: (event: IntegrationElementEventMap[K]) => void;
10
+ };
11
+ export declare class NpawTurboPlayerAdAdapter {
12
+ _refs?: AdapterEventListeners;
13
+ getVersion(): string;
14
+ getPlayerVersion(): string;
15
+ getPlayhead(): number;
16
+ getTitle(): string;
17
+ getTitle2(): string | undefined;
18
+ getCreativeId(): string | null;
19
+ getProvider(): string | null;
20
+ getAdInsertionType(): string;
21
+ getDuration(): number | null;
22
+ getBreaksTime(): null;
23
+ getResource(): string;
24
+ getGivenAds(): number | null;
25
+ getAudioEnabled(): boolean;
26
+ getIsSkippable(): boolean;
27
+ getIsFullscreen(): boolean;
28
+ getIsVisible(): boolean;
29
+ getPosition(): string | null;
30
+ registerListeners(): void;
31
+ unregisterListeners(): void;
32
+ _isSupportedAd(): boolean | undefined;
33
+ impressionListener(): void;
34
+ pausedListener(): void;
35
+ resumedListener(): void;
36
+ bufferingStartListener(): void;
37
+ bufferingEndListener(): void;
38
+ completeListener(): void;
39
+ clickListener(): void;
40
+ skippedListener(): void;
41
+ errorListener(event: IntegrationElementEventMap['aderror']): void;
42
+ }
43
+ export {};
@@ -0,0 +1,142 @@
1
+ import { IntegrationEvent } from '@glomex/integration-web-component';
2
+ import { version } from './package-info';
3
+ export class NpawTurboPlayerAdAdapter {
4
+ _refs;
5
+ getVersion() {
6
+ return `turbo-ad-v${version}`;
7
+ }
8
+ getPlayerVersion() {
9
+ return this.player.version;
10
+ }
11
+ getPlayhead() {
12
+ return this.player.adCurrentTime;
13
+ }
14
+ getTitle() {
15
+ return this.player.currentAd?.title || '';
16
+ }
17
+ getTitle2() {
18
+ return this.player.currentAd?.advertiserName || undefined;
19
+ }
20
+ getCreativeId() {
21
+ return this.player.currentAd?.creativeId || null;
22
+ }
23
+ getProvider() {
24
+ return this.player.currentAd?.adSystem || null;
25
+ }
26
+ getAdInsertionType() {
27
+ return 'client-side';
28
+ }
29
+ getDuration() {
30
+ return this.player.currentAd?.duration || this.player.adDuration || null;
31
+ }
32
+ getBreaksTime() {
33
+ return null; // maybe returning the ad markers
34
+ }
35
+ getResource() {
36
+ return this.player.currentAd?.adUrl || 'unknown';
37
+ }
38
+ getGivenAds() {
39
+ return this.player.currentAd?.totalAds || null;
40
+ }
41
+ getAudioEnabled() {
42
+ return Boolean(!this.player.adMuted);
43
+ }
44
+ getIsSkippable() {
45
+ return this.player.currentAd?.skippable || false;
46
+ }
47
+ getIsFullscreen() {
48
+ return this.player.presentationMode === 'fullscreen';
49
+ }
50
+ getIsVisible() {
51
+ return this.getNpawUtils().calculateAdViewability(this.player);
52
+ }
53
+ getPosition() {
54
+ if (this.player.currentAd?.breakName === 'preroll') {
55
+ return this.getNpawReference().Constants.AdPosition.Preroll;
56
+ }
57
+ if (this.player.currentAd?.breakName === 'midroll') {
58
+ return this.getNpawReference().Constants.AdPosition.Midroll;
59
+ }
60
+ if (this.player.currentAd?.breakName === 'postroll') {
61
+ return this.getNpawReference().Constants.AdPosition.Postroll;
62
+ }
63
+ return null;
64
+ }
65
+ registerListeners() {
66
+ this._refs = {
67
+ [IntegrationEvent.AD_IMPRESSION]: this.impressionListener.bind(this),
68
+ [IntegrationEvent.AD_RESUMED]: this.resumedListener.bind(this),
69
+ [IntegrationEvent.AD_PAUSED]: this.pausedListener.bind(this),
70
+ [IntegrationEvent.AD_BUFFERING_START]: this.bufferingStartListener.bind(this),
71
+ [IntegrationEvent.AD_BUFFERING_END]: this.bufferingEndListener.bind(this),
72
+ [IntegrationEvent.AD_CLICK]: this.clickListener.bind(this),
73
+ [IntegrationEvent.AD_SKIPPED]: this.skippedListener.bind(this),
74
+ [IntegrationEvent.AD_COMPLETE]: this.completeListener.bind(this),
75
+ [IntegrationEvent.AD_ERROR]: this.errorListener.bind(this)
76
+ };
77
+ for (const type of Object.keys(this._refs)) {
78
+ const handler = this._refs?.[type];
79
+ // If your IntegrationElement has typed addEventListener<K extends keyof IntegrationElementEventMap>(
80
+ // type: K, listener: (ev: IntegrationElementEventMap[K]) => any
81
+ // ), this will be fully type-safe
82
+ this.player.addEventListener(type, handler);
83
+ }
84
+ }
85
+ unregisterListeners() {
86
+ for (const type of Object.keys(this._refs || {})) {
87
+ const handler = this._refs?.[type];
88
+ this.player.removeEventListener(type, handler);
89
+ }
90
+ this._refs = undefined;
91
+ }
92
+ _isSupportedAd() {
93
+ // for now we do not track non-linear ads
94
+ return this.player.currentAd?.isLinear;
95
+ }
96
+ impressionListener() {
97
+ if (!this._isSupportedAd())
98
+ return;
99
+ this.fireStart({}, 'impressionListener');
100
+ this.fireJoin({}, 'impressionListener');
101
+ }
102
+ pausedListener() {
103
+ if (!this._isSupportedAd())
104
+ return;
105
+ this.firePause({}, IntegrationEvent.AD_PAUSED);
106
+ }
107
+ resumedListener() {
108
+ if (!this._isSupportedAd())
109
+ return;
110
+ this.fireResume({}, IntegrationEvent.AD_RESUMED);
111
+ }
112
+ bufferingStartListener() {
113
+ if (!this._isSupportedAd())
114
+ return;
115
+ this.fireBufferBegin({}, true, IntegrationEvent.AD_BUFFERING_START);
116
+ }
117
+ bufferingEndListener() {
118
+ if (!this._isSupportedAd())
119
+ return;
120
+ this.fireBufferEnd({}, IntegrationEvent.AD_BUFFERING_END);
121
+ }
122
+ completeListener() {
123
+ if (!this._isSupportedAd())
124
+ return;
125
+ this.fireStop({}, IntegrationEvent.AD_COMPLETE);
126
+ }
127
+ clickListener() {
128
+ if (!this._isSupportedAd())
129
+ return;
130
+ this.fireClick(this.player.currentAd?.clickThroughUrl || '');
131
+ }
132
+ skippedListener() {
133
+ if (!this._isSupportedAd())
134
+ return;
135
+ this.fireSkip();
136
+ }
137
+ errorListener(event) {
138
+ if (!this._isSupportedAd())
139
+ return;
140
+ this.fireError(event.detail.error.code, event.detail.error.message);
141
+ }
142
+ }
@@ -0,0 +1,47 @@
1
+ import type { IntegrationElement } from '@glomex/integration-web-component';
2
+ import { type IntegrationElementEventMap } from '@glomex/integration-web-component';
3
+ import { NpawTurboPlayerAdAdapter } from './npaw-turbo-player-ad-adapter';
4
+ import type { AdapterContent } from './npaw-types';
5
+ declare module './npaw-turbo-player-adapter' {
6
+ interface NpawTurboPlayerAdapter extends AdapterContent {
7
+ player: IntegrationElement;
8
+ }
9
+ }
10
+ type AdapterEventListeners = {
11
+ [K in keyof IntegrationElementEventMap]?: (event: IntegrationElementEventMap[K]) => void;
12
+ };
13
+ export declare class NpawTurboPlayerAdapter {
14
+ _refs?: AdapterEventListeners;
15
+ adsAdapters: {
16
+ npawTurboPlayerAdAdapter: typeof NpawTurboPlayerAdAdapter;
17
+ };
18
+ getPlayerName(): string;
19
+ getVersion(): string;
20
+ getPlayerVersion(): string;
21
+ getResource(): string | null;
22
+ getTitle(): string | null;
23
+ getDuration(): number;
24
+ getPlayhead(): number;
25
+ getPlayrate(): number;
26
+ getIsLive(): boolean;
27
+ getBitrate(): number | null;
28
+ getLatency(): number | undefined;
29
+ getRendition(): string;
30
+ getThroughput(): number | undefined;
31
+ getDroppedFrames(): number | undefined;
32
+ getTotalBytes(): number | null;
33
+ registerListeners(): void;
34
+ unregisterListeners(): void;
35
+ contentStart(): void;
36
+ contentImpression(): void;
37
+ playListener(): void;
38
+ pauseListener(): void;
39
+ seekingListener(): void;
40
+ seekedListener(): void;
41
+ contentBufferStart(): void;
42
+ contentBufferEnd(): void;
43
+ contentStop(): void;
44
+ contentSelect(): void;
45
+ contentError(event: IntegrationElementEventMap['contenterror']): void;
46
+ }
47
+ export {};
@@ -0,0 +1,136 @@
1
+ import { IntegrationEvent, Mimetype, PlaybackMode } from '@glomex/integration-web-component';
2
+ import { NpawTurboPlayerAdAdapter } from './npaw-turbo-player-ad-adapter';
3
+ import { version } from './package-info';
4
+ export class NpawTurboPlayerAdapter {
5
+ _refs;
6
+ adsAdapters = {
7
+ npawTurboPlayerAdAdapter: NpawTurboPlayerAdAdapter
8
+ };
9
+ getPlayerName() {
10
+ return 'turbo-player';
11
+ }
12
+ getVersion() {
13
+ return `turbo-v${version}`;
14
+ }
15
+ getPlayerVersion() {
16
+ return this.player.version;
17
+ }
18
+ getResource() {
19
+ return this.player.source?.src || null;
20
+ }
21
+ getTitle() {
22
+ return this.player.content?.title || null;
23
+ }
24
+ getDuration() {
25
+ return this.player.duration;
26
+ }
27
+ getPlayhead() {
28
+ return this.getIsLive() ? this.player.wallClockTime : this.player.currentTime;
29
+ }
30
+ getPlayrate() {
31
+ return 1;
32
+ }
33
+ getIsLive() {
34
+ return this.player.content?.sources[0]?.playbackMode === PlaybackMode.LIVE;
35
+ }
36
+ getBitrate() {
37
+ return this.player.getVideoPlaybackQuality()?.bitrate || null;
38
+ }
39
+ getLatency() {
40
+ return this.player.getVideoPlaybackQuality()?.liveLatency;
41
+ }
42
+ getRendition() {
43
+ const { width, height, bandwidth } = this.player.getVideoPlaybackQuality() || {};
44
+ if (width && height && bandwidth) {
45
+ return this.getNpawUtils().buildRenditionString(width, height, bandwidth);
46
+ }
47
+ // without a value youbora triggers "init" event instead of "start"
48
+ return 'unknown';
49
+ }
50
+ getThroughput() {
51
+ return this.player.getVideoPlaybackQuality()?.throughput;
52
+ }
53
+ getDroppedFrames() {
54
+ return this.player.getVideoPlaybackQuality()?.droppedVideoFrames;
55
+ }
56
+ getTotalBytes() {
57
+ return this.player.getVideoPlaybackQuality()?.bytes || null;
58
+ }
59
+ registerListeners() {
60
+ this._refs = {
61
+ [IntegrationEvent.CONTENT_PLAY]: this.playListener.bind(this),
62
+ [IntegrationEvent.CONTENT_PAUSE]: this.pauseListener.bind(this),
63
+ [IntegrationEvent.CONTENT_SEEKING]: this.seekingListener.bind(this),
64
+ [IntegrationEvent.CONTENT_SEEKED]: this.seekedListener.bind(this),
65
+ [IntegrationEvent.CONTENT_BUFFERING_START]: this.contentBufferStart.bind(this),
66
+ [IntegrationEvent.CONTENT_BUFFERING_END]: this.contentBufferEnd.bind(this),
67
+ [IntegrationEvent.CONTENT_START]: this.contentStart.bind(this),
68
+ [IntegrationEvent.CONTENT_IMPRESSION]: this.contentImpression.bind(this),
69
+ [IntegrationEvent.CONTENT_STOP]: this.contentStop.bind(this),
70
+ [IntegrationEvent.CONTENT_SELECT]: this.contentSelect.bind(this),
71
+ [IntegrationEvent.CONTENT_ERROR]: this.contentError.bind(this)
72
+ };
73
+ for (const type of Object.keys(this._refs)) {
74
+ const handler = this._refs?.[type];
75
+ // If your IntegrationElement has typed addEventListener<K extends keyof IntegrationElementEventMap>(
76
+ // type: K, listener: (ev: IntegrationElementEventMap[K]) => any
77
+ // ), this will be fully type-safe
78
+ this.player.addEventListener(type, handler);
79
+ }
80
+ this.plugin.setAdsAdapter(this.getAdapterClass('npawTurboPlayerAdAdapter'), this.getVideo().getVideoKey());
81
+ }
82
+ unregisterListeners() {
83
+ for (const type of Object.keys(this._refs || {})) {
84
+ const handler = this._refs?.[type];
85
+ this.player.removeEventListener(type, handler);
86
+ }
87
+ this._refs = undefined;
88
+ this.plugin.removeAdsAdapter(this.getVideo().getVideoKey());
89
+ }
90
+ contentStart() {
91
+ const { options } = this.getVideo();
92
+ const streamingProtocol = this.player.source?.mimetype === Mimetype.DASH
93
+ ? 'DASH'
94
+ : this.player.source?.mimetype === Mimetype.HLS
95
+ ? 'HLS'
96
+ : undefined;
97
+ options['content.id'] = this.player.source?.id || this.player.content?.id;
98
+ options['content.streamingProtocol'] = streamingProtocol;
99
+ options['content.playbackType'] = this.player.source?.playbackMode;
100
+ options['content.tvShow'] = this.player.content?.show?.name;
101
+ options['content.season'] = this.player.content?.show?.seasonNumber;
102
+ options['content.language'] = this.player.content?.language;
103
+ this.fireStart({}, IntegrationEvent.CONTENT_START);
104
+ }
105
+ contentImpression() {
106
+ this.fireJoin({}, IntegrationEvent.CONTENT_IMPRESSION);
107
+ }
108
+ playListener() {
109
+ this.fireResume({}, IntegrationEvent.CONTENT_PLAY);
110
+ this.plugin.getAdsAdapter().fireAdBreakStop({});
111
+ }
112
+ pauseListener() {
113
+ this.firePause({}, 'pauseListener');
114
+ }
115
+ seekingListener() {
116
+ this.fireSeekBegin({}, true, IntegrationEvent.CONTENT_SEEKING);
117
+ }
118
+ seekedListener() {
119
+ this.fireSeekEnd({}, IntegrationEvent.CONTENT_SEEKED);
120
+ }
121
+ contentBufferStart() {
122
+ this.fireBufferBegin({}, true, IntegrationEvent.CONTENT_BUFFERING_START);
123
+ }
124
+ contentBufferEnd() {
125
+ this.fireBufferEnd({}, IntegrationEvent.CONTENT_BUFFERING_END);
126
+ }
127
+ contentStop() {
128
+ this.fireStop({}, IntegrationEvent.CONTENT_STOP);
129
+ }
130
+ contentSelect() {
131
+ this.fireStop({}, IntegrationEvent.CONTENT_SELECT);
132
+ }
133
+ contentError(event) {
134
+ this.fireFatalError(event.detail.error.code, event.detail.error.message, undefined, 'fatal', IntegrationEvent.CONTENT_ERROR);
135
+ }
136
+ }
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Interfaces gathered from the npm module npaw-plugin by generating source from the contained sourcemap.
3
+ *
4
+ * @see https://www.npmjs.com/package/npaw-plugin
5
+ */
6
+ export interface Adapter {
7
+ flags: AdapterFlags;
8
+ monitor: PlayheadMonitor | null;
9
+ player: unknown;
10
+ plugin: {
11
+ getAdsAdapter(): AdapterAd;
12
+ setAdsAdapter(adapterClass: unknown, videoKey: string): void;
13
+ removeAdsAdapter(videoKey?: string): void;
14
+ };
15
+ getVideo(): {
16
+ getVideoKey(): string;
17
+ removeAdsAdapter(videoKey?: string): void;
18
+ options: Record<string, unknown>;
19
+ };
20
+ getNpawUtils(): {
21
+ calculateAdViewability(player: HTMLElement): boolean;
22
+ buildRenditionString(width: number, height: number, bitrate: number): string;
23
+ };
24
+ getNpawReference(): {
25
+ Constants: {
26
+ AdPosition: {
27
+ Preroll: string;
28
+ Midroll: string;
29
+ Postroll: string;
30
+ };
31
+ };
32
+ };
33
+ setPlayer(player: unknown): void;
34
+ registerListeners(): void;
35
+ unregisterListeners(): void;
36
+ monitorPlayhead(monitorBuffers: boolean, monitorSeeks: boolean, interval?: number): void;
37
+ stopMonitor(): void;
38
+ monitorReadyState(intervalMilliseconds?: number): void;
39
+ startReadyStateMonitor(): void;
40
+ stopReadyStateMonitor(): void;
41
+ checkReadyState(readyState: number | null | undefined, triggeredEvent?: string): void;
42
+ getPlugin(): unknown;
43
+ getLog(): unknown;
44
+ isStarted(): boolean;
45
+ getAdapterClass(className: string): unknown;
46
+ getAdapterName(adapterObject?: unknown): string;
47
+ getAdapterNameFromClass(adapterClass?: unknown): string;
48
+ getAdapterClasses(): Record<string, unknown>;
49
+ getPlayhead(): number | null;
50
+ getDuration(): number | null;
51
+ getBitrate(): number | null;
52
+ getTotalBytes(): number | null;
53
+ getTitle(): string | null;
54
+ getResource(): string | null;
55
+ getPlayerVersion(): string | null;
56
+ getPlayerName(): string | null;
57
+ getVersion(): string;
58
+ getVideoObject(): unknown | null;
59
+ getLastUsedCdn(): string | undefined;
60
+ checkExistsPlayer(): boolean;
61
+ checkExistsObjectOnPage(object: unknown): boolean;
62
+ fireInit(params?: Record<string, unknown>, triggeredEvent?: string): void;
63
+ fireStart(params?: Record<string, unknown>, triggeredEvent?: string): void;
64
+ fireJoin(params?: Record<string, unknown>, triggeredEvent?: string): void;
65
+ firePause(params?: Record<string, unknown>, triggeredEvent?: string): void;
66
+ fireResume(params?: Record<string, unknown>, triggeredEvent?: string): void;
67
+ fireBufferBegin(params?: Record<string, unknown>, convertFromSeek?: boolean, triggeredEvent?: string, triggeredByStateProperty?: boolean): void;
68
+ fireBufferEnd(params?: Record<string, unknown>, triggeredEvent?: string): void;
69
+ cancelBuffer(params?: Record<string, unknown>): void;
70
+ fireStop(params?: Record<string, unknown>, triggeredEvent?: string): void;
71
+ firePlayerLog(playerEvent: string, playerData: unknown): void;
72
+ setIsAds(value: boolean): void;
73
+ fireCasted(params?: Record<string, unknown>, triggeredEvent?: string): void;
74
+ fireError(code?: string | number | Record<string, unknown>, msg?: string, metadata?: Record<string, unknown>, level?: string, triggeredEvent?: string, fatalError?: boolean, duration?: number): void;
75
+ fireFatalError(code?: string | number | Record<string, unknown>, msg?: string, metadata?: Record<string, unknown>, level?: string, triggeredEvent?: string, duration?: number): void;
76
+ isLegacyBufferBehaviourEnabled(): boolean;
77
+ }
78
+ export interface AdapterContent extends Adapter {
79
+ getPlayrate(): number;
80
+ getFramesPerSecond(): number | undefined;
81
+ getDroppedFrames(): number | undefined;
82
+ getThroughput(): number | undefined;
83
+ getRendition(): unknown | undefined;
84
+ getTitle2(): string | undefined;
85
+ getIsLive(): boolean | undefined;
86
+ getCdnTraffic(): number | undefined;
87
+ getP2PTraffic(): number | undefined;
88
+ getUploadTraffic(): number | undefined;
89
+ getIsP2PEnabled(): boolean | undefined;
90
+ getSegmentDuration(): number | undefined;
91
+ getHouseholdId(): string | undefined;
92
+ getLatency(): number | undefined;
93
+ getPacketLoss(): number | undefined;
94
+ getPacketSent(): number | undefined;
95
+ getMetrics(): Record<string, unknown> | undefined;
96
+ getAudioCodec(): string | undefined;
97
+ getVideoCodec(): string | undefined;
98
+ setUrlToParse(url: string): void;
99
+ getURLToParse(): string | undefined;
100
+ fireSeekBegin(params?: Record<string, unknown>, convertFromBuffer?: boolean, triggeredEvent?: string): void;
101
+ fireSeekEnd(params?: Record<string, unknown>, triggeredEvent?: string): void;
102
+ cancelSeek(params?: Record<string, unknown>): void;
103
+ fireEvent(eventName: string, dimensions?: Record<string, unknown>, values?: Record<string, unknown>, topLevelDimensions?: Record<string, unknown>, hasEndDatetime?: boolean): void;
104
+ fireEventEnd(eventName: string): void;
105
+ storeNewRendition(rendition: unknown): void;
106
+ }
107
+ export type AdPosition = string | number | null;
108
+ export interface AdBreaksCount {
109
+ pre?: number;
110
+ mid?: number;
111
+ post?: number;
112
+ }
113
+ /**
114
+ * Structure of ads requested. This is intentionally generic because the source
115
+ * only states "structure of ads requested" without a concrete schema.
116
+ */
117
+ export type AdPattern = unknown;
118
+ export type AdInsertionType = string | null;
119
+ export interface AdapterAd extends AdapterContent {
120
+ /** Current ad position */
121
+ getPosition(): AdPosition;
122
+ /** Given ad structure (number of pre/mid/post breaks) */
123
+ getGivenBreaks(): AdBreaksCount | null;
124
+ /** Expected ad structure (number of pre/mid/post breaks) */
125
+ getExpectedBreaks(): AdBreaksCount | null;
126
+ /** Structure of ads requested */
127
+ getExpectedPattern(): AdPattern | null;
128
+ /** Playheads (in seconds or ms, depending on implementation) of ad break start times */
129
+ getBreaksTime(): number[] | null;
130
+ /** Number of ads given for the current break */
131
+ getGivenAds(): number | null;
132
+ /** Number of ads requested for the current break */
133
+ getExpectedAds(): number | null;
134
+ /**
135
+ * Whether the ad is visible on screen (standard: >50% pixels visible)
136
+ * Defaults to true in the base mixin.
137
+ */
138
+ getIsVisible(): boolean;
139
+ /** Whether audio is enabled when the ad begins */
140
+ getAudioEnabled(): boolean | null;
141
+ /** Whether the ad is skippable */
142
+ getIsSkippable(): boolean | null;
143
+ /** Whether the player is fullscreen when the ad begins */
144
+ getIsFullscreen(): boolean | null;
145
+ /** Ad campaign identifier/name */
146
+ getCampaign(): string | null;
147
+ /** Ad creative ID */
148
+ getCreativeId(): string | null;
149
+ /** Ad provider name */
150
+ getProvider(): string | null;
151
+ /** Ad insertion type (client-side/server-side) */
152
+ getAdInsertionType(): AdInsertionType;
153
+ /**
154
+ * Fire a click event.
155
+ * If a string is passed, it is treated as the URL: params = { url: string }.
156
+ */
157
+ fireClick(params?: Record<string, unknown> | string): void;
158
+ /**
159
+ * Fire a quartile event (0..3). Increments `lastQuartileSent` internally.
160
+ */
161
+ fireQuartile(quartile: number): void;
162
+ /** Start visibility/view tracking chrono for ads */
163
+ startChronoView(): void;
164
+ /** Stop visibility/view tracking chrono for ads */
165
+ stopChronoView(): void;
166
+ /**
167
+ * Fire a manifest-related event. If first arg is string, it is treated as errorType
168
+ * and `message` is used as errorMessage.
169
+ */
170
+ fireManifest(params?: Record<string, unknown> | string, message?: string): void;
171
+ /**
172
+ * Mark ad as skipped and fire stop with params.skipped = true
173
+ */
174
+ fireSkip(params?: Record<string, unknown>): void;
175
+ /** Alias to fireAdBreakStart */
176
+ fireBreakStart(params?: Record<string, unknown>): void;
177
+ /** Alias to fireAdBreakStop */
178
+ fireBreakStop(params?: Record<string, unknown>): void;
179
+ /** Fire Ad Break (Pod) start */
180
+ fireAdBreakStart(params?: Record<string, unknown>): void;
181
+ /** Fire Ad Break (Pod) stop */
182
+ fireAdBreakStop(params?: Record<string, unknown>): void;
183
+ }
184
+ interface PlayheadMonitor {
185
+ stop(): void;
186
+ skipNextTick(): void;
187
+ progress(): void;
188
+ }
189
+ interface AdapterFlags {
190
+ initCalled: boolean;
191
+ isStarted: boolean;
192
+ isStopped: boolean;
193
+ isJoined: boolean;
194
+ isBuffering: boolean;
195
+ isSeeking: boolean;
196
+ isPaused: boolean;
197
+ isAdPaused: boolean;
198
+ isEnded: boolean;
199
+ isVideoStateBuffering: boolean;
200
+ lastQuartileSent: number;
201
+ }
202
+ export {};
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Interfaces gathered from the npm module npaw-plugin by generating source from the contained sourcemap.
3
+ *
4
+ * @see https://www.npmjs.com/package/npaw-plugin
5
+ */
6
+ export {};
@@ -0,0 +1,2 @@
1
+ declare const version: string;
2
+ export { version };
@@ -0,0 +1,3 @@
1
+ import packageJson from '../../package.json';
2
+ const { version } = packageJson;
3
+ export { version };
@@ -0,0 +1,89 @@
1
+ import { type IntegrationElement } from '@glomex/integration-web-component';
2
+ /**
3
+ * Configuration options for Sensic analytics integration
4
+ */
5
+ export interface SensicOptions {
6
+ /** Sensic media identifier */
7
+ media: string;
8
+ /** Platform type: 'web' or 'tv' */
9
+ platform: 'web' | 'tv';
10
+ /**
11
+ * Two-letter country code for loading the appropriate Sensic script.
12
+ * Any country code is supported as long as the corresponding Sensic script exists.
13
+ * The country code also determines the default data mapping for custom parameters and stream ID.
14
+ * @example 'at' - Austria (uses GfK AT specific data mapping)
15
+ * @example 'de' - Germany
16
+ */
17
+ country: string;
18
+ /** Optional callback for warning messages */
19
+ warnCallback?: (error: Error) => void;
20
+ /**
21
+ * Callback to build custom parameters for tracking.
22
+ * Called on each stream start (VoD content, live content, and linear ads).
23
+ * Receives the country-specific custom params as input, allowing override/extension.
24
+ *
25
+ * @param customParams - The country-specific custom params (e.g., AT params for Austria)
26
+ * @returns Custom parameters as key-value pairs, or `null`/`undefined` to skip tracking this stream
27
+ * @default Returns country-specific params unchanged
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * buildCustomParams: (customParams) => ({
32
+ * ...customParams,
33
+ * genre: integration.content?.genre ?? '',
34
+ * showId: integration.content?.show?.id ?? ''
35
+ * })
36
+ * ```
37
+ */
38
+ buildCustomParams?: (customParams: Record<string, string>) => Record<string, string> | null | undefined;
39
+ /**
40
+ * Callback to build the stream ID for tracking.
41
+ * Called on each stream start (VoD content, live content, and linear ads).
42
+ * Receives the country-specific stream ID as input, allowing override.
43
+ *
44
+ * @param streamId - The country-specific stream ID
45
+ * @returns The stream ID to use for tracking
46
+ * @default Returns country-specific stream ID unchanged
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * buildStreamId: (streamId) => streamId || integration.content?.id ?? ''
51
+ * ```
52
+ */
53
+ buildStreamId?: (streamId: string) => string;
54
+ }
55
+ /** @deprecated Use SensicOptions instead */
56
+ export interface SensicProviderOptions {
57
+ /** Sensic media identifier */
58
+ media: string;
59
+ /** Platform type: 'web' or 'tv' */
60
+ platform: 'web' | 'tv';
61
+ /** Optional callback for warning messages */
62
+ warnCallback?: (error: Error) => void;
63
+ }
64
+ /**
65
+ * Connects Sensic analytics integration to a turbo player integration.
66
+ *
67
+ * Sensic (formerly GfK) provides streaming measurement for video content.
68
+ * This integration automatically tracks playback events and reports them
69
+ * to Sensic's S2S (Server-to-Server) measurement system.
70
+ *
71
+ * @param integration - The integration element to connect to
72
+ * @param options - Sensic configuration options
73
+ * @returns A cleanup function to disconnect the integration
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * import { connectToSensic } from '@glomex/integration-analytics/sensic';
78
+ *
79
+ * const disconnect = connectToSensic(integration, {
80
+ * media: 'your-media-id',
81
+ * platform: 'web',
82
+ * country: 'de'
83
+ * });
84
+ *
85
+ * // Later, to disconnect:
86
+ * disconnect();
87
+ * ```
88
+ */
89
+ export declare const connectToSensic: (integration: IntegrationElement, options: SensicOptions) => (() => void);