@omss/framework 1.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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +516 -0
  3. package/dist/controllers/content.controller.d.ts +37 -0
  4. package/dist/controllers/content.controller.d.ts.map +1 -0
  5. package/dist/controllers/content.controller.js +37 -0
  6. package/dist/controllers/content.controller.js.map +1 -0
  7. package/dist/controllers/health.controller.d.ts +11 -0
  8. package/dist/controllers/health.controller.d.ts.map +1 -0
  9. package/dist/controllers/health.controller.js +18 -0
  10. package/dist/controllers/health.controller.js.map +1 -0
  11. package/dist/controllers/proxy.controller.d.ts +17 -0
  12. package/dist/controllers/proxy.controller.d.ts.map +1 -0
  13. package/dist/controllers/proxy.controller.js +32 -0
  14. package/dist/controllers/proxy.controller.js.map +1 -0
  15. package/dist/core/cache.d.ts +29 -0
  16. package/dist/core/cache.d.ts.map +1 -0
  17. package/dist/core/cache.js +95 -0
  18. package/dist/core/cache.js.map +1 -0
  19. package/dist/core/errors.d.ts +27 -0
  20. package/dist/core/errors.d.ts.map +1 -0
  21. package/dist/core/errors.js +42 -0
  22. package/dist/core/errors.js.map +1 -0
  23. package/dist/core/server.d.ts +46 -0
  24. package/dist/core/server.d.ts.map +1 -0
  25. package/dist/core/server.js +210 -0
  26. package/dist/core/server.js.map +1 -0
  27. package/dist/core/types.d.ts +123 -0
  28. package/dist/core/types.d.ts.map +1 -0
  29. package/dist/core/types.js +4 -0
  30. package/dist/core/types.js.map +1 -0
  31. package/dist/index.d.ts +19 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +48 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/middleware/error-handler.d.ts +4 -0
  36. package/dist/middleware/error-handler.d.ts.map +1 -0
  37. package/dist/middleware/error-handler.js +57 -0
  38. package/dist/middleware/error-handler.js.map +1 -0
  39. package/dist/middleware/logger.d.ts +3 -0
  40. package/dist/middleware/logger.d.ts.map +1 -0
  41. package/dist/middleware/logger.js +34 -0
  42. package/dist/middleware/logger.js.map +1 -0
  43. package/dist/middleware/validation.d.ts +33 -0
  44. package/dist/middleware/validation.d.ts.map +1 -0
  45. package/dist/middleware/validation.js +93 -0
  46. package/dist/middleware/validation.js.map +1 -0
  47. package/dist/providers/base-provider.d.ts +91 -0
  48. package/dist/providers/base-provider.d.ts.map +1 -0
  49. package/dist/providers/base-provider.js +170 -0
  50. package/dist/providers/base-provider.js.map +1 -0
  51. package/dist/providers/provider-registry.d.ts +56 -0
  52. package/dist/providers/provider-registry.d.ts.map +1 -0
  53. package/dist/providers/provider-registry.js +182 -0
  54. package/dist/providers/provider-registry.js.map +1 -0
  55. package/dist/services/health.service.d.ts +16 -0
  56. package/dist/services/health.service.d.ts.map +1 -0
  57. package/dist/services/health.service.js +44 -0
  58. package/dist/services/health.service.js.map +1 -0
  59. package/dist/services/proxy.service.d.ts +56 -0
  60. package/dist/services/proxy.service.d.ts.map +1 -0
  61. package/dist/services/proxy.service.js +224 -0
  62. package/dist/services/proxy.service.js.map +1 -0
  63. package/dist/services/source.service.d.ts +57 -0
  64. package/dist/services/source.service.d.ts.map +1 -0
  65. package/dist/services/source.service.js +226 -0
  66. package/dist/services/source.service.js.map +1 -0
  67. package/dist/services/tmdb.service.d.ts +67 -0
  68. package/dist/services/tmdb.service.d.ts.map +1 -0
  69. package/dist/services/tmdb.service.js +237 -0
  70. package/dist/services/tmdb.service.js.map +1 -0
  71. package/package.json +90 -0
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProxyController = void 0;
4
+ class ProxyController {
5
+ proxyService;
6
+ constructor(proxyService) {
7
+ this.proxyService = proxyService;
8
+ }
9
+ /**
10
+ * GET /v1/proxy
11
+ */
12
+ async proxy(request, reply) {
13
+ const { data } = request.query;
14
+ if (!data) {
15
+ return reply.code(400).send({
16
+ error: {
17
+ code: 'MISSING_PARAMETER',
18
+ message: 'Missing required parameter: data',
19
+ },
20
+ traceId: request.id,
21
+ });
22
+ }
23
+ const response = await this.proxyService.proxyRequest(data);
24
+ return reply
25
+ .code(response.statusCode)
26
+ .headers(response.headers || {})
27
+ .type(response.contentType)
28
+ .send(response.data);
29
+ }
30
+ }
31
+ exports.ProxyController = ProxyController;
32
+ //# sourceMappingURL=proxy.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.controller.js","sourceRoot":"","sources":["../../src/controllers/proxy.controller.ts"],"names":[],"mappings":";;;AAOA,MAAa,eAAe;IACJ;IAApB,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAElD;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,OAAoD,EAAE,KAAmB;QACjF,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAE/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACxB,KAAK,EAAE;oBACH,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,kCAAkC;iBAC9C;gBACD,OAAO,EAAE,OAAO,CAAC,EAAE;aACtB,CAAC,CAAC;QACP,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE5D,OAAO,KAAK;aACP,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;aACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;aAC/B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;aAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACJ;AA3BD,0CA2BC"}
@@ -0,0 +1,29 @@
1
+ import { CacheConfig } from '../core/types';
2
+ export interface CacheService {
3
+ get<T>(key: string): Promise<T | null>;
4
+ set(key: string, value: any, ttl?: number): Promise<void>;
5
+ delete(key: string): Promise<void>;
6
+ clear(): Promise<void>;
7
+ }
8
+ export declare class MemoryCacheService implements CacheService {
9
+ private cache;
10
+ private cleanupInterval;
11
+ constructor();
12
+ get<T>(key: string): Promise<T | null>;
13
+ set(key: string, value: any, ttl?: number): Promise<void>;
14
+ delete(key: string): Promise<void>;
15
+ clear(): Promise<void>;
16
+ private cleanup;
17
+ destroy(): void;
18
+ }
19
+ export declare class RedisCacheService implements CacheService {
20
+ private client;
21
+ constructor(config: CacheConfig['redis']);
22
+ get<T>(key: string): Promise<T | null>;
23
+ set(key: string, value: any, ttl?: number): Promise<void>;
24
+ delete(key: string): Promise<void>;
25
+ clear(): Promise<void>;
26
+ disconnect(): Promise<void>;
27
+ }
28
+ export declare function createCacheService(config?: CacheConfig): CacheService;
29
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,WAAW,YAAY;IACzB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,qBAAa,kBAAmB,YAAW,YAAY;IACnD,OAAO,CAAC,KAAK,CAAwD;IACrE,OAAO,CAAC,eAAe,CAAiB;;IAOlC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAatC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,OAAO;IASf,OAAO,IAAI,IAAI;CAIlB;AAED,qBAAa,iBAAkB,YAAW,YAAY;IAClD,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;IAiBlC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAKtC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,YAAY,CAYrE"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RedisCacheService = exports.MemoryCacheService = void 0;
7
+ exports.createCacheService = createCacheService;
8
+ const ioredis_1 = __importDefault(require("ioredis"));
9
+ class MemoryCacheService {
10
+ cache = new Map();
11
+ cleanupInterval;
12
+ constructor() {
13
+ // Cleanup expired entries every minute
14
+ this.cleanupInterval = setInterval(() => this.cleanup(), 60000);
15
+ }
16
+ async get(key) {
17
+ const entry = this.cache.get(key);
18
+ if (!entry)
19
+ return null;
20
+ if (Date.now() > entry.expiresAt) {
21
+ this.cache.delete(key);
22
+ return null;
23
+ }
24
+ return entry.value;
25
+ }
26
+ async set(key, value, ttl = 7200) {
27
+ const expiresAt = Date.now() + ttl * 1000;
28
+ this.cache.set(key, { value, expiresAt });
29
+ }
30
+ async delete(key) {
31
+ this.cache.delete(key);
32
+ }
33
+ async clear() {
34
+ this.cache.clear();
35
+ }
36
+ cleanup() {
37
+ const now = Date.now();
38
+ for (const [key, entry] of this.cache.entries()) {
39
+ if (now > entry.expiresAt) {
40
+ this.cache.delete(key);
41
+ }
42
+ }
43
+ }
44
+ destroy() {
45
+ clearInterval(this.cleanupInterval);
46
+ this.cache.clear();
47
+ }
48
+ }
49
+ exports.MemoryCacheService = MemoryCacheService;
50
+ class RedisCacheService {
51
+ client;
52
+ constructor(config) {
53
+ this.client = new ioredis_1.default({
54
+ host: config?.host || 'localhost',
55
+ port: config?.port || 6379,
56
+ password: config?.password,
57
+ retryStrategy: (times) => Math.min(times * 50, 2000),
58
+ });
59
+ this.client.on('error', (err) => {
60
+ console.error('[Redis] Connection error:', err);
61
+ });
62
+ this.client.on('connect', () => {
63
+ console.log('[Redis] Connected successfully');
64
+ });
65
+ }
66
+ async get(key) {
67
+ const value = await this.client.get(key);
68
+ return value ? JSON.parse(value) : null;
69
+ }
70
+ async set(key, value, ttl = 7200) {
71
+ await this.client.setex(key, ttl, JSON.stringify(value));
72
+ }
73
+ async delete(key) {
74
+ await this.client.del(key);
75
+ }
76
+ async clear() {
77
+ await this.client.flushdb();
78
+ }
79
+ async disconnect() {
80
+ await this.client.quit();
81
+ }
82
+ }
83
+ exports.RedisCacheService = RedisCacheService;
84
+ function createCacheService(config) {
85
+ if (!config || config.type === 'memory') {
86
+ console.log('[Cache] Using in-memory cache');
87
+ return new MemoryCacheService();
88
+ }
89
+ if (config.type === 'redis') {
90
+ console.log('[Cache] Using Redis cache');
91
+ return new RedisCacheService(config.redis);
92
+ }
93
+ throw new Error(`Unknown cache type: ${config.type}`);
94
+ }
95
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { ErrorCode } from './types';
2
+ export declare class OMSSError extends Error {
3
+ code: ErrorCode;
4
+ message: string;
5
+ statusCode: number;
6
+ details?: Record<string, any> | undefined;
7
+ traceId: string;
8
+ constructor(code: ErrorCode, message: string, statusCode: number, details?: Record<string, any> | undefined, traceId?: string);
9
+ toJSON(): {
10
+ error: {
11
+ code: ErrorCode;
12
+ message: string;
13
+ details: Record<string, any> | undefined;
14
+ };
15
+ traceId: string;
16
+ };
17
+ }
18
+ export declare const OMSSErrors: {
19
+ invalidTmdbId: (value: string) => OMSSError;
20
+ noSourcesAvailable: (tmdbId: string, providersChecked: number) => OMSSError;
21
+ invalidSeason: (season: number, maxSeason: number) => OMSSError;
22
+ invalidEpisode: (episode: number, season: number, maxEpisode: number) => OMSSError;
23
+ invalidResponseId: (responseId: string) => OMSSError;
24
+ responseIdNotFound: (responseId: string) => OMSSError;
25
+ internalError: (message: string) => OMSSError;
26
+ };
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,qBAAa,SAAU,SAAQ,KAAK;IAErB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,MAAM;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC7B,OAAO,EAAE,MAAM;gBAJf,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YAAA,EAC7B,OAAO,GAAE,MAAiB;IAMrC,MAAM;;;;;;;;CAUT;AAGD,eAAO,MAAM,UAAU;2BACI,MAAM;iCAEA,MAAM,oBAAoB,MAAM;4BAErC,MAAM,aAAa,MAAM;8BAEvB,MAAM,UAAU,MAAM,cAAc,MAAM;oCAEpC,MAAM;qCAEL,MAAM;6BAEd,MAAM;CAClC,CAAC"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OMSSErrors = exports.OMSSError = void 0;
4
+ const uuid_1 = require("uuid");
5
+ class OMSSError extends Error {
6
+ code;
7
+ message;
8
+ statusCode;
9
+ details;
10
+ traceId;
11
+ constructor(code, message, statusCode, details, traceId = (0, uuid_1.v4)()) {
12
+ super(message);
13
+ this.code = code;
14
+ this.message = message;
15
+ this.statusCode = statusCode;
16
+ this.details = details;
17
+ this.traceId = traceId;
18
+ this.name = 'OMSSError';
19
+ }
20
+ toJSON() {
21
+ return {
22
+ error: {
23
+ code: this.code,
24
+ message: this.message,
25
+ details: this.details,
26
+ },
27
+ traceId: this.traceId,
28
+ };
29
+ }
30
+ }
31
+ exports.OMSSError = OMSSError;
32
+ // Factory functions for common errors
33
+ exports.OMSSErrors = {
34
+ invalidTmdbId: (value) => new OMSSError('INVALID_TMDB_ID', 'TMDB ID must be numeric', 400, { parameter: 'id', value, expected: 'numeric string' }),
35
+ noSourcesAvailable: (tmdbId, providersChecked) => new OMSSError('NO_SOURCES_AVAILABLE', `No streaming sources found for TMDB ID: ${tmdbId}`, 404, { parameter: 'id', value: tmdbId, providersChecked, allProvidersFailed: true }),
36
+ invalidSeason: (season, maxSeason) => new OMSSError('INVALID_SEASON', `Season ${season} is out of valid range (max: ${maxSeason})`, 400, { parameter: 's', value: season, maxSeason }),
37
+ invalidEpisode: (episode, season, maxEpisode) => new OMSSError('INVALID_EPISODE', `Episode ${episode} is out of valid range for season ${season}`, 400, { parameter: 'e', value: episode, season, maxEpisode }),
38
+ invalidResponseId: (responseId) => new OMSSError('INVALID_RESPONSE_ID', 'Invalid responseId format', 400, { parameter: 'responseId', value: responseId }),
39
+ responseIdNotFound: (responseId) => new OMSSError('RESPONSE_ID_NOT_FOUND', 'ResponseId not found or already refreshed', 404, { parameter: 'responseId', value: responseId }),
40
+ internalError: (message) => new OMSSError('INTERNAL_ERROR', message, 500),
41
+ };
42
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":";;;AACA,+BAAoC;AAEpC,MAAa,SAAU,SAAQ,KAAK;IAErB;IACA;IACA;IACA;IACA;IALX,YACW,IAAe,EACf,OAAe,EACf,UAAkB,EAClB,OAA6B,EAC7B,UAAkB,IAAA,SAAM,GAAE;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QANR,SAAI,GAAJ,IAAI,CAAW;QACf,YAAO,GAAP,OAAO,CAAQ;QACf,eAAU,GAAV,UAAU,CAAQ;QAClB,YAAO,GAAP,OAAO,CAAsB;QAC7B,YAAO,GAAP,OAAO,CAAmB;QAGjC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC5B,CAAC;IAED,MAAM;QACF,OAAO;YACH,KAAK,EAAE;gBACH,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;aACxB;YACD,OAAO,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC;IACN,CAAC;CACJ;AAtBD,8BAsBC;AAED,sCAAsC;AACzB,QAAA,UAAU,GAAG;IACtB,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAE1J,kBAAkB,EAAE,CAAC,MAAc,EAAE,gBAAwB,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,sBAAsB,EAAE,2CAA2C,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAEjP,aAAa,EAAE,CAAC,MAAc,EAAE,SAAiB,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,gBAAgB,EAAE,UAAU,MAAM,gCAAgC,SAAS,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAEtM,cAAc,EAAE,CAAC,OAAe,EAAE,MAAc,EAAE,UAAkB,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,iBAAiB,EAAE,WAAW,OAAO,qCAAqC,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAEvO,iBAAiB,EAAE,CAAC,UAAkB,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,qBAAqB,EAAE,2BAA2B,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAEjK,kBAAkB,EAAE,CAAC,UAAkB,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,uBAAuB,EAAE,2CAA2C,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAEpL,aAAa,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC;CACpF,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ import { OMSSConfig } from './types';
3
+ import { ProviderRegistry } from '../providers/provider-registry';
4
+ export declare class OMSSServer {
5
+ private app;
6
+ private config;
7
+ private registry;
8
+ private cache;
9
+ private sourceService;
10
+ private proxyService;
11
+ private healthService;
12
+ private tmdbService;
13
+ private contentController;
14
+ private proxyController;
15
+ private healthController;
16
+ constructor(config: OMSSConfig, registry?: ProviderRegistry);
17
+ /**
18
+ * Setup middleware
19
+ */
20
+ private setupMiddleware;
21
+ /**
22
+ * Setup routes
23
+ */
24
+ private setupRoutes;
25
+ /**
26
+ * Setup error handlers
27
+ */
28
+ private setupErrorHandlers;
29
+ /**
30
+ * Start the server
31
+ */
32
+ start(): Promise<void>;
33
+ /**
34
+ * Stop the server gracefully
35
+ */
36
+ stop(): Promise<void>;
37
+ /**
38
+ * Get the Fastify instance (for testing or custom configuration)
39
+ */
40
+ getInstance(): FastifyInstance;
41
+ /**
42
+ * Get the provider registry
43
+ */
44
+ getRegistry(): ProviderRegistry;
45
+ }
46
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAajE,qBAAa,UAAU;IACnB,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,KAAK,CAAe;IAG5B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IAGjC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,gBAAgB;IAgE3D;;OAEG;IACH,OAAO,CAAC,eAAe;IAgBvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAgCnB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B;;OAEG;IACH,WAAW,IAAI,eAAe;IAI9B;;OAEG;IACH,WAAW,IAAI,gBAAgB;CAGlC"}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OMSSServer = void 0;
7
+ const fastify_1 = __importDefault(require("fastify"));
8
+ const cors_1 = __importDefault(require("@fastify/cors"));
9
+ const provider_registry_1 = require("../providers/provider-registry");
10
+ const cache_1 = require("./cache");
11
+ const source_service_1 = require("../services/source.service");
12
+ const proxy_service_1 = require("../services/proxy.service");
13
+ const health_service_1 = require("../services/health.service");
14
+ const content_controller_1 = require("../controllers/content.controller");
15
+ const proxy_controller_1 = require("../controllers/proxy.controller");
16
+ const health_controller_1 = require("../controllers/health.controller");
17
+ const error_handler_1 = require("../middleware/error-handler");
18
+ const logger_1 = require("../middleware/logger");
19
+ const validation_1 = require("../middleware/validation");
20
+ const tmdb_service_1 = require("../services/tmdb.service");
21
+ class OMSSServer {
22
+ app;
23
+ config;
24
+ registry;
25
+ cache;
26
+ // Services
27
+ sourceService;
28
+ proxyService;
29
+ healthService;
30
+ tmdbService;
31
+ // Controllers
32
+ contentController;
33
+ proxyController;
34
+ healthController;
35
+ constructor(config, registry) {
36
+ this.config = config;
37
+ // Create registry with proxy configuration
38
+ const host = config.host || 'localhost';
39
+ const port = config.port || 3000;
40
+ // Determine proxy base URL
41
+ let proxyBaseUrl;
42
+ if (config.publicUrl) {
43
+ // Use explicit public URL
44
+ proxyBaseUrl = config.publicUrl;
45
+ }
46
+ else if (host === '0.0.0.0' || host === '::') {
47
+ // Listen on all interfaces - use localhost for local proxying
48
+ proxyBaseUrl = `http://localhost:${port}`;
49
+ }
50
+ else {
51
+ // Use configured host and port
52
+ proxyBaseUrl = `http://${host}:${port}`;
53
+ }
54
+ this.registry =
55
+ registry ||
56
+ new provider_registry_1.ProviderRegistry({
57
+ proxyBaseUrl,
58
+ });
59
+ console.log(`[Server] Proxy base URL: ${proxyBaseUrl}`);
60
+ // Initialize Fastify
61
+ this.app = (0, fastify_1.default)({
62
+ logger: false,
63
+ requestIdHeader: 'x-request-id',
64
+ genReqId: () => require('uuid').v4(),
65
+ trustProxy: true,
66
+ });
67
+ // Initialize cache
68
+ this.cache = (0, cache_1.createCacheService)(config.cache);
69
+ // Initialize TMDB service
70
+ const tmdbApiKey = process.env.TMDB_API_KEY || config.tmdb?.apiKey;
71
+ if (!tmdbApiKey) {
72
+ throw new Error('TMDB_API_KEY is required. Set it in .env or config');
73
+ }
74
+ this.tmdbService = new tmdb_service_1.TMDBService(tmdbApiKey, this.cache, config.tmdb?.cacheTTL || 86400);
75
+ // Initialize services
76
+ this.sourceService = new source_service_1.SourceService(this.registry, this.cache, this.tmdbService, config.cache?.ttl);
77
+ this.proxyService = new proxy_service_1.ProxyService();
78
+ this.healthService = new health_service_1.HealthService(config, this.registry);
79
+ // Initialize controllers
80
+ this.contentController = new content_controller_1.ContentController(this.sourceService);
81
+ this.proxyController = new proxy_controller_1.ProxyController(this.proxyService);
82
+ this.healthController = new health_controller_1.HealthController(this.healthService);
83
+ // Setup middleware and routes
84
+ this.setupMiddleware();
85
+ this.setupRoutes();
86
+ this.setupErrorHandlers();
87
+ }
88
+ /**
89
+ * Setup middleware
90
+ */
91
+ setupMiddleware() {
92
+ // CORS
93
+ this.app.register(cors_1.default, {
94
+ origin: '*',
95
+ methods: ['GET', 'OPTIONS'],
96
+ allowedHeaders: ['Content-Type', 'Accept', 'Authorization'],
97
+ credentials: false,
98
+ });
99
+ // Request logging
100
+ this.app.addHook('onRequest', logger_1.requestLogger);
101
+ // Content-Type validation
102
+ this.app.addHook('preHandler', validation_1.validateContentType);
103
+ }
104
+ /**
105
+ * Setup routes
106
+ */
107
+ setupRoutes() {
108
+ // Health endpoints
109
+ this.app.get('/', this.healthController.getHealth.bind(this.healthController));
110
+ this.app.get('/v1', this.healthController.getHealth.bind(this.healthController));
111
+ this.app.get('/v1/health', this.healthController.getHealth.bind(this.healthController));
112
+ // Content endpoints
113
+ this.app.get('/v1/movies/:id', this.contentController.getMovie.bind(this.contentController));
114
+ this.app.get('/v1/tv/:id/seasons/:s/episodes/:e', this.contentController.getTVEpisode.bind(this.contentController));
115
+ // Refresh endpoint
116
+ this.app.get('/v1/refresh/:responseId', this.contentController.refreshSource.bind(this.contentController));
117
+ // Proxy endpoint
118
+ this.app.get('/v1/proxy', this.proxyController.proxy.bind(this.proxyController));
119
+ // 404 handler
120
+ this.app.setNotFoundHandler((request, reply) => {
121
+ reply.code(404).send({
122
+ error: {
123
+ code: 'ENDPOINT_NOT_FOUND',
124
+ message: 'The requested endpoint does not exist',
125
+ details: {
126
+ path: request.url,
127
+ method: request.method,
128
+ },
129
+ },
130
+ traceId: request.id,
131
+ });
132
+ });
133
+ }
134
+ /**
135
+ * Setup error handlers
136
+ */
137
+ setupErrorHandlers() {
138
+ this.app.setErrorHandler(error_handler_1.errorHandler);
139
+ }
140
+ /**
141
+ * Start the server
142
+ */
143
+ async start() {
144
+ try {
145
+ const host = this.config.host || 'localhost';
146
+ const port = this.config.port || 3000;
147
+ await this.app.listen({ port, host });
148
+ console.log(`
149
+ ╔════════════════════════════════════════════════════════╗
150
+ ║ OMSS Backend Server ║
151
+ ╠════════════════════════════════════════════════════════╣
152
+ ║ Name: ${this.config.name.padEnd(42)}║
153
+ ║ Version: ${this.config.version.padEnd(42)}║
154
+ ║ Port: ${port.toString().padEnd(42)}║
155
+ ║ Providers: ${this.registry.count.toString().padEnd(42)}║
156
+ ║ Cache: ${(this.config.cache?.type || 'memory').padEnd(42)}║
157
+ ╠════════════════════════════════════════════════════════╣
158
+ ║ Endpoints: ║
159
+ ║ GET / - Health check ║
160
+ ║ GET /v1/movies/:id - Movie sources ║
161
+ ║ GET /v1/tv/:id/seasons/:s/episodes/:e ║
162
+ ║ - TV sources ║
163
+ ║ GET /v1/proxy?data=... - Proxy endpoint ║
164
+ ║ GET /v1/refresh/:responseId - Refresh cache ║
165
+ ╚════════════════════════════════════════════════════════╝
166
+
167
+ 🚀 Server listening at http://${host}:${port}
168
+ `);
169
+ }
170
+ catch (error) {
171
+ console.error('[Server] Failed to start:', error);
172
+ throw error;
173
+ }
174
+ }
175
+ /**
176
+ * Stop the server gracefully
177
+ */
178
+ async stop() {
179
+ console.log('[Server] Shutting down...');
180
+ try {
181
+ await this.app.close();
182
+ // Cleanup cache
183
+ if ('destroy' in this.cache) {
184
+ this.cache.destroy?.();
185
+ }
186
+ else if ('disconnect' in this.cache) {
187
+ await this.cache.disconnect?.();
188
+ }
189
+ console.log('[Server] Shutdown complete');
190
+ }
191
+ catch (error) {
192
+ console.error('[Server] Error during shutdown:', error);
193
+ throw error;
194
+ }
195
+ }
196
+ /**
197
+ * Get the Fastify instance (for testing or custom configuration)
198
+ */
199
+ getInstance() {
200
+ return this.app;
201
+ }
202
+ /**
203
+ * Get the provider registry
204
+ */
205
+ getRegistry() {
206
+ return this.registry;
207
+ }
208
+ }
209
+ exports.OMSSServer = OMSSServer;
210
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ export interface OMSSConfig {
2
+ name: string;
3
+ version: string;
4
+ port?: number;
5
+ host?: string;
6
+ publicUrl?: string;
7
+ cache?: CacheConfig;
8
+ providers?: ProviderConfig[];
9
+ tmdb?: {
10
+ apiKey: string;
11
+ cacheTTL?: number;
12
+ };
13
+ }
14
+ export interface CacheConfig {
15
+ type: 'memory' | 'redis';
16
+ redis?: {
17
+ host: string;
18
+ port: number;
19
+ password?: string;
20
+ };
21
+ ttl?: {
22
+ sources: number;
23
+ subtitles: number;
24
+ };
25
+ }
26
+ export interface ProviderConfig {
27
+ id: string;
28
+ enabled: boolean;
29
+ priority?: number;
30
+ config?: Record<string, any>;
31
+ }
32
+ export interface SourceResponse {
33
+ responseId: string;
34
+ expiresAt: string;
35
+ sources: Source[];
36
+ subtitles: Subtitle[];
37
+ diagnostics: Diagnostic[];
38
+ }
39
+ export interface Source {
40
+ url: string;
41
+ type: SourceType;
42
+ quality: string;
43
+ audioTracks: AudioTrack[];
44
+ provider: Provider;
45
+ }
46
+ export type SourceType = 'hls' | 'dash' | 'http' | 'mp4' | 'mkv' | 'webm' | 'embed';
47
+ export interface AudioTrack {
48
+ language: string;
49
+ label: string;
50
+ }
51
+ export interface Subtitle {
52
+ url: string;
53
+ label: string;
54
+ format: SubtitleFormat;
55
+ }
56
+ export type SubtitleFormat = 'vtt' | 'srt' | 'ass' | 'ssa' | 'ttml';
57
+ export interface Provider {
58
+ id: string;
59
+ name: string;
60
+ }
61
+ export interface Diagnostic {
62
+ code: DiagnosticCode;
63
+ message: string;
64
+ field: string;
65
+ severity: 'info' | 'warning' | 'error';
66
+ }
67
+ export type DiagnosticCode = 'QUALITY_INFERRED' | 'LANGUAGE_INFERRED' | 'TYPE_INFERRED' | 'SUBTITLE_LABEL_INFERRED' | 'PROVIDER_ERROR' | 'PARTIAL_SCRAPE';
68
+ export interface HealthResponse {
69
+ name: string;
70
+ version: string;
71
+ status: 'operational' | 'degraded' | 'maintenance' | 'offline';
72
+ endpoints: {
73
+ movie: string;
74
+ tv: string;
75
+ proxy: string;
76
+ };
77
+ spec: 'omss';
78
+ note?: string;
79
+ }
80
+ export interface ErrorResponse {
81
+ error: {
82
+ code: ErrorCode;
83
+ message: string;
84
+ details?: Record<string, any>;
85
+ };
86
+ traceId: string;
87
+ }
88
+ export type ErrorCode = 'INVALID_TMDB_ID' | 'INVALID_PARAMETER' | 'MISSING_PARAMETER' | 'INVALID_SEASON' | 'INVALID_EPISODE' | 'INVALID_RESPONSE_ID' | 'RESPONSE_ID_NOT_FOUND' | 'NO_SOURCES_AVAILABLE' | 'ENDPOINT_NOT_FOUND' | 'METHOD_NOT_ALLOWED' | 'INTERNAL_ERROR' | 'UNSUPPORTED_MEDIA_TYPE';
89
+ export interface ProviderResult {
90
+ sources: Source[];
91
+ subtitles: Subtitle[];
92
+ diagnostics: Diagnostic[];
93
+ }
94
+ export interface ProxyData {
95
+ url: string;
96
+ headers?: Record<string, string>;
97
+ }
98
+ export interface ContentRequest {
99
+ tmdbId: string;
100
+ season?: number;
101
+ episode?: number;
102
+ }
103
+ export interface ResponseIdMapping {
104
+ cacheKey: string;
105
+ type: 'movie' | 'tv';
106
+ tmdbId: string;
107
+ season?: number;
108
+ episode?: number;
109
+ createdAt: number;
110
+ }
111
+ export interface ProviderCapabilities {
112
+ supportedContentTypes: Array<'movies' | 'tv' | 'sub'>;
113
+ }
114
+ export interface ProviderMediaObject {
115
+ type: 'movie' | 'tv';
116
+ tmdbId: string;
117
+ s?: number;
118
+ e?: number;
119
+ releaseYear?: string;
120
+ imdbId?: string;
121
+ title?: string;
122
+ }
123
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}