@viostream/viostream-player-angular 0.1.6 → 0.1.8

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.
@@ -1,8 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { output, signal, viewChild, inject, NgZone, Input, Component } from '@angular/core';
3
- import { loadViostream, wrapRawPlayer } from '@viostream/viostream-player-core';
3
+ import Debug from 'debug';
4
+ import { getViostreamApi, wrapRawPlayer } from '@viostream/viostream-player-core';
4
5
  export { createViostreamPlayer, loadViostream } from '@viostream/viostream-player-core';
5
6
 
7
+ // Auto-generated by scripts/sync-version.mjs — do not edit
8
+ const SDK_NAME = 'viostream-player-angular';
9
+ const SDK_VERSION = '0.1.8';
10
+
6
11
  /**
7
12
  * ViostreamPlayerComponent — Angular standalone component that embeds a Viostream video player.
8
13
  *
@@ -19,6 +24,7 @@ export { createViostreamPlayer, loadViostream } from '@viostream/viostream-playe
19
24
  * />
20
25
  * ```
21
26
  */
27
+ const debug = Debug('viostream:angular');
22
28
  class ViostreamPlayerComponent {
23
29
  // ---------------------------------------------------------------------------
24
30
  // Inputs (required)
@@ -97,6 +103,8 @@ class ViostreamPlayerComponent {
97
103
  // ---------------------------------------------------------------------------
98
104
  /** Unique ID for the player container element. */
99
105
  containerId = `viostream-player-${Math.random().toString(36).slice(2, 10)}`;
106
+ /** SDK identifier stamped as a data attribute on the container. */
107
+ sdkTag = `${SDK_NAME}@${SDK_VERSION}`;
100
108
  /** Whether the player is still loading. */
101
109
  isLoading = signal(true);
102
110
  /** Error message if loading failed. */
@@ -115,9 +123,11 @@ class ViostreamPlayerComponent {
115
123
  // Lifecycle
116
124
  // ---------------------------------------------------------------------------
117
125
  ngOnInit() {
126
+ debug('ngOnInit publicKey=%s accountKey=%s containerId=%s', this.publicKey, this.accountKey, this.containerId);
118
127
  this.init();
119
128
  }
120
129
  ngOnDestroy() {
130
+ debug('ngOnDestroy publicKey=%s hasPlayer=%s', this.publicKey, !!this.player);
121
131
  this.destroyed = true;
122
132
  this.unwireEvents();
123
133
  this.player?.destroy();
@@ -128,13 +138,20 @@ class ViostreamPlayerComponent {
128
138
  // ---------------------------------------------------------------------------
129
139
  async init() {
130
140
  try {
131
- const api = await loadViostream(this.accountKey);
132
- if (this.destroyed)
141
+ debug('init: getting embed API');
142
+ const api = getViostreamApi();
143
+ if (this.destroyed) {
144
+ debug('init: destroyed detected after getViostreamApi — aborting publicKey=%s', this.publicKey);
133
145
  return;
146
+ }
134
147
  const embedOpts = this.buildEmbedOptions();
148
+ debug('init: calling api.embed publicKey=%s containerId=%s options=%o', this.publicKey, this.containerId, embedOpts);
135
149
  const raw = api.embed(this.publicKey, this.containerId, embedOpts);
150
+ debug('init: api.embed returned raw player');
136
151
  const wrappedPlayer = wrapRawPlayer(raw, this.containerId);
152
+ debug('init: wrapRawPlayer completed containerId=%s', this.containerId);
137
153
  if (this.destroyed) {
154
+ debug('init: destroyed detected after wrapRawPlayer — destroying and aborting publicKey=%s', this.publicKey);
138
155
  wrappedPlayer.destroy();
139
156
  return;
140
157
  }
@@ -143,18 +160,25 @@ class ViostreamPlayerComponent {
143
160
  this.ngZone.run(() => {
144
161
  this.isLoading.set(false);
145
162
  });
163
+ debug('init: player set, isLoading -> false publicKey=%s', this.publicKey);
146
164
  // Wire up event callbacks
147
165
  this.wireEvents(wrappedPlayer);
148
166
  // Notify consumer that the player is ready
167
+ debug('init: emitting playerReady publicKey=%s', this.publicKey);
149
168
  this.playerReady.emit(wrappedPlayer);
150
169
  }
151
170
  catch (err) {
152
171
  if (!this.destroyed) {
172
+ const msg = err instanceof Error ? err.message : String(err);
173
+ debug('init: error caught publicKey=%s error=%s', this.publicKey, msg);
153
174
  this.ngZone.run(() => {
154
- this.errorMsg.set(err instanceof Error ? err.message : String(err));
175
+ this.errorMsg.set(msg);
155
176
  this.isLoading.set(false);
156
177
  });
157
178
  }
179
+ else {
180
+ debug('init: error caught but destroyed — ignoring publicKey=%s', this.publicKey);
181
+ }
158
182
  }
159
183
  }
160
184
  buildEmbedOptions() {
@@ -207,12 +231,16 @@ class ViostreamPlayerComponent {
207
231
  ['loaded', () => this.ngZone.run(() => this.loaded.emit())],
208
232
  ];
209
233
  wireEvents(wrappedPlayer) {
234
+ const wiredEvents = [];
210
235
  for (const [eventName, handler] of this.EVENT_MAP) {
211
236
  const unsub = wrappedPlayer.on(eventName, handler);
212
237
  this.unsubscribers.push(unsub);
238
+ wiredEvents.push(eventName);
213
239
  }
240
+ debug('wireEvents: subscribed to [%s]', wiredEvents.join(', '));
214
241
  }
215
242
  unwireEvents() {
243
+ debug('unwireEvents: unsubscribing %d events', this.unsubscribers.length);
216
244
  for (const unsub of this.unsubscribers) {
217
245
  unsub();
218
246
  }
@@ -226,6 +254,7 @@ class ViostreamPlayerComponent {
226
254
  [class]="cssClass"
227
255
  data-viostream-player
228
256
  [attr.data-viostream-public-key]="publicKey"
257
+ [attr.data-viostream-sdk]="sdkTag"
229
258
  >
230
259
  @if (isLoading()) {
231
260
  <ng-content select="[loading]" />
@@ -251,6 +280,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
251
280
  [class]="cssClass"
252
281
  data-viostream-player
253
282
  [attr.data-viostream-public-key]="publicKey"
283
+ [attr.data-viostream-sdk]="sdkTag"
254
284
  >
255
285
  @if (isLoading()) {
256
286
  <ng-content select="[loading]" />
@@ -1 +1 @@
1
- {"version":3,"file":"viostream-viostream-player-angular.mjs","sources":["../../src/viostream-player.component.ts","../../src/index.ts","../../src/viostream-viostream-player-angular.ts"],"sourcesContent":["/**\n * ViostreamPlayerComponent — Angular standalone component that embeds a Viostream video player.\n *\n * @example\n * ```html\n * <viostream-player\n * [accountKey]=\"'vc-100100100'\"\n * [publicKey]=\"'nhedxonrxsyfee'\"\n * [displayTitle]=\"true\"\n * [sharing]=\"true\"\n * (play)=\"onPlay()\"\n * (timeUpdate)=\"onTimeUpdate($event)\"\n * (playerReady)=\"onPlayerReady($event)\"\n * />\n * ```\n */\n\nimport {\n Component,\n Input,\n OnInit,\n OnDestroy,\n ElementRef,\n NgZone,\n inject,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { loadViostream, wrapRawPlayer } from '@viostream/viostream-player-core';\nimport type {\n ViostreamEmbedOptions,\n ViostreamPlayer,\n RawViostreamPlayerInstance,\n ViostreamEventHandler,\n ViostreamTimeUpdateData,\n ViostreamVolumeChangeData,\n ViostreamErrorData,\n ViostreamProgressData,\n} from '@viostream/viostream-player-core';\n\n@Component({\n selector: 'viostream-player',\n standalone: true,\n template: `\n <div\n #container\n [id]=\"containerId\"\n [class]=\"cssClass\"\n data-viostream-player\n [attr.data-viostream-public-key]=\"publicKey\"\n >\n @if (isLoading()) {\n <ng-content select=\"[loading]\" />\n }\n\n @if (errorMsg(); as msg) {\n <div data-viostream-error style=\"color: red; padding: 1em;\">\n Failed to load Viostream player: {{ msg }}\n </div>\n }\n </div>\n `,\n})\nexport class ViostreamPlayerComponent implements OnInit, OnDestroy {\n // ---------------------------------------------------------------------------\n // Inputs (required)\n // ---------------------------------------------------------------------------\n\n /** Your Viostream account key (e.g. `'vc-100100100'`). */\n @Input({ required: true }) accountKey!: string;\n /** The public key of the media asset to embed. */\n @Input({ required: true }) publicKey!: string;\n\n // ---------------------------------------------------------------------------\n // Inputs (embed options)\n // ---------------------------------------------------------------------------\n\n /** Display chapter markers. */\n @Input() chapters?: boolean;\n /** Seek to a named chapter before playback begins. */\n @Input() chapterSlug?: string;\n /** Show the video title overlay. */\n @Input() displayTitle?: boolean;\n /** Show the HLS quality selector control. */\n @Input() hlsQualitySelector?: boolean;\n /** Override the player theme/key to use. */\n @Input() playerKey?: string;\n /** The player rendering style. */\n @Input() playerStyle?: 'video' | 'audio' | 'audio-poster';\n /** Show the sharing control. */\n @Input() sharing?: boolean;\n /** Custom skin active colour (e.g. `'#000'`). Requires `skinCustom: true`. */\n @Input() skinActive?: string;\n /** Custom skin background colour (e.g. `'#000'`). Requires `skinCustom: true`. */\n @Input() skinBackground?: string;\n /** Enable a custom skin via the API. */\n @Input() skinCustom?: boolean;\n /** Custom skin inactive colour (e.g. `'#000'`). Requires `skinCustom: true`. */\n @Input() skinInactive?: string;\n /** Show the playback speed selector. */\n @Input() speedSelector?: boolean;\n /** Play only a specific section of the video (e.g. `'10,30'`). */\n @Input() startEndTimespan?: string;\n /** Seek to a specific time (in seconds) before playback begins. */\n @Input() startTime?: string;\n /** Allow transcript download. */\n @Input() transcriptDownload?: boolean;\n /** Enable the settings menu on the control bar. */\n @Input() useSettingsMenu?: boolean;\n\n // ---------------------------------------------------------------------------\n // Inputs (styling)\n // ---------------------------------------------------------------------------\n\n /** Optional CSS class applied to the outer wrapper `<div>`. */\n @Input() cssClass?: string;\n\n // ---------------------------------------------------------------------------\n // Outputs (player events)\n // ---------------------------------------------------------------------------\n\n /** Emitted when playback starts or resumes. */\n readonly play = output<void>();\n /** Emitted when playback is paused. */\n readonly pause = output<void>();\n /** Emitted when the media finishes playing. */\n readonly ended = output<void>();\n /** Emitted when the current playback time changes. */\n readonly timeUpdate = output<ViostreamTimeUpdateData>();\n /** Emitted when the volume changes. */\n readonly volumeChange = output<ViostreamVolumeChangeData>();\n /** Emitted when a player error occurs. Named `playerError` to avoid conflict with the native DOM `error` event. */\n readonly playerError = output<ViostreamErrorData>();\n /** Emitted on buffering progress. */\n readonly progress = output<ViostreamProgressData>();\n /** Emitted when the player is ready. */\n readonly ready = output<void>();\n /** Emitted when a seek operation completes. */\n readonly seeked = output<void>();\n /** Emitted when metadata has loaded. */\n readonly loaded = output<void>();\n /** Emitted once the player is ready, providing the `ViostreamPlayer` instance for programmatic control. */\n readonly playerReady = output<ViostreamPlayer>();\n\n // ---------------------------------------------------------------------------\n // Internal state\n // ---------------------------------------------------------------------------\n\n /** Unique ID for the player container element. */\n readonly containerId = `viostream-player-${Math.random().toString(36).slice(2, 10)}`;\n\n /** Whether the player is still loading. */\n readonly isLoading = signal(true);\n\n /** Error message if loading failed. */\n readonly errorMsg = signal<string | undefined>(undefined);\n\n /** Reference to the container div. */\n private readonly containerRef = viewChild<ElementRef<HTMLDivElement>>('container');\n\n /** The wrapped player instance. */\n private player: ViostreamPlayer | undefined;\n\n /** Whether the component has been destroyed. */\n private destroyed = false;\n\n /** Unsubscribe functions for event listeners. */\n private readonly unsubscribers: Array<() => void> = [];\n\n /** Angular zone for triggering change detection. */\n private readonly ngZone = inject(NgZone);\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n ngOnInit(): void {\n this.init();\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n this.unwireEvents();\n this.player?.destroy();\n this.player = undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Private methods\n // ---------------------------------------------------------------------------\n\n private async init(): Promise<void> {\n try {\n const api = await loadViostream(this.accountKey);\n\n if (this.destroyed) return;\n\n const embedOpts = this.buildEmbedOptions();\n const raw: RawViostreamPlayerInstance = api.embed(\n this.publicKey,\n this.containerId,\n embedOpts,\n );\n const wrappedPlayer = wrapRawPlayer(raw, this.containerId);\n\n if (this.destroyed) {\n wrappedPlayer.destroy();\n return;\n }\n\n this.player = wrappedPlayer;\n\n // Run state updates inside NgZone to trigger change detection\n this.ngZone.run(() => {\n this.isLoading.set(false);\n });\n\n // Wire up event callbacks\n this.wireEvents(wrappedPlayer);\n\n // Notify consumer that the player is ready\n this.playerReady.emit(wrappedPlayer);\n } catch (err) {\n if (!this.destroyed) {\n this.ngZone.run(() => {\n this.errorMsg.set(err instanceof Error ? err.message : String(err));\n this.isLoading.set(false);\n });\n }\n }\n }\n\n private buildEmbedOptions(): ViostreamEmbedOptions {\n const opts: ViostreamEmbedOptions = {};\n if (this.chapters !== undefined) opts.chapters = this.chapters;\n if (this.chapterSlug !== undefined) opts.chapterSlug = this.chapterSlug;\n if (this.displayTitle !== undefined) opts.displayTitle = this.displayTitle;\n if (this.hlsQualitySelector !== undefined) opts.hlsQualitySelector = this.hlsQualitySelector;\n if (this.playerKey !== undefined) opts.playerKey = this.playerKey;\n if (this.playerStyle !== undefined) opts.playerStyle = this.playerStyle;\n if (this.sharing !== undefined) opts.sharing = this.sharing;\n if (this.skinActive !== undefined) opts.skinActive = this.skinActive;\n if (this.skinBackground !== undefined) opts.skinBackground = this.skinBackground;\n if (this.skinCustom !== undefined) opts.skinCustom = this.skinCustom;\n if (this.skinInactive !== undefined) opts.skinInactive = this.skinInactive;\n if (this.speedSelector !== undefined) opts.speedSelector = this.speedSelector;\n if (this.startEndTimespan !== undefined) opts.startEndTimespan = this.startEndTimespan;\n if (this.startTime !== undefined) opts.startTime = this.startTime;\n if (this.transcriptDownload !== undefined) opts.transcriptDownload = this.transcriptDownload;\n if (this.useSettingsMenu !== undefined) opts.useSettingsMenu = this.useSettingsMenu;\n return opts;\n }\n\n /** Maps raw player event names to component output emitters. */\n private readonly EVENT_MAP: Array<[string, ViostreamEventHandler]> = [\n ['play', () => this.ngZone.run(() => this.play.emit())],\n ['pause', () => this.ngZone.run(() => this.pause.emit())],\n ['ended', () => this.ngZone.run(() => this.ended.emit())],\n ['timeupdate', (data: unknown) => this.ngZone.run(() => this.timeUpdate.emit(data as ViostreamTimeUpdateData))],\n ['volumechange', (data: unknown) => this.ngZone.run(() => this.volumeChange.emit(data as ViostreamVolumeChangeData))],\n ['error', (data: unknown) => this.ngZone.run(() => this.playerError.emit(data as ViostreamErrorData))],\n ['progress', (data: unknown) => this.ngZone.run(() => this.progress.emit(data as ViostreamProgressData))],\n ['ready', () => this.ngZone.run(() => this.ready.emit())],\n ['seeked', () => this.ngZone.run(() => this.seeked.emit())],\n ['loaded', () => this.ngZone.run(() => this.loaded.emit())],\n ];\n\n private wireEvents(wrappedPlayer: ViostreamPlayer): void {\n for (const [eventName, handler] of this.EVENT_MAP) {\n const unsub = wrappedPlayer.on(eventName, handler);\n this.unsubscribers.push(unsub);\n }\n }\n\n private unwireEvents(): void {\n for (const unsub of this.unsubscribers) {\n unsub();\n }\n this.unsubscribers.length = 0;\n }\n}\n","/**\n * @viostream/viostream-player-angular\n *\n * Angular 17+ SDK for the Viostream video player.\n *\n * @example Component usage\n * ```ts\n * import { ViostreamPlayerComponent } from '@viostream/viostream-player-angular';\n *\n * @Component({\n * selector: 'app-root',\n * standalone: true,\n * imports: [ViostreamPlayerComponent],\n * template: `\n * <viostream-player\n * [accountKey]=\"'vc-100100100'\"\n * [publicKey]=\"'nhedxonrxsyfee'\"\n * [displayTitle]=\"true\"\n * (play)=\"onPlay()\"\n * />\n * `,\n * })\n * export class AppComponent {\n * onPlay() {\n * console.log('playing');\n * }\n * }\n * ```\n *\n * @example Headless / programmatic usage\n * ```ts\n * import { createViostreamPlayer } from '@viostream/viostream-player-angular';\n *\n * const player = await createViostreamPlayer({\n * accountKey: 'vc-100100100',\n * publicKey: 'nhedxonrxsyfee',\n * target: 'my-video-div'\n * });\n *\n * player.play();\n * const time = await player.getCurrentTime();\n * player.on('ended', () => console.log('done'));\n * ```\n */\n\n// Component\nexport { ViostreamPlayerComponent } from './viostream-player.component';\n\n// Re-export everything from core so consumers can import from this package\nexport {\n createViostreamPlayer,\n loadViostream,\n} from '@viostream/viostream-player-core';\n\nexport type {\n CreateViostreamPlayerOptions,\n ViostreamEmbedOptions,\n ViostreamTimeUpdateData,\n ViostreamVolumeChangeData,\n ViostreamErrorData,\n ViostreamProgressData,\n ViostreamPlayerEventMap,\n ViostreamEventHandler,\n ViostreamPlayer as ViostreamPlayerInstance,\n} from '@viostream/viostream-player-core';\n\n// Angular-specific types\nexport type {\n ViostreamPlayerInputs,\n ViostreamPlayerEventProps,\n} from './types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viostream-viostream-player-angular.mjs","sources":["../../src/version.ts","../../src/viostream-player.component.ts","../../src/index.ts","../../src/viostream-viostream-player-angular.ts"],"sourcesContent":["// Auto-generated by scripts/sync-version.mjs — do not edit\nexport const SDK_NAME = 'viostream-player-angular';\nexport const SDK_VERSION = '0.1.8';\n","/**\n * ViostreamPlayerComponent — Angular standalone component that embeds a Viostream video player.\n *\n * @example\n * ```html\n * <viostream-player\n * [accountKey]=\"'vc-100100100'\"\n * [publicKey]=\"'nhedxonrxsyfee'\"\n * [displayTitle]=\"true\"\n * [sharing]=\"true\"\n * (play)=\"onPlay()\"\n * (timeUpdate)=\"onTimeUpdate($event)\"\n * (playerReady)=\"onPlayerReady($event)\"\n * />\n * ```\n */\n\nimport {\n Component,\n Input,\n OnInit,\n OnDestroy,\n ElementRef,\n NgZone,\n inject,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport Debug from 'debug';\nimport { getViostreamApi, wrapRawPlayer } from '@viostream/viostream-player-core';\nimport type {\n ViostreamEmbedOptions,\n ViostreamPlayer,\n RawViostreamPlayerInstance,\n ViostreamEventHandler,\n ViostreamTimeUpdateData,\n ViostreamVolumeChangeData,\n ViostreamErrorData,\n ViostreamProgressData,\n} from '@viostream/viostream-player-core';\nimport { SDK_NAME, SDK_VERSION } from './version';\n\nconst debug = Debug('viostream:angular');\n\n@Component({\n selector: 'viostream-player',\n standalone: true,\n template: `\n <div\n #container\n [id]=\"containerId\"\n [class]=\"cssClass\"\n data-viostream-player\n [attr.data-viostream-public-key]=\"publicKey\"\n [attr.data-viostream-sdk]=\"sdkTag\"\n >\n @if (isLoading()) {\n <ng-content select=\"[loading]\" />\n }\n\n @if (errorMsg(); as msg) {\n <div data-viostream-error style=\"color: red; padding: 1em;\">\n Failed to load Viostream player: {{ msg }}\n </div>\n }\n </div>\n `,\n})\nexport class ViostreamPlayerComponent implements OnInit, OnDestroy {\n // ---------------------------------------------------------------------------\n // Inputs (required)\n // ---------------------------------------------------------------------------\n\n /** Your Viostream account key (e.g. `'vc-100100100'`). */\n @Input({ required: true }) accountKey!: string;\n /** The public key of the media asset to embed. */\n @Input({ required: true }) publicKey!: string;\n\n // ---------------------------------------------------------------------------\n // Inputs (embed options)\n // ---------------------------------------------------------------------------\n\n /** Display chapter markers. */\n @Input() chapters?: boolean;\n /** Seek to a named chapter before playback begins. */\n @Input() chapterSlug?: string;\n /** Show the video title overlay. */\n @Input() displayTitle?: boolean;\n /** Show the HLS quality selector control. */\n @Input() hlsQualitySelector?: boolean;\n /** Override the player theme/key to use. */\n @Input() playerKey?: string;\n /** The player rendering style. */\n @Input() playerStyle?: 'video' | 'audio' | 'audio-poster';\n /** Show the sharing control. */\n @Input() sharing?: boolean;\n /** Custom skin active colour (e.g. `'#000'`). Requires `skinCustom: true`. */\n @Input() skinActive?: string;\n /** Custom skin background colour (e.g. `'#000'`). Requires `skinCustom: true`. */\n @Input() skinBackground?: string;\n /** Enable a custom skin via the API. */\n @Input() skinCustom?: boolean;\n /** Custom skin inactive colour (e.g. `'#000'`). Requires `skinCustom: true`. */\n @Input() skinInactive?: string;\n /** Show the playback speed selector. */\n @Input() speedSelector?: boolean;\n /** Play only a specific section of the video (e.g. `'10,30'`). */\n @Input() startEndTimespan?: string;\n /** Seek to a specific time (in seconds) before playback begins. */\n @Input() startTime?: string;\n /** Allow transcript download. */\n @Input() transcriptDownload?: boolean;\n /** Enable the settings menu on the control bar. */\n @Input() useSettingsMenu?: boolean;\n\n // ---------------------------------------------------------------------------\n // Inputs (styling)\n // ---------------------------------------------------------------------------\n\n /** Optional CSS class applied to the outer wrapper `<div>`. */\n @Input() cssClass?: string;\n\n // ---------------------------------------------------------------------------\n // Outputs (player events)\n // ---------------------------------------------------------------------------\n\n /** Emitted when playback starts or resumes. */\n readonly play = output<void>();\n /** Emitted when playback is paused. */\n readonly pause = output<void>();\n /** Emitted when the media finishes playing. */\n readonly ended = output<void>();\n /** Emitted when the current playback time changes. */\n readonly timeUpdate = output<ViostreamTimeUpdateData>();\n /** Emitted when the volume changes. */\n readonly volumeChange = output<ViostreamVolumeChangeData>();\n /** Emitted when a player error occurs. Named `playerError` to avoid conflict with the native DOM `error` event. */\n readonly playerError = output<ViostreamErrorData>();\n /** Emitted on buffering progress. */\n readonly progress = output<ViostreamProgressData>();\n /** Emitted when the player is ready. */\n readonly ready = output<void>();\n /** Emitted when a seek operation completes. */\n readonly seeked = output<void>();\n /** Emitted when metadata has loaded. */\n readonly loaded = output<void>();\n /** Emitted once the player is ready, providing the `ViostreamPlayer` instance for programmatic control. */\n readonly playerReady = output<ViostreamPlayer>();\n\n // ---------------------------------------------------------------------------\n // Internal state\n // ---------------------------------------------------------------------------\n\n /** Unique ID for the player container element. */\n readonly containerId = `viostream-player-${Math.random().toString(36).slice(2, 10)}`;\n\n /** SDK identifier stamped as a data attribute on the container. */\n readonly sdkTag = `${SDK_NAME}@${SDK_VERSION}`;\n\n /** Whether the player is still loading. */\n readonly isLoading = signal(true);\n\n /** Error message if loading failed. */\n readonly errorMsg = signal<string | undefined>(undefined);\n\n /** Reference to the container div. */\n private readonly containerRef = viewChild<ElementRef<HTMLDivElement>>('container');\n\n /** The wrapped player instance. */\n private player: ViostreamPlayer | undefined;\n\n /** Whether the component has been destroyed. */\n private destroyed = false;\n\n /** Unsubscribe functions for event listeners. */\n private readonly unsubscribers: Array<() => void> = [];\n\n /** Angular zone for triggering change detection. */\n private readonly ngZone = inject(NgZone);\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n ngOnInit(): void {\n debug('ngOnInit publicKey=%s accountKey=%s containerId=%s', this.publicKey, this.accountKey, this.containerId);\n this.init();\n }\n\n ngOnDestroy(): void {\n debug('ngOnDestroy publicKey=%s hasPlayer=%s', this.publicKey, !!this.player);\n this.destroyed = true;\n this.unwireEvents();\n this.player?.destroy();\n this.player = undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Private methods\n // ---------------------------------------------------------------------------\n\n private async init(): Promise<void> {\n try {\n debug('init: getting embed API');\n const api = getViostreamApi();\n\n if (this.destroyed) {\n debug('init: destroyed detected after getViostreamApi — aborting publicKey=%s', this.publicKey);\n return;\n }\n\n const embedOpts = this.buildEmbedOptions();\n debug('init: calling api.embed publicKey=%s containerId=%s options=%o', this.publicKey, this.containerId, embedOpts);\n const raw: RawViostreamPlayerInstance = api.embed(\n this.publicKey,\n this.containerId,\n embedOpts,\n );\n debug('init: api.embed returned raw player');\n\n const wrappedPlayer = wrapRawPlayer(raw, this.containerId);\n debug('init: wrapRawPlayer completed containerId=%s', this.containerId);\n\n if (this.destroyed) {\n debug('init: destroyed detected after wrapRawPlayer — destroying and aborting publicKey=%s', this.publicKey);\n wrappedPlayer.destroy();\n return;\n }\n\n this.player = wrappedPlayer;\n\n // Run state updates inside NgZone to trigger change detection\n this.ngZone.run(() => {\n this.isLoading.set(false);\n });\n debug('init: player set, isLoading -> false publicKey=%s', this.publicKey);\n\n // Wire up event callbacks\n this.wireEvents(wrappedPlayer);\n\n // Notify consumer that the player is ready\n debug('init: emitting playerReady publicKey=%s', this.publicKey);\n this.playerReady.emit(wrappedPlayer);\n } catch (err) {\n if (!this.destroyed) {\n const msg = err instanceof Error ? err.message : String(err);\n debug('init: error caught publicKey=%s error=%s', this.publicKey, msg);\n this.ngZone.run(() => {\n this.errorMsg.set(msg);\n this.isLoading.set(false);\n });\n } else {\n debug('init: error caught but destroyed — ignoring publicKey=%s', this.publicKey);\n }\n }\n }\n\n private buildEmbedOptions(): ViostreamEmbedOptions {\n const opts: ViostreamEmbedOptions = {};\n if (this.chapters !== undefined) opts.chapters = this.chapters;\n if (this.chapterSlug !== undefined) opts.chapterSlug = this.chapterSlug;\n if (this.displayTitle !== undefined) opts.displayTitle = this.displayTitle;\n if (this.hlsQualitySelector !== undefined) opts.hlsQualitySelector = this.hlsQualitySelector;\n if (this.playerKey !== undefined) opts.playerKey = this.playerKey;\n if (this.playerStyle !== undefined) opts.playerStyle = this.playerStyle;\n if (this.sharing !== undefined) opts.sharing = this.sharing;\n if (this.skinActive !== undefined) opts.skinActive = this.skinActive;\n if (this.skinBackground !== undefined) opts.skinBackground = this.skinBackground;\n if (this.skinCustom !== undefined) opts.skinCustom = this.skinCustom;\n if (this.skinInactive !== undefined) opts.skinInactive = this.skinInactive;\n if (this.speedSelector !== undefined) opts.speedSelector = this.speedSelector;\n if (this.startEndTimespan !== undefined) opts.startEndTimespan = this.startEndTimespan;\n if (this.startTime !== undefined) opts.startTime = this.startTime;\n if (this.transcriptDownload !== undefined) opts.transcriptDownload = this.transcriptDownload;\n if (this.useSettingsMenu !== undefined) opts.useSettingsMenu = this.useSettingsMenu;\n return opts;\n }\n\n /** Maps raw player event names to component output emitters. */\n private readonly EVENT_MAP: Array<[string, ViostreamEventHandler]> = [\n ['play', () => this.ngZone.run(() => this.play.emit())],\n ['pause', () => this.ngZone.run(() => this.pause.emit())],\n ['ended', () => this.ngZone.run(() => this.ended.emit())],\n ['timeupdate', (data: unknown) => this.ngZone.run(() => this.timeUpdate.emit(data as ViostreamTimeUpdateData))],\n ['volumechange', (data: unknown) => this.ngZone.run(() => this.volumeChange.emit(data as ViostreamVolumeChangeData))],\n ['error', (data: unknown) => this.ngZone.run(() => this.playerError.emit(data as ViostreamErrorData))],\n ['progress', (data: unknown) => this.ngZone.run(() => this.progress.emit(data as ViostreamProgressData))],\n ['ready', () => this.ngZone.run(() => this.ready.emit())],\n ['seeked', () => this.ngZone.run(() => this.seeked.emit())],\n ['loaded', () => this.ngZone.run(() => this.loaded.emit())],\n ];\n\n private wireEvents(wrappedPlayer: ViostreamPlayer): void {\n const wiredEvents: string[] = [];\n for (const [eventName, handler] of this.EVENT_MAP) {\n const unsub = wrappedPlayer.on(eventName, handler);\n this.unsubscribers.push(unsub);\n wiredEvents.push(eventName);\n }\n debug('wireEvents: subscribed to [%s]', wiredEvents.join(', '));\n }\n\n private unwireEvents(): void {\n debug('unwireEvents: unsubscribing %d events', this.unsubscribers.length);\n for (const unsub of this.unsubscribers) {\n unsub();\n }\n this.unsubscribers.length = 0;\n }\n}\n","/**\n * @viostream/viostream-player-angular\n *\n * Angular 17+ SDK for the Viostream video player.\n *\n * @example Component usage\n * ```ts\n * import { ViostreamPlayerComponent } from '@viostream/viostream-player-angular';\n *\n * @Component({\n * selector: 'app-root',\n * standalone: true,\n * imports: [ViostreamPlayerComponent],\n * template: `\n * <viostream-player\n * [accountKey]=\"'vc-100100100'\"\n * [publicKey]=\"'nhedxonrxsyfee'\"\n * [displayTitle]=\"true\"\n * (play)=\"onPlay()\"\n * />\n * `,\n * })\n * export class AppComponent {\n * onPlay() {\n * console.log('playing');\n * }\n * }\n * ```\n *\n * @example Headless / programmatic usage\n * ```ts\n * import { createViostreamPlayer } from '@viostream/viostream-player-angular';\n *\n * const player = await createViostreamPlayer({\n * accountKey: 'vc-100100100',\n * publicKey: 'nhedxonrxsyfee',\n * target: 'my-video-div'\n * });\n *\n * player.play();\n * const time = await player.getCurrentTime();\n * player.on('ended', () => console.log('done'));\n * ```\n */\n\n// Component\nexport { ViostreamPlayerComponent } from './viostream-player.component';\n\n// Re-export everything from core so consumers can import from this package\nexport {\n createViostreamPlayer,\n loadViostream,\n} from '@viostream/viostream-player-core';\n\nexport type {\n CreateViostreamPlayerOptions,\n ViostreamEmbedOptions,\n ViostreamTimeUpdateData,\n ViostreamVolumeChangeData,\n ViostreamErrorData,\n ViostreamProgressData,\n ViostreamPlayerEventMap,\n ViostreamEventHandler,\n ViostreamPlayer as ViostreamPlayerInstance,\n} from '@viostream/viostream-player-core';\n\n// Angular-specific types\nexport type {\n ViostreamPlayerInputs,\n ViostreamPlayerEventProps,\n} from './types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viostream/viostream-player-angular",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Angular 17+ SDK for the Viostream video player — embed, control, and listen to player events",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -8,7 +8,8 @@
8
8
  },
9
9
  "type": "module",
10
10
  "dependencies": {
11
- "@viostream/viostream-player-core": "^0.2.5",
11
+ "@viostream/viostream-player-core": "^0.2.7",
12
+ "debug": "^4.4.3",
12
13
  "tslib": "^2.8.0"
13
14
  },
14
15
  "peerDependencies": {
package/version.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const SDK_NAME = "viostream-player-angular";
2
+ export declare const SDK_VERSION = "0.1.8";
@@ -80,6 +80,8 @@ export declare class ViostreamPlayerComponent implements OnInit, OnDestroy {
80
80
  readonly playerReady: import("@angular/core").OutputEmitterRef<ViostreamPlayer>;
81
81
  /** Unique ID for the player container element. */
82
82
  readonly containerId: string;
83
+ /** SDK identifier stamped as a data attribute on the container. */
84
+ readonly sdkTag = "viostream-player-angular@0.1.8";
83
85
  /** Whether the player is still loading. */
84
86
  readonly isLoading: import("@angular/core").WritableSignal<boolean>;
85
87
  /** Error message if loading failed. */