@videncrypt/js 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/events.ts","../src/utils.ts","../src/iframe.ts","../src/player.ts"],"sourcesContent":["type AnyHandler = (data: unknown) => void;\n\n// The index signature makes EventMap compatible with Record<string, unknown>\n// which TypeScript requires for generic constraints on Map keys\nexport type EventMapBase = { [key: string]: unknown };\n\nexport class EventEmitter<EventMap extends EventMapBase> {\n private handlers = new Map<keyof EventMap, Set<AnyHandler>>();\n\n on<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void,\n ): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler as AnyHandler);\n }\n\n off<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void,\n ): void {\n this.handlers.get(event)?.delete(handler as AnyHandler);\n }\n\n once<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void,\n ): void {\n const wrapper = (data: EventMap[K]) => {\n handler(data);\n this.off(event, wrapper);\n };\n this.on(event, wrapper);\n }\n\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n this.handlers.get(event)?.forEach((handler) => {\n try {\n handler(data as unknown);\n } catch (err) {\n // A broken handler must never crash the player\n // or prevent other handlers from firing\n console.warn('[VidEncrypt] event handler error:', err);\n }\n });\n }\n\n removeAll(): void {\n this.handlers.clear();\n }\n}","// ── Aspect ratio ───────────────────────────────────────────\n\nexport function parseAspectRatio(ratio: string): { w: number; h: number } {\n const parts = ratio.split('/').map(Number);\n const w = parts[0];\n const h = parts[1];\n if (!w || !h || isNaN(w) || isNaN(h) || w <= 0 || h <= 0) {\n return { w: 16, h: 9 };\n }\n return { w, h };\n}\n\n// '16/9' → '56.2500%'\n// '4/3' → '75.0000%'\n// '1/1' → '100.0000%'\nexport function aspectRatioToPadding(ratio: string): string {\n const { w, h } = parseAspectRatio(ratio);\n return `${((h / w) * 100).toFixed(4)}%`;\n}\n\n// ── Width normalisation ────────────────────────────────────\n\n// 640 → '640px'\n// '640px' → '640px'\n// '100%' → '100%'\n// undefined → '100%'\nexport function normalizeWidth(width?: string | number): string {\n if (width === undefined || width === null) return '100%';\n if (typeof width === 'number') return `${width}px`;\n return width;\n}\n\n// ── ID generation ──────────────────────────────────────────\n\n// Generates a short unique ID for internal use.\n// Format: 've_' + 8 random alphanumeric chars → 've_a3f9k2m1'\nexport function generateId(): string {\n const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';\n let id = 've_';\n for (let i = 0; i < 8; i++) {\n id += chars[Math.floor(Math.random() * chars.length)];\n }\n return id;\n}\n\n// ── Validation ─────────────────────────────────────────────\n\nexport function isValidVideoId(id: unknown): id is string {\n return typeof id === 'string' && id.trim().length > 0;\n}\n","import type { PlayerOptions } from './types';\nimport { aspectRatioToPadding, normalizeWidth } from './utils';\n\n// ── createIframe ───────────────────────────────────────────\n\nexport function createIframe(opts: Required<PlayerOptions>): {\n iframe: HTMLIFrameElement;\n wrapper: HTMLElement;\n} {\n // ── Build embed URL ────────────────────────────────────\n const url = new URL(`${opts.embedBaseUrl}/embed/${opts.videoId}`);\n\n if (opts.autoPlay) url.searchParams.set('autoplay', '1');\n if (opts.muted) url.searchParams.set('muted', '1');\n if (opts.loop) url.searchParams.set('loop', '1');\n if (!opts.showControls) url.searchParams.set('controls', '0');\n if (!opts.showBranding) url.searchParams.set('branding', '0');\n if (opts.startTime && opts.startTime > 0) {\n url.searchParams.set('start', String(opts.startTime));\n }\n if (opts.primaryColor && opts.primaryColor !== '#2563EB') {\n url.searchParams.set('color', opts.primaryColor.replace('#', ''));\n }\n if (opts.title) {\n url.searchParams.set('title', encodeURIComponent(opts.title));\n }\n\n // ── Outer wrapper ──────────────────────────────────────\n const wrapper = document.createElement('div');\n wrapper.style.cssText = [\n 'position: relative',\n `width: ${normalizeWidth(opts.width)}`,\n 'background: #000',\n 'line-height: 0', // prevents gap below iframe\n ].join('; ');\n\n // ── Aspect ratio box ───────────────────────────────────\n // padding-bottom trick works in all browsers including\n // old Safari — no CSS aspect-ratio property needed\n const aspectBox = document.createElement('div');\n aspectBox.style.cssText = [\n 'position: relative',\n `padding-bottom: ${aspectRatioToPadding(opts.aspectRatio)}`,\n 'height: 0',\n 'overflow: hidden',\n ].join('; ');\n\n // ── iframe ─────────────────────────────────────────────\n const iframe = document.createElement('iframe');\n\n iframe.src = url.toString();\n iframe.title = opts.title || 'Video Player';\n iframe.frameBorder = '0';\n iframe.allowFullscreen = true;\n iframe.setAttribute('allow',\n 'autoplay; fullscreen; picture-in-picture; clipboard-write',\n );\n iframe.setAttribute('loading', 'lazy');\n\n iframe.style.cssText = [\n 'position: absolute',\n 'top: 0',\n 'left: 0',\n 'width: 100%',\n 'height: 100%',\n 'border: none',\n ].join('; ');\n\n aspectBox.appendChild(iframe);\n wrapper.appendChild(aspectBox);\n\n return { iframe, wrapper };\n}\n\n// ── destroyIframe ──────────────────────────────────────────\n\nexport function destroyIframe(wrapper: HTMLElement): void {\n // Blank src first — stops any ongoing HLS segment downloads\n // and frees memory held by the iframe's JS context\n const iframe = wrapper.querySelector('iframe');\n if (iframe) {\n iframe.src = 'about:blank';\n }\n wrapper.remove();\n}\n","import { EventEmitter, type EventMapBase } from './events';\nimport { createIframe, destroyIframe } from './iframe';\nimport { isValidVideoId } from './utils';\nimport type {\n PlayerOptions,\n PlayerState,\n PlayerEventMap,\n IframeMessage,\n IframeCommand,\n IframeAction,\n PlayerError,\n} from './types';\n\n// ── Defaults ───────────────────────────────────────────────\n\nconst DEFAULTS = {\n width: '100%',\n aspectRatio: '16/9',\n title: '',\n autoPlay: false,\n muted: false,\n loop: false,\n startTime: 0,\n showControls: true,\n showBranding: true,\n primaryColor: '#2563EB',\n embedBaseUrl: 'https://app.videncrypt.com',\n} as const;\n\n// ── VidEncryptPlayer ───────────────────────────────────────\n\nexport class VidEncryptPlayer {\n private opts: Required<PlayerOptions>;\n private container: HTMLElement;\n private iframe: HTMLIFrameElement | null = null;\n private wrapper: HTMLElement | null = null;\n private emitter: EventEmitter<PlayerEventMap>;\n private msgHandler: (e: MessageEvent) => void;\n private destroyed = false;\n\n private state: PlayerState = {\n playing: false,\n muted: false,\n currentTime: 0,\n duration: 0,\n fullscreen: false,\n ready: false,\n };\n\n constructor(options: PlayerOptions) {\n\n // ── Resolve container ────────────────────────────────\n if (typeof options.container === 'string') {\n const el = document.querySelector(options.container);\n if (!el) {\n throw new Error(\n `VidEncrypt: container \"${options.container}\" not found`,\n );\n }\n this.container = el as HTMLElement;\n } else if (options.container instanceof HTMLElement) {\n this.container = options.container;\n } else {\n throw new Error(\n 'VidEncrypt: container must be a CSS selector or HTMLElement',\n );\n }\n\n // ── Validate videoId ─────────────────────────────────\n if (!isValidVideoId(options.videoId)) {\n throw new Error(\n 'VidEncrypt: videoId is required and must be a non-empty string',\n );\n }\n\n // ── Merge options with defaults ──────────────────────\n this.opts = {\n ...DEFAULTS,\n ...options,\n // Strip undefined callbacks so they don't overwrite defaults\n onReady: options.onReady ?? undefined,\n onPlay: options.onPlay ?? undefined,\n onPause: options.onPause ?? undefined,\n onEnded: options.onEnded ?? undefined,\n onProgress: options.onProgress ?? undefined,\n onError: options.onError ?? undefined,\n onFullscreenChange: options.onFullscreenChange ?? undefined,\n } as Required<PlayerOptions>;\n\n // ── Event emitter ────────────────────────────────────\n this.emitter = new EventEmitter<PlayerEventMap>();\n\n // Wire option callbacks to the emitter\n if (options.onReady) {\n this.emitter.on('ready', options.onReady);\n }\n if (options.onPlay) {\n this.emitter.on('play', options.onPlay);\n }\n if (options.onPause) {\n this.emitter.on('pause', options.onPause);\n }\n if (options.onEnded) {\n this.emitter.on('ended', options.onEnded);\n }\n if (options.onProgress) {\n this.emitter.on('progress', (d) =>\n options.onProgress!(d.currentTime, d.duration),\n );\n }\n if (options.onError) {\n this.emitter.on('error', options.onError);\n }\n if (options.onFullscreenChange) {\n this.emitter.on('fullscreenchange', options.onFullscreenChange);\n }\n\n // ── postMessage listener ─────────────────────────────\n this.msgHandler = this.handleMessage.bind(this);\n window.addEventListener('message', this.msgHandler);\n\n // ── Create iframe ────────────────────────────────────\n const { iframe, wrapper } = createIframe(this.opts);\n this.iframe = iframe;\n this.wrapper = wrapper;\n this.container.appendChild(wrapper);\n }\n\n // ── Playback controls ──────────────────────────────────\n\n play(): void {\n this.send('play');\n }\n\n pause(): void {\n this.send('pause');\n }\n\n seek(time: number): void {\n this.send('seek', Math.max(0, time));\n }\n\n setVolume(volume: number): void {\n this.send('volume', Math.min(1, Math.max(0, volume)));\n }\n\n mute(): void {\n this.send('mute');\n }\n\n unmute(): void {\n this.send('unmute');\n }\n\n enterFullscreen(): void {\n this.send('fullscreen');\n }\n\n exitFullscreen(): void {\n this.send('exitFullscreen');\n }\n\n // ── State ──────────────────────────────────────────────\n\n getState(): Readonly<PlayerState> {\n return { ...this.state };\n }\n\n isReady(): boolean { return this.state.ready; }\n isPlaying(): boolean { return this.state.playing; }\n isMuted(): boolean { return this.state.muted; }\n\n getCurrentTime(): number { return this.state.currentTime; }\n getDuration(): number { return this.state.duration; }\n\n // ── Event API ──────────────────────────────────────────\n // All return `this` for chaining:\n // player.on('play', ...).on('ended', ...)\n\n on<K extends keyof PlayerEventMap>(\n event: K,\n handler: (data: PlayerEventMap[K]) => void,\n ): this {\n this.emitter.on(event, handler);\n return this;\n }\n\n off<K extends keyof PlayerEventMap>(\n event: K,\n handler: (data: PlayerEventMap[K]) => void,\n ): this {\n this.emitter.off(event, handler);\n return this;\n }\n\n once<K extends keyof PlayerEventMap>(\n event: K,\n handler: (data: PlayerEventMap[K]) => void,\n ): this {\n this.emitter.once(event, handler);\n return this;\n }\n\n // ── Destroy ────────────────────────────────────────────\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n window.removeEventListener('message', this.msgHandler);\n\n if (this.wrapper) {\n destroyIframe(this.wrapper);\n this.wrapper = null;\n this.iframe = null;\n }\n\n this.emitter.removeAll();\n }\n\n // ── Private: send command to iframe ───────────────────\n\n private send(action: IframeAction, value?: unknown): void {\n if (this.destroyed) return;\n if (!this.iframe?.contentWindow) return;\n\n const cmd: IframeCommand = {\n action,\n videoId: this.opts.videoId,\n value,\n };\n\n this.iframe.contentWindow.postMessage(cmd, '*');\n }\n\n // ── Private: handle incoming postMessage ──────────────\n\n private handleMessage(e: MessageEvent): void {\n const msg = e.data as IframeMessage;\n\n // Ignore non-SDK messages\n if (!msg || msg.type !== 'videncrypt:player') return;\n\n // Ignore messages for other player instances on same page\n if (msg.videoId !== this.opts.videoId) return;\n\n switch (msg.event) {\n case 'ready':\n this.state.ready = true;\n this.emitter.emit('ready', undefined as unknown as void);\n break;\n\n case 'play':\n this.state.playing = true;\n this.emitter.emit('play', undefined as unknown as void);\n break;\n\n case 'pause':\n this.state.playing = false;\n this.emitter.emit('pause', undefined as unknown as void);\n break;\n\n case 'ended':\n this.state.playing = false;\n this.emitter.emit('ended', undefined as unknown as void);\n break;\n\n case 'progress': {\n const currentTime = (msg.data?.currentTime as number) ?? 0;\n const duration = (msg.data?.duration as number) ?? 0;\n this.state.currentTime = currentTime;\n this.state.duration = duration;\n this.emitter.emit('progress', { currentTime, duration });\n break;\n }\n\n case 'error': {\n const error: PlayerError = {\n code: (msg.data?.code as PlayerError['code']) ?? 'unknown',\n message: (msg.data?.message as string) ?? 'Unknown error',\n };\n this.emitter.emit('error', error);\n break;\n }\n\n case 'fullscreenchange': {\n const isFullscreen = (msg.data?.isFullscreen as boolean) ?? false;\n this.state.fullscreen = isFullscreen;\n this.emitter.emit('fullscreenchange', isFullscreen);\n break;\n }\n\n case 'statechange': {\n const partial = (msg.data ?? {}) as Partial<PlayerState>;\n this.state = { ...this.state, ...partial };\n this.emitter.emit('statechange', partial);\n break;\n }\n }\n }\n}"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@videncrypt/js",
3
+ "version": "0.1.0",
4
+ "description": "JavaScript SDK for VidEncrypt secure video player",
5
+ "license": "MIT",
6
+ "author": "VidEncrypt",
7
+ "type": "module",
8
+ "main": "./dist/ve.cjs",
9
+ "module": "./dist/ve.mjs",
10
+ "types": "./dist/ve.d.ts",
11
+ "browser": "./dist/ve.js",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/ve.d.ts",
15
+ "import": "./dist/ve.mjs",
16
+ "require": "./dist/ve.cjs"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md"
22
+ ],
23
+ "devDependencies": {
24
+ "typescript": "^5.0.0",
25
+ "tsup": "^8.0.0",
26
+ "@aws-sdk/client-s3": "^3.0.0"
27
+ },
28
+ "scripts": {
29
+ "build": "tsup",
30
+ "build:watch": "tsup --watch",
31
+ "typecheck": "tsc --noEmit",
32
+ "clean": "rm -rf dist"
33
+ }
34
+ }