@norskvideo/norsk-studio 1.27.0-2025-05-21-b03b48ea → 1.27.0-2025-05-26-a443eb84

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 (134) hide show
  1. package/lib/client/cpu.js +1 -11
  2. package/lib/client/cpu.js.map +1 -1
  3. package/lib/client/creator.d.ts +0 -2
  4. package/lib/client/creator.js +3 -3
  5. package/lib/client/creator.js.map +1 -1
  6. package/lib/client/jsx/components/node.js +5 -4
  7. package/lib/client/jsx/components/node.js.map +1 -1
  8. package/lib/client/jsx/components/studio-sidebar-footer.d.ts +2 -0
  9. package/lib/client/jsx/components/studio-sidebar-footer.js +14 -0
  10. package/lib/client/jsx/components/studio-sidebar-footer.js.map +1 -0
  11. package/lib/client/jsx/components/studio-sidebar-header.d.ts +10 -0
  12. package/lib/client/jsx/components/studio-sidebar-header.js +37 -0
  13. package/lib/client/jsx/components/studio-sidebar-header.js.map +1 -0
  14. package/lib/client/jsx/components/studio-sidebar.d.ts +16 -0
  15. package/lib/client/jsx/components/studio-sidebar.js +200 -0
  16. package/lib/client/jsx/components/studio-sidebar.js.map +1 -0
  17. package/lib/client/jsx/components/toolbox.d.ts +12 -0
  18. package/lib/client/jsx/components/toolbox.js +94 -0
  19. package/lib/client/jsx/components/toolbox.js.map +1 -0
  20. package/lib/client/jsx/connection-editor.d.ts +2 -8
  21. package/lib/client/jsx/connection-editor.js +19 -17
  22. package/lib/client/jsx/connection-editor.js.map +1 -1
  23. package/lib/client/jsx/context/sidebar.d.ts +44 -0
  24. package/lib/client/jsx/context/sidebar.js +15 -0
  25. package/lib/client/jsx/context/sidebar.js.map +1 -0
  26. package/lib/client/jsx/global-configuration.d.ts +11 -0
  27. package/lib/client/jsx/global-configuration.js +18 -0
  28. package/lib/client/jsx/global-configuration.js.map +1 -0
  29. package/lib/client/jsx/hooks/alerts.d.ts +9 -0
  30. package/lib/client/jsx/hooks/alerts.js +22 -0
  31. package/lib/client/jsx/hooks/alerts.js.map +1 -0
  32. package/lib/client/jsx/hooks/toolbox.d.ts +6 -0
  33. package/lib/client/jsx/hooks/toolbox.js +238 -0
  34. package/lib/client/jsx/hooks/toolbox.js.map +1 -0
  35. package/lib/client/jsx/node-editor.d.ts +20 -21
  36. package/lib/client/jsx/node-editor.js +30 -33
  37. package/lib/client/jsx/node-editor.js.map +1 -1
  38. package/lib/client/jsx/selected-connection.d.ts +0 -2
  39. package/lib/client/jsx/selected-connection.js +4 -4
  40. package/lib/client/jsx/selected-connection.js.map +1 -1
  41. package/lib/client/jsx/selected-node.d.ts +0 -2
  42. package/lib/client/jsx/selected-node.js +54 -75
  43. package/lib/client/jsx/selected-node.js.map +1 -1
  44. package/lib/client/jsx/selected.d.ts +4 -13
  45. package/lib/client/jsx/selected.js +9 -5
  46. package/lib/client/jsx/selected.js.map +1 -1
  47. package/lib/client/jsx/shadcn-ui/accordion.d.ts +8 -0
  48. package/lib/client/jsx/shadcn-ui/accordion.js +50 -0
  49. package/lib/client/jsx/shadcn-ui/accordion.js.map +1 -0
  50. package/lib/client/jsx/shadcn-ui/command.d.ts +2 -1
  51. package/lib/client/jsx/shadcn-ui/command.js +31 -1
  52. package/lib/client/jsx/shadcn-ui/command.js.map +1 -1
  53. package/lib/client/jsx/shadcn-ui/separator.d.ts +4 -0
  54. package/lib/client/jsx/shadcn-ui/separator.js +34 -0
  55. package/lib/client/jsx/shadcn-ui/separator.js.map +1 -0
  56. package/lib/client/jsx/shadcn-ui/sidebar.d.ts +66 -0
  57. package/lib/client/jsx/shadcn-ui/sidebar.js +233 -0
  58. package/lib/client/jsx/shadcn-ui/sidebar.js.map +1 -0
  59. package/lib/client/jsx/shadcn-ui/skeleton.d.ts +2 -0
  60. package/lib/client/jsx/shadcn-ui/skeleton.js +9 -0
  61. package/lib/client/jsx/shadcn-ui/skeleton.js.map +1 -0
  62. package/lib/client/jsx/shadcn-ui/sonner.d.ts +3 -0
  63. package/lib/client/jsx/shadcn-ui/sonner.js +16 -0
  64. package/lib/client/jsx/shadcn-ui/sonner.js.map +1 -0
  65. package/lib/client/jsx/types/toolbox.d.ts +58 -0
  66. package/lib/client/jsx/types/toolbox.js +3 -0
  67. package/lib/client/jsx/types/toolbox.js.map +1 -0
  68. package/lib/client/navbar-right.js +12 -28
  69. package/lib/client/navbar-right.js.map +1 -1
  70. package/lib/client/rete/node.d.ts +10 -2
  71. package/lib/client/session-view.js +9 -6
  72. package/lib/client/session-view.js.map +1 -1
  73. package/lib/client/session.d.ts +5 -4
  74. package/lib/client/session.js +9 -7
  75. package/lib/client/session.js.map +1 -1
  76. package/lib/client/studio-layout.js +9 -3
  77. package/lib/client/studio-layout.js.map +1 -1
  78. package/lib/client/tools.d.ts +4 -6
  79. package/lib/client/tools.js +7 -312
  80. package/lib/client/tools.js.map +1 -1
  81. package/lib/extension/client-types.d.ts +3 -0
  82. package/lib/extension/client-types.js.map +1 -1
  83. package/lib/extension/runtime-types.d.ts +4 -1
  84. package/lib/extension/runtime-types.js +391 -3
  85. package/lib/extension/runtime-types.js.map +1 -1
  86. package/lib/runtime/execution.d.ts +2 -0
  87. package/lib/runtime/execution.js +43 -2
  88. package/lib/runtime/execution.js.map +1 -1
  89. package/lib/runtime/stream-registration.d.ts +5 -1
  90. package/lib/runtime/stream-registration.js +10 -0
  91. package/lib/runtime/stream-registration.js.map +1 -1
  92. package/lib/server/index.js +11 -0
  93. package/lib/server/index.js.map +1 -1
  94. package/lib/server/runner.js +3 -0
  95. package/lib/server/runner.js.map +1 -1
  96. package/lib/server/session.d.ts +7 -1
  97. package/lib/server/session.js +6 -0
  98. package/lib/server/session.js.map +1 -1
  99. package/lib/shared/names.d.ts +1 -0
  100. package/lib/shared/names.js +2 -1
  101. package/lib/shared/names.js.map +1 -1
  102. package/lib/shared/server-msg.d.ts +6 -5
  103. package/lib/test/_util/driver.js +11 -0
  104. package/lib/test/_util/driver.js.map +1 -1
  105. package/lib/test/_util/manual-driver.js +2 -1
  106. package/lib/test/_util/manual-driver.js.map +1 -1
  107. package/lib/test/_util/runtime.js +2 -2
  108. package/lib/test/_util/sinks.d.ts +2 -0
  109. package/lib/test/_util/sinks.js.map +1 -1
  110. package/lib/test/client-liveview.js +11 -11
  111. package/lib/test/client-liveview.js.map +1 -1
  112. package/lib/test/preview-endpoints.d.ts +1 -0
  113. package/lib/test/preview-endpoints.js +423 -0
  114. package/lib/test/preview-endpoints.js.map +1 -0
  115. package/lib/types/base.yml +15 -0
  116. package/lib/types/stream-mapping.yaml +12 -0
  117. package/lib/types.d.ts +14 -0
  118. package/lib/types.yaml +17 -0
  119. package/package.json +9 -7
  120. package/static/style.css +918 -3992
  121. package/static/tailwind.css +6 -2
  122. package/tailwind-theme.js +19 -2
  123. package/tailwind.config.js +0 -6
  124. package/ui/index.html +7 -9
  125. package/ui/index.js +22922 -30519
  126. package/lib/client/jsx/modal.d.ts +0 -30
  127. package/lib/client/jsx/modal.js +0 -71
  128. package/lib/client/jsx/modal.js.map +0 -1
  129. package/lib/client/jsx/toolbox.d.ts +0 -14
  130. package/lib/client/jsx/toolbox.js +0 -42
  131. package/lib/client/jsx/toolbox.js.map +0 -1
  132. package/lib/client/jsx/upstream/Accordion.d.ts +0 -30
  133. package/lib/client/jsx/upstream/Accordion.js +0 -65
  134. package/lib/client/jsx/upstream/Accordion.js.map +0 -1
@@ -0,0 +1,423 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const norsk_sdk_1 = require("@norskvideo/norsk-sdk");
30
+ const fs_1 = __importDefault(require("fs"));
31
+ const builder_1 = require("./_util/builder");
32
+ const yaml_1 = __importDefault(require("yaml"));
33
+ const document = __importStar(require("../runtime/document"));
34
+ const execution_1 = __importDefault(require("../runtime/execution"));
35
+ const express_1 = __importDefault(require("express"));
36
+ const runtime_1 = require("../test/_util/runtime");
37
+ const sinks_1 = require("./_util/sinks");
38
+ const node_fetch_1 = __importDefault(require("node-fetch"));
39
+ const chai_1 = require("chai");
40
+ describe("Preview Endpoints", () => {
41
+ let compiled = undefined;
42
+ async function createTestDocument(cfg) {
43
+ const runtime = await (0, runtime_1.testRuntime)();
44
+ const yaml = new builder_1.YamlBuilder()
45
+ .addNode(new builder_1.YamlNodeBuilder('source', runtime_1.AvMultiInput.info, cfg).reify()).reify();
46
+ const compiled = document.load(__filename, runtime, yaml_1.default.stringify(yaml));
47
+ return compiled;
48
+ }
49
+ let norsk = undefined;
50
+ let result = undefined;
51
+ let port = 0;
52
+ let listener = undefined;
53
+ afterEach(async () => {
54
+ await norsk?.close();
55
+ await new Promise((r) => {
56
+ setTimeout(() => {
57
+ r();
58
+ }, 10.0);
59
+ });
60
+ norsk = undefined;
61
+ result = undefined;
62
+ listener.close();
63
+ });
64
+ function previewTest(n, inputConfig, t) {
65
+ return it(n, async () => {
66
+ norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
67
+ compiled = await createTestDocument({ id: "source", displayName: "source", ...inputConfig });
68
+ const app = (0, express_1.default)();
69
+ app.use(express_1.default.json());
70
+ result = await (0, execution_1.default)(norsk, compiled, app);
71
+ await new Promise((r) => {
72
+ listener = app.listen(0, '127.0.0.1', () => {
73
+ const address = listener.address();
74
+ port = address.port;
75
+ r();
76
+ });
77
+ });
78
+ const source = result?.components['source'];
79
+ const sink = new sinks_1.TraceSink(norsk, "sink");
80
+ await sink.initialised;
81
+ await t(norsk, source, sink);
82
+ });
83
+ }
84
+ const SharedInput = {
85
+ inputs: [],
86
+ rawInputs: [
87
+ {
88
+ key: {
89
+ streamId: 256,
90
+ programNumber: 1,
91
+ sourceName: "one",
92
+ renditionName: "default"
93
+ }, media: 'video'
94
+ },
95
+ {
96
+ key: {
97
+ streamId: 257,
98
+ programNumber: 1,
99
+ sourceName: "one",
100
+ renditionName: "default"
101
+ }, media: 'audio'
102
+ },
103
+ {
104
+ key: {
105
+ streamId: 258,
106
+ programNumber: 1,
107
+ sourceName: "two",
108
+ renditionName: "default"
109
+ }, media: 'video'
110
+ },
111
+ {
112
+ key: {
113
+ streamId: 259,
114
+ programNumber: 1,
115
+ sourceName: "two",
116
+ renditionName: "default"
117
+ }, media: 'audio'
118
+ }
119
+ ],
120
+ __streamMappings: {
121
+ streams: [
122
+ {
123
+ outputKey: {
124
+ streamId: 1,
125
+ programNumber: 2,
126
+ sourceName: "source",
127
+ renditionName: "default"
128
+ }, media: "video"
129
+ },
130
+ {
131
+ outputKey: {
132
+ streamId: 2,
133
+ programNumber: 2,
134
+ sourceName: "source",
135
+ renditionName: "default"
136
+ }, media: "audio"
137
+ }
138
+ ]
139
+ }
140
+ };
141
+ function mp4PreviewTest(name, mediaType, streamType, asserts, args) {
142
+ function argsToQs(args) {
143
+ if (!args)
144
+ return '';
145
+ return "?" + Object.entries(args).map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join("&");
146
+ }
147
+ async function getTestPreviewUrl() {
148
+ if (streamType == 'unmapped') {
149
+ const result = await (0, node_fetch_1.default)(`http://127.0.0.1:${port}/source/streams/unmapped`).then(async (r) => r.json());
150
+ const media = result.find((r) => r.metadata.case == mediaType);
151
+ (0, chai_1.expect)(media?.preview_url).not.empty;
152
+ if (!media?.preview_url)
153
+ throw new Error("No preview url");
154
+ return `http://127.0.0.1:${port}/source/streams/${media?.preview_url}`;
155
+ }
156
+ else {
157
+ const result = await (0, node_fetch_1.default)(`http://127.0.0.1:${port}/source/streams/mappings`).then(async (r) => r.json());
158
+ const media = result.find((r) => r.metadata?.case == mediaType);
159
+ (0, chai_1.expect)(media?.preview_url).not.empty;
160
+ if (!media?.preview_url)
161
+ throw new Error("No preview url");
162
+ return `http://127.0.0.1:${port}/source/streams/${media?.preview_url}`;
163
+ }
164
+ }
165
+ previewTest(`MP4: ${name}`, SharedInput, async (_, _source, _sink) => {
166
+ const baseUrl = await getTestPreviewUrl();
167
+ const streams = await (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`);
168
+ (0, chai_1.expect)(streams.length).equal(1);
169
+ await asserts(streams[0]);
170
+ });
171
+ previewTest(`MP4: ${name} twice, same args`, SharedInput, async (_, _source, _sink) => {
172
+ const baseUrl = await getTestPreviewUrl();
173
+ await (0, sinks_1.getStreams)(`{baseUrl}${argsToQs(args)}`);
174
+ const streams2 = await (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`);
175
+ (0, chai_1.expect)(streams2.length).equal(1);
176
+ await asserts(streams2[0]);
177
+ });
178
+ if (args) {
179
+ previewTest(`MP4: ${name} twice, different args`, SharedInput, async (_, _source, _sink) => {
180
+ const baseUrl = await getTestPreviewUrl();
181
+ await (0, sinks_1.getStreams)(`${baseUrl}`);
182
+ const streams2 = await (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`);
183
+ (0, chai_1.expect)(streams2.length).equal(1);
184
+ await asserts(streams2[0]);
185
+ });
186
+ }
187
+ previewTest(`MP4: ${name} while already active`, SharedInput, async (_, _source, _sink) => {
188
+ const baseUrl = await getTestPreviewUrl();
189
+ const controller = await streamUrlForABit(`${baseUrl}${argsToQs(args)}`);
190
+ const streams2 = await (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`);
191
+ await asserts(streams2[0]);
192
+ controller.abort();
193
+ });
194
+ if (args) {
195
+ previewTest(`MP4: ${name} while already active, different args`, SharedInput, async (_, _source, _sink) => {
196
+ const baseUrl = await getTestPreviewUrl();
197
+ const controller = await streamUrlForABit(`${baseUrl}`);
198
+ const streams2 = await (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`);
199
+ await asserts(streams2[0]);
200
+ controller.abort();
201
+ });
202
+ }
203
+ if (args) {
204
+ previewTest(`MP4: ${name} with args, control requested at same time`, SharedInput, async (_, _source, _sink) => {
205
+ const baseUrl = await getTestPreviewUrl();
206
+ const [streams1, streams2] = await Promise.all([
207
+ (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`),
208
+ (0, sinks_1.getStreams)(`${baseUrl}`)
209
+ ]);
210
+ await asserts(streams1[0], streams2[0]);
211
+ });
212
+ }
213
+ }
214
+ mp4PreviewTest("Unmapped video streams", 'video', 'unmapped', async (stream) => {
215
+ (0, chai_1.expect)(stream.codec_name = 'h264');
216
+ });
217
+ mp4PreviewTest("Unmapped video streams, resized width and height", 'video', 'unmapped', async (stream, controlStream) => {
218
+ (0, chai_1.expect)(stream.codec_name = 'h264');
219
+ (0, chai_1.expect)(stream.width).equal(320);
220
+ (0, chai_1.expect)(stream.height).equal(240);
221
+ if (controlStream) {
222
+ (0, chai_1.expect)(controlStream.width).equal(640);
223
+ (0, chai_1.expect)(controlStream.height).equal(360);
224
+ }
225
+ }, { width: "320", height: "240" });
226
+ mp4PreviewTest("Unmapped video streams, resized only width", 'video', 'unmapped', async (stream, controlStream) => {
227
+ (0, chai_1.expect)(stream.codec_name = 'h264');
228
+ (0, chai_1.expect)(stream.width).equal(320);
229
+ (0, chai_1.expect)(stream.height).equal(180);
230
+ if (controlStream) {
231
+ (0, chai_1.expect)(controlStream.width).equal(640);
232
+ (0, chai_1.expect)(controlStream.height).equal(360);
233
+ }
234
+ }, { width: "320" });
235
+ mp4PreviewTest("Unmapped video streams, resized only height", 'video', 'unmapped', async (stream, controlStream) => {
236
+ (0, chai_1.expect)(stream.codec_name = 'h264');
237
+ (0, chai_1.expect)(stream.width).equal(320);
238
+ (0, chai_1.expect)(stream.height).equal(180);
239
+ if (controlStream) {
240
+ (0, chai_1.expect)(controlStream.width).equal(640);
241
+ (0, chai_1.expect)(controlStream.height).equal(360);
242
+ }
243
+ }, { height: "180" });
244
+ mp4PreviewTest("Unmapped audio streams", 'audio', 'unmapped', async (stream) => {
245
+ (0, chai_1.expect)(stream.codec_name = 'aac');
246
+ });
247
+ mp4PreviewTest("Mapped video streams", 'video', 'mapped', async (stream) => {
248
+ (0, chai_1.expect)(stream.codec_name = 'h264');
249
+ });
250
+ mp4PreviewTest("Mapped video streams, resized width and height", 'video', 'mapped', async (stream, controlStream) => {
251
+ (0, chai_1.expect)(stream.codec_name = 'h264');
252
+ (0, chai_1.expect)(stream.width).equal(320);
253
+ (0, chai_1.expect)(stream.height).equal(240);
254
+ if (controlStream) {
255
+ (0, chai_1.expect)(controlStream.width).equal(640);
256
+ (0, chai_1.expect)(controlStream.height).equal(360);
257
+ }
258
+ }, { width: "320", height: "240" });
259
+ mp4PreviewTest("Mapped video streams, resized only width", 'video', 'mapped', async (stream, controlStream) => {
260
+ (0, chai_1.expect)(stream.codec_name = 'h264');
261
+ (0, chai_1.expect)(stream.width).equal(320);
262
+ (0, chai_1.expect)(stream.height).equal(180);
263
+ if (controlStream) {
264
+ (0, chai_1.expect)(controlStream.width).equal(640);
265
+ (0, chai_1.expect)(controlStream.height).equal(360);
266
+ }
267
+ }, { width: "320" });
268
+ mp4PreviewTest("Mapped video streams, resized only height", 'video', 'mapped', async (stream, controlStream) => {
269
+ (0, chai_1.expect)(stream.codec_name = 'h264');
270
+ (0, chai_1.expect)(stream.width).equal(320);
271
+ (0, chai_1.expect)(stream.height).equal(180);
272
+ if (controlStream) {
273
+ (0, chai_1.expect)(controlStream.width).equal(640);
274
+ (0, chai_1.expect)(controlStream.height).equal(360);
275
+ }
276
+ }, { height: "180" });
277
+ mp4PreviewTest("Mapped audio streams", 'audio', 'mapped', async (stream) => {
278
+ (0, chai_1.expect)(stream.codec_name = 'aac');
279
+ });
280
+ jpegPreviewTest("Unmapped video streams", 'unmapped', async (stream) => {
281
+ (0, chai_1.expect)(stream.codec_name = 'jpeg');
282
+ });
283
+ jpegPreviewTest("Unmapped video streams, resized width and height", 'unmapped', async (stream, controlStream) => {
284
+ (0, chai_1.expect)(stream.codec_name = 'jpeg');
285
+ (0, chai_1.expect)(stream.width).equal(320);
286
+ (0, chai_1.expect)(stream.height).equal(240);
287
+ if (controlStream) {
288
+ (0, chai_1.expect)(controlStream.width).equal(800);
289
+ (0, chai_1.expect)(controlStream.height).equal(450);
290
+ }
291
+ }, { width: "320", height: "240" });
292
+ jpegPreviewTest("Unmapped video streams, resized only width", 'unmapped', async (stream, controlStream) => {
293
+ (0, chai_1.expect)(stream.codec_name = 'jpeg');
294
+ (0, chai_1.expect)(stream.width).equal(320);
295
+ (0, chai_1.expect)(stream.height).equal(180);
296
+ if (controlStream) {
297
+ (0, chai_1.expect)(controlStream.width).equal(800);
298
+ (0, chai_1.expect)(controlStream.height).equal(450);
299
+ }
300
+ }, { width: "320" });
301
+ jpegPreviewTest("Unmapped video streams, resized only height", 'unmapped', async (stream, controlStream) => {
302
+ (0, chai_1.expect)(stream.codec_name = 'jpeg');
303
+ (0, chai_1.expect)(stream.width).equal(320);
304
+ (0, chai_1.expect)(stream.height).equal(180);
305
+ if (controlStream) {
306
+ (0, chai_1.expect)(controlStream.width).equal(800);
307
+ (0, chai_1.expect)(controlStream.height).equal(450);
308
+ }
309
+ }, { height: "180" });
310
+ jpegPreviewTest("Mapped video streams", 'mapped', async (stream) => {
311
+ (0, chai_1.expect)(stream.codec_name = 'jpeg');
312
+ });
313
+ jpegPreviewTest("Mapped video streams, resized width and height", 'mapped', async (stream, controlStream) => {
314
+ (0, chai_1.expect)(stream.codec_name = 'jpeg');
315
+ (0, chai_1.expect)(stream.width).equal(320);
316
+ (0, chai_1.expect)(stream.height).equal(240);
317
+ if (controlStream) {
318
+ (0, chai_1.expect)(controlStream.width).equal(800);
319
+ (0, chai_1.expect)(controlStream.height).equal(450);
320
+ }
321
+ }, { width: "320", height: "240" });
322
+ jpegPreviewTest("Mapped video streams, resized only width", 'mapped', async (stream, controlStream) => {
323
+ (0, chai_1.expect)(stream.codec_name = 'jpeg');
324
+ (0, chai_1.expect)(stream.width).equal(320);
325
+ (0, chai_1.expect)(stream.height).equal(180);
326
+ if (controlStream) {
327
+ (0, chai_1.expect)(controlStream.width).equal(800);
328
+ (0, chai_1.expect)(controlStream.height).equal(450);
329
+ }
330
+ }, { width: "320" });
331
+ jpegPreviewTest("Mapped video streams, resized only height", 'mapped', async (stream, controlStream) => {
332
+ (0, chai_1.expect)(stream.codec_name = 'jpeg');
333
+ (0, chai_1.expect)(stream.width).equal(320);
334
+ (0, chai_1.expect)(stream.height).equal(180);
335
+ if (controlStream) {
336
+ (0, chai_1.expect)(controlStream.width).equal(800);
337
+ (0, chai_1.expect)(controlStream.height).equal(450);
338
+ }
339
+ }, { height: "180" });
340
+ function jpegPreviewTest(name, streamType, asserts, args) {
341
+ function argsToQs(args) {
342
+ if (!args)
343
+ return '';
344
+ return "?" + Object.entries(args).map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join("&");
345
+ }
346
+ async function getTestPreviewUrl() {
347
+ if (streamType == 'unmapped') {
348
+ const result = await (0, node_fetch_1.default)(`http://127.0.0.1:${port}/source/streams/unmapped`).then(async (r) => r.json());
349
+ const media = result.find((r) => r.metadata.case == 'video');
350
+ (0, chai_1.expect)(media?.preview_jpeg).not.empty;
351
+ if (!media?.preview_jpeg)
352
+ throw new Error("No preview jpeg url");
353
+ return `http://127.0.0.1:${port}/source/streams/${media?.preview_jpeg}`;
354
+ }
355
+ else {
356
+ const result = await (0, node_fetch_1.default)(`http://127.0.0.1:${port}/source/streams/mappings`).then(async (r) => r.json());
357
+ const media = result.find((r) => r.metadata?.case == 'video');
358
+ (0, chai_1.expect)(media?.preview_jpeg).not.empty;
359
+ if (!media?.preview_jpeg)
360
+ throw new Error("No preview url");
361
+ return `http://127.0.0.1:${port}/source/streams/${media?.preview_jpeg}`;
362
+ }
363
+ }
364
+ previewTest(`JPEG: ${name}`, SharedInput, async (_, _source, _sink) => {
365
+ const baseUrl = await getTestPreviewUrl();
366
+ const streams = await (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`);
367
+ (0, chai_1.expect)(streams.length).equal(1);
368
+ await asserts(streams[0]);
369
+ });
370
+ previewTest(`JPEG: ${name} twice, same args`, SharedInput, async (_, _source, _sink) => {
371
+ const baseUrl = await getTestPreviewUrl();
372
+ await (0, sinks_1.getStreams)(`{baseUrl}${argsToQs(args)}`);
373
+ const streams2 = await (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`);
374
+ (0, chai_1.expect)(streams2.length).equal(1);
375
+ await asserts(streams2[0]);
376
+ });
377
+ if (args) {
378
+ previewTest(`JPEG: ${name} twice, different args`, SharedInput, async (_, _source, _sink) => {
379
+ const baseUrl = await getTestPreviewUrl();
380
+ await (0, sinks_1.getStreams)(`${baseUrl}`);
381
+ const streams2 = await (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`);
382
+ (0, chai_1.expect)(streams2.length).equal(1);
383
+ await asserts(streams2[0]);
384
+ });
385
+ }
386
+ previewTest(`JPEG: ${name} while already active`, SharedInput, async (_, _source, _sink) => {
387
+ const baseUrl = await getTestPreviewUrl();
388
+ const controller = await streamUrlForABit(`${baseUrl}${argsToQs(args)}`);
389
+ const streams2 = await (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`);
390
+ await asserts(streams2[0]);
391
+ controller.abort();
392
+ });
393
+ if (args) {
394
+ previewTest(`JPEG: ${name} while already active, different args`, SharedInput, async (_, _source, _sink) => {
395
+ const baseUrl = await getTestPreviewUrl();
396
+ const controller = await streamUrlForABit(`${baseUrl}`);
397
+ const streams2 = await (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`);
398
+ await asserts(streams2[0]);
399
+ controller.abort();
400
+ });
401
+ }
402
+ if (args) {
403
+ previewTest(`JPEG: ${name} with args, control requested at same time`, SharedInput, async (_, _source, _sink) => {
404
+ const baseUrl = await getTestPreviewUrl();
405
+ const [streams1, streams2] = await Promise.all([
406
+ (0, sinks_1.getStreams)(`${baseUrl}${argsToQs(args)}`),
407
+ (0, sinks_1.getStreams)(`${baseUrl}`)
408
+ ]);
409
+ await asserts(streams1[0], streams2[0]);
410
+ });
411
+ }
412
+ }
413
+ async function streamUrlForABit(url) {
414
+ const controller = new AbortController();
415
+ await (0, node_fetch_1.default)(url, { signal: controller.signal }).then((r) => {
416
+ const stream = fs_1.default.createWriteStream('/dev/null');
417
+ r.body.pipe(stream);
418
+ return stream;
419
+ });
420
+ return controller;
421
+ }
422
+ });
423
+ //# sourceMappingURL=preview-endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-endpoints.js","sourceRoot":"","sources":["../../src/test/preview-endpoints.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,21 @@ info:
6
6
  paths: {}
7
7
  components:
8
8
  schemas:
9
+ ComponentAlert:
10
+ type: object
11
+ properties:
12
+ message:
13
+ type: string
14
+ level:
15
+ type: string
16
+ enum: ["error", "warning"]
17
+ startMs:
18
+ type: number
19
+ required:
20
+ - message
21
+ - level
22
+ - startMs
23
+
9
24
  StreamKey:
10
25
  type: object
11
26
  properties:
@@ -42,6 +42,12 @@ components:
42
42
  source:
43
43
  description: "Where in Norsk this stream is being produced"
44
44
  $ref: '#/components/schemas/StreamSource'
45
+ preview_url:
46
+ description: "URL from which a fragmented mp4 preview stream can be obtained (audio and video only)"
47
+ type: string
48
+ preview_jpeg:
49
+ description: "URL from which a jpeg preview can be obtained (video only)"
50
+ type: string
45
51
  required:
46
52
  - output
47
53
 
@@ -53,6 +59,12 @@ components:
53
59
  $ref: './base.yml#/components/schemas/StreamMetadataMessage'
54
60
  source:
55
61
  $ref: '#/components/schemas/StreamSource'
62
+ preview_url:
63
+ description: "URL from which a fragmented mp4 preview stream can be obtained (video and audio only)"
64
+ type: string
65
+ preview_jpeg:
66
+ description: "URL from which a jpeg preview can be obtained (video only)"
67
+ type: string
56
68
  required:
57
69
  - metadata
58
70
  - source
package/lib/types.d.ts CHANGED
@@ -2,6 +2,11 @@ export type paths = Record<string, never>;
2
2
  export type webhooks = Record<string, never>;
3
3
  export interface components {
4
4
  schemas: {
5
+ AlertListResult: components["schemas"]["ComponentAlert"][];
6
+ GlobalAlertListResult: {
7
+ componentId: string;
8
+ alert: components["schemas"]["ComponentAlert"];
9
+ }[];
5
10
  OutputStreamResult: components["schemas"]["OutputStream"][];
6
11
  UnmappedStreamResult: components["schemas"]["UnmappedStream"][];
7
12
  PutMappingsBody: components["schemas"]["OutputStream"][];
@@ -9,6 +14,11 @@ export interface components {
9
14
  ResetStreamBody: Record<string, never>;
10
15
  ResetStreamFailure: string;
11
16
  ResetStreamSuccess: string;
17
+ ComponentAlert: {
18
+ message: string;
19
+ level: "error" | "warning";
20
+ startMs: number;
21
+ };
12
22
  AudioCodec: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
13
23
  SampleRate: 8000 | 11025 | 12000 | 16000 | 22050 | 24000 | 32000 | 44100 | 48000 | 64000 | 88200 | 96000;
14
24
  ChannelName: "l" | "r" | "c" | "lfe" | "ls" | "rs" | "lc" | "rc" | "lsr" | "rsr" | "cs" | "lsd" | "rsd" | "lss" | "rss" | "lw" | "rw" | "lv" | "rv" | "cv" | "lvr" | "rvr" | "cvr" | "lvss" | "rvss" | "ts" | "lfe2" | "lb" | "rb" | "cb" | "lvs" | "rvs" | "lfe3" | "leos" | "reos" | "hwbcal" | "hwbcar" | "lbs" | "rbs" | "unknown";
@@ -85,10 +95,14 @@ export interface components {
85
95
  };
86
96
  metadata?: components["schemas"]["StreamMetadataMessage"];
87
97
  source?: components["schemas"]["StreamSource"];
98
+ preview_url?: string;
99
+ preview_jpeg?: string;
88
100
  };
89
101
  UnmappedStream: {
90
102
  metadata: components["schemas"]["StreamMetadataMessage"];
91
103
  source: components["schemas"]["StreamSource"];
104
+ preview_url?: string;
105
+ preview_jpeg?: string;
92
106
  };
93
107
  };
94
108
  responses: never;
package/lib/types.yaml CHANGED
@@ -5,6 +5,23 @@ info:
5
5
  paths: {}
6
6
  components:
7
7
  schemas:
8
+ AlertListResult:
9
+ type: array
10
+ items:
11
+ $ref: './types/base.yml#/components/schemas/ComponentAlert'
12
+ GlobalAlertListResult:
13
+ type: array
14
+ items:
15
+ type: object
16
+ properties:
17
+ componentId:
18
+ type: string
19
+ alert:
20
+ $ref: './types/base.yml#/components/schemas/ComponentAlert'
21
+ required:
22
+ - componentId
23
+ - alert
24
+
8
25
  OutputStreamResult:
9
26
  type: array
10
27
  items:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@norskvideo/norsk-studio",
3
- "version": "1.27.0-2025-05-21-b03b48ea",
3
+ "version": "1.27.0-2025-05-26-a443eb84",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "postinstall": "rm -f node_modules/hls-parser/*.ts",
@@ -45,14 +45,17 @@
45
45
  "@dnd-kit/core": "^6.3.1",
46
46
  "@dnd-kit/modifiers": "^9.0.0",
47
47
  "@dnd-kit/sortable": "^10.0.0",
48
- "@norskvideo/norsk-sdk": "^1.0.402-2025-05-21-59ecadb4",
48
+ "@norskvideo/norsk-sdk": "^1.0.402-2025-05-26-c7282067",
49
49
  "@norskvideo/webrtc-client": "^0.1.2",
50
- "@radix-ui/react-dialog": "^1.1.11",
50
+ "@radix-ui/react-accordion": "^1.2.10",
51
+ "@radix-ui/react-dialog": "^1.1.13",
51
52
  "@radix-ui/react-dropdown-menu": "^2.1.6",
52
53
  "@radix-ui/react-popover": "^1.1.6",
53
54
  "@radix-ui/react-select": "^2.1.6",
55
+ "@radix-ui/react-separator": "^1.1.6",
56
+ "@radix-ui/react-slot": "^1.2.2",
54
57
  "@radix-ui/react-switch": "^1.1.3",
55
- "@radix-ui/react-tooltip": "^1.1.8",
58
+ "@radix-ui/react-tooltip": "^1.2.6",
56
59
  "@uiw/react-json-view": "^2.0.0-alpha.27",
57
60
  "class-variance-authority": "^0.7.1",
58
61
  "clsx": "^2.1.1",
@@ -66,19 +69,18 @@
66
69
  "express": "^4.18.2",
67
70
  "express-ws": "^5.0.2",
68
71
  "filewatcher": "^3.0.1",
69
- "flowbite": "github:id3as/flowbite#main2",
70
- "flowbite-react": "^0.10.1",
71
72
  "hls.js": "^1.5.8",
72
73
  "http-proxy-middleware": "^3.0.0",
73
74
  "intersect": "^1.0.1",
74
75
  "isomorphic-ws": "^5.0.0",
75
- "lucide-react": "^0.477.0",
76
76
  "mustache": "^4.2.0",
77
+ "next-themes": "^0.4.6",
77
78
  "node-fetch": "^2.7.0",
78
79
  "openapi-types": "^12.1.3",
79
80
  "parse-prometheus-text-format": "^1.1.1",
80
81
  "react-chartjs-2": "^5.2.0",
81
82
  "react-hook-form": "^7.47.0",
83
+ "sonner": "^2.0.3",
82
84
  "swagger-ui-express": "^5.0.1",
83
85
  "tailwind-scrollbar": "^3.0.0",
84
86
  "tailwindcss-animate": "^1.0.7",