aboutsummaryrefslogtreecommitdiffhomepage
path: root/shared/server-commands/videos/streaming-playlists-command.ts
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2023-07-31 14:34:36 +0200
committerChocobozzz <me@florianbigard.com>2023-08-11 15:02:33 +0200
commit3a4992633ee62d5edfbb484d9c6bcb3cf158489d (patch)
treee4510b39bdac9c318fdb4b47018d08f15368b8f0 /shared/server-commands/videos/streaming-playlists-command.ts
parent04d1da5621d25d59bd5fa1543b725c497bf5d9a8 (diff)
downloadPeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.tar.gz
PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.tar.zst
PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.zip
Migrate server to ESM
Sorry for the very big commit that may lead to git log issues and merge conflicts, but it's a major step forward: * Server can be faster at startup because imports() are async and we can easily lazy import big modules * Angular doesn't seem to support ES import (with .js extension), so we had to correctly organize peertube into a monorepo: * Use yarn workspace feature * Use typescript reference projects for dependencies * Shared projects have been moved into "packages", each one is now a node module (with a dedicated package.json/tsconfig.json) * server/tools have been moved into apps/ and is now a dedicated app bundled and published on NPM so users don't have to build peertube cli tools manually * server/tests have been moved into packages/ so we don't compile them every time we want to run the server * Use isolatedModule option: * Had to move from const enum to const (https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums) * Had to explictely specify "type" imports when used in decorators * Prefer tsx (that uses esbuild under the hood) instead of ts-node to load typescript files (tests with mocha or scripts): * To reduce test complexity as esbuild doesn't support decorator metadata, we only test server files that do not import server models * We still build tests files into js files for a faster CI * Remove unmaintained peertube CLI import script * Removed some barrels to speed up execution (less imports)
Diffstat (limited to 'shared/server-commands/videos/streaming-playlists-command.ts')
-rw-r--r--shared/server-commands/videos/streaming-playlists-command.ts119
1 files changed, 0 insertions, 119 deletions
diff --git a/shared/server-commands/videos/streaming-playlists-command.ts b/shared/server-commands/videos/streaming-playlists-command.ts
deleted file mode 100644
index b988ac4b2..000000000
--- a/shared/server-commands/videos/streaming-playlists-command.ts
+++ /dev/null
@@ -1,119 +0,0 @@
1import { wait } from '@shared/core-utils'
2import { HttpStatusCode } from '@shared/models'
3import { unwrapBody, unwrapBodyOrDecodeToJSON, unwrapTextOrDecode } from '../requests'
4import { AbstractCommand, OverrideCommandOptions } from '../shared'
5
6export class StreamingPlaylistsCommand extends AbstractCommand {
7
8 async get (options: OverrideCommandOptions & {
9 url: string
10
11 videoFileToken?: string
12 reinjectVideoFileToken?: boolean
13
14 withRetry?: boolean // default false
15 currentRetry?: number
16 }): Promise<string> {
17 const { videoFileToken, reinjectVideoFileToken, expectedStatus, withRetry = false, currentRetry = 1 } = options
18
19 try {
20 const result = await unwrapTextOrDecode(this.getRawRequest({
21 ...options,
22
23 url: options.url,
24 query: {
25 videoFileToken,
26 reinjectVideoFileToken
27 },
28 implicitToken: false,
29 defaultExpectedStatus: HttpStatusCode.OK_200
30 }))
31
32 // master.m3u8 could be empty
33 if (!result && (!expectedStatus || expectedStatus === HttpStatusCode.OK_200)) {
34 throw new Error('Empty result')
35 }
36
37 return result
38 } catch (err) {
39 if (!withRetry || currentRetry > 10) throw err
40
41 await wait(250)
42
43 return this.get({
44 ...options,
45
46 withRetry,
47 currentRetry: currentRetry + 1
48 })
49 }
50 }
51
52 async getFragmentedSegment (options: OverrideCommandOptions & {
53 url: string
54 range?: string
55
56 withRetry?: boolean // default false
57 currentRetry?: number
58 }) {
59 const { withRetry = false, currentRetry = 1 } = options
60
61 try {
62 const result = await unwrapBody<Buffer>(this.getRawRequest({
63 ...options,
64
65 url: options.url,
66 range: options.range,
67 implicitToken: false,
68 responseType: 'application/octet-stream',
69 defaultExpectedStatus: HttpStatusCode.OK_200
70 }))
71
72 return result
73 } catch (err) {
74 if (!withRetry || currentRetry > 10) throw err
75
76 await wait(250)
77
78 return this.getFragmentedSegment({
79 ...options,
80
81 withRetry,
82 currentRetry: currentRetry + 1
83 })
84 }
85 }
86
87 async getSegmentSha256 (options: OverrideCommandOptions & {
88 url: string
89
90 withRetry?: boolean // default false
91 currentRetry?: number
92 }) {
93 const { withRetry = false, currentRetry = 1 } = options
94
95 try {
96 const result = await unwrapBodyOrDecodeToJSON<{ [ id: string ]: string }>(this.getRawRequest({
97 ...options,
98
99 url: options.url,
100 contentType: 'application/json',
101 implicitToken: false,
102 defaultExpectedStatus: HttpStatusCode.OK_200
103 }))
104
105 return result
106 } catch (err) {
107 if (!withRetry || currentRetry > 10) throw err
108
109 await wait(250)
110
111 return this.getSegmentSha256({
112 ...options,
113
114 withRetry,
115 currentRetry: currentRetry + 1
116 })
117 }
118 }
119}