@norskvideo/norsk-studio-built-ins 1.26.0-2025-02-23-763ed056 → 1.26.0-2025-02-25-7fa494e5

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 (76) hide show
  1. package/client/info.js +328 -159
  2. package/lib/info.js +23 -13
  3. package/lib/info.js.map +1 -1
  4. package/lib/output.autoCmaf/runtime.js +2 -7
  5. package/lib/output.autoCmaf/runtime.js.map +1 -1
  6. package/lib/output.facebook/info.d.ts +7 -0
  7. package/lib/output.facebook/info.js +31 -0
  8. package/lib/output.facebook/info.js.map +1 -0
  9. package/lib/output.facebook/runtime.d.ts +12 -0
  10. package/lib/output.facebook/runtime.js +20 -0
  11. package/lib/output.facebook/runtime.js.map +1 -0
  12. package/lib/output.facebook/types.d.ts +19 -0
  13. package/lib/output.facebook/types.js +3 -0
  14. package/lib/output.facebook/types.js.map +1 -0
  15. package/lib/output.facebook/types.yaml +19 -0
  16. package/lib/output.linkedin/info.d.ts +7 -0
  17. package/lib/output.linkedin/info.js +31 -0
  18. package/lib/output.linkedin/info.js.map +1 -0
  19. package/lib/output.linkedin/runtime.d.ts +12 -0
  20. package/lib/output.linkedin/runtime.js +20 -0
  21. package/lib/output.linkedin/runtime.js.map +1 -0
  22. package/lib/output.linkedin/types.d.ts +19 -0
  23. package/lib/output.linkedin/types.js +3 -0
  24. package/lib/output.linkedin/types.js.map +1 -0
  25. package/lib/output.linkedin/types.yaml +19 -0
  26. package/lib/output.rtmp/info.d.ts +9 -2
  27. package/lib/output.rtmp/info.js +25 -20
  28. package/lib/output.rtmp/info.js.map +1 -1
  29. package/lib/output.rtmp/inline-view.d.ts +3 -2
  30. package/lib/output.rtmp/inline-view.js.map +1 -1
  31. package/lib/output.rtmp/runtime.d.ts +23 -11
  32. package/lib/output.rtmp/runtime.js +92 -92
  33. package/lib/output.rtmp/runtime.js.map +1 -1
  34. package/lib/output.rtmp/summary-view.d.ts +3 -3
  35. package/lib/output.rtmp/summary-view.js.map +1 -1
  36. package/lib/output.twitch/info.d.ts +7 -0
  37. package/lib/output.twitch/info.js +31 -0
  38. package/lib/output.twitch/info.js.map +1 -0
  39. package/lib/output.twitch/runtime.d.ts +12 -0
  40. package/lib/output.twitch/runtime.js +20 -0
  41. package/lib/output.twitch/runtime.js.map +1 -0
  42. package/lib/output.twitch/types.d.ts +19 -0
  43. package/lib/output.twitch/types.js +3 -0
  44. package/lib/output.twitch/types.js.map +1 -0
  45. package/lib/output.twitch/types.yaml +19 -0
  46. package/lib/output.youtube/info.d.ts +7 -0
  47. package/lib/output.youtube/info.js +31 -0
  48. package/lib/output.youtube/info.js.map +1 -0
  49. package/lib/output.youtube/runtime.d.ts +12 -0
  50. package/lib/output.youtube/runtime.js +20 -0
  51. package/lib/output.youtube/runtime.js.map +1 -0
  52. package/lib/output.youtube/types.d.ts +19 -0
  53. package/lib/output.youtube/types.js +3 -0
  54. package/lib/output.youtube/types.js.map +1 -0
  55. package/lib/output.youtube/types.yaml +19 -0
  56. package/lib/processor.audioEncoder/info.d.ts +9 -2
  57. package/lib/processor.audioEncoder/runtime.d.ts +7 -16
  58. package/lib/processor.audioEncoder/runtime.js +8 -0
  59. package/lib/processor.audioEncoder/runtime.js.map +1 -1
  60. package/lib/processor.audioEncoder/types.d.ts +34 -0
  61. package/lib/processor.audioEncoder/types.js +3 -0
  62. package/lib/processor.audioEncoder/types.js.map +1 -0
  63. package/lib/processor.audioEncoder/types.yaml +103 -0
  64. package/lib/processor.fixedLadder/runtime.d.ts +2 -2
  65. package/lib/processor.fixedLadder/runtime.js +2 -9
  66. package/lib/processor.fixedLadder/runtime.js.map +1 -1
  67. package/lib/processor.videoDecoder/info.d.ts +3 -0
  68. package/lib/processor.videoDecoder/info.js +48 -0
  69. package/lib/processor.videoDecoder/info.js.map +1 -0
  70. package/lib/processor.videoDecoder/runtime.d.ts +12 -0
  71. package/lib/processor.videoDecoder/runtime.js +17 -0
  72. package/lib/processor.videoDecoder/runtime.js.map +1 -0
  73. package/lib/shared/schemas.d.ts +8 -0
  74. package/lib/shared/schemas.js +19 -0
  75. package/lib/shared/schemas.js.map +1 -0
  76. package/package.json +3 -3
package/client/info.js CHANGED
@@ -5153,6 +5153,61 @@ var init_form_views = __esm({
5153
5153
  }
5154
5154
  });
5155
5155
 
5156
+ // build/output.rtmp/summary-view.js
5157
+ var summary_view_exports4 = {};
5158
+ __export(summary_view_exports4, {
5159
+ default: () => summary_view_default4
5160
+ });
5161
+ function SummaryView6({ state, sendCommand }) {
5162
+ const handleEnableOutput = () => {
5163
+ void enableOutput();
5164
+ };
5165
+ const enableOutput = async () => {
5166
+ sendCommand({
5167
+ type: "enable-output"
5168
+ });
5169
+ };
5170
+ const handleDisableOutput = () => {
5171
+ void disableOutput();
5172
+ };
5173
+ const disableOutput = async () => {
5174
+ sendCommand({
5175
+ type: "disable-output"
5176
+ });
5177
+ };
5178
+ return (0, import_jsx_runtime10.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime10.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-blue-500" : "bg-red-500"}` }), (0, import_jsx_runtime10.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime10.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime10.jsx)("button", { onClick: handleDisableOutput, className: "px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Disable Output" }) : (0, import_jsx_runtime10.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-blue-700 text-white rounded", children: "Enable Output" }) })] }) });
5179
+ }
5180
+ var import_jsx_runtime10, summary_view_default4;
5181
+ var init_summary_view4 = __esm({
5182
+ "build/output.rtmp/summary-view.js"() {
5183
+ "use strict";
5184
+ import_jsx_runtime10 = __toESM(require_jsx_runtime());
5185
+ summary_view_default4 = SummaryView6;
5186
+ }
5187
+ });
5188
+
5189
+ // build/output.rtmp/inline-view.js
5190
+ var inline_view_exports4 = {};
5191
+ __export(inline_view_exports4, {
5192
+ default: () => inline_view_default4
5193
+ });
5194
+ function InlineView6({ state, config }) {
5195
+ if (!state.enabled) {
5196
+ return (0, import_jsx_runtime11.jsx)("div", { className: "disabled text-gray-500 dark:text-gray-400", children: "Output disabled" });
5197
+ }
5198
+ const connected = (0, import_jsx_runtime11.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Connected and publishing" });
5199
+ const disconnected = (0, import_jsx_runtime11.jsxs)("div", { className: "inactive text-orange-500 dark:text-orange-300", children: ["Disconnected ", state.connectRetries > 0 ? `- retrying(${state.connectRetries})` : ""] });
5200
+ return (0, import_jsx_runtime11.jsx)("div", { className: "rtmp-output", id: `rtmp-output-${config.id}`, children: state.connected ? connected : disconnected });
5201
+ }
5202
+ var import_jsx_runtime11, inline_view_default4;
5203
+ var init_inline_view4 = __esm({
5204
+ "build/output.rtmp/inline-view.js"() {
5205
+ "use strict";
5206
+ import_jsx_runtime11 = __toESM(require_jsx_runtime());
5207
+ inline_view_default4 = InlineView6;
5208
+ }
5209
+ });
5210
+
5156
5211
  // external-global-plugin:@norskvideo/webrtc-client
5157
5212
  var require_webrtc_client = __commonJS({
5158
5213
  "external-global-plugin:@norskvideo/webrtc-client"(exports, module) {
@@ -5161,15 +5216,15 @@ var require_webrtc_client = __commonJS({
5161
5216
  });
5162
5217
 
5163
5218
  // build/output.preview/inline-view.js
5164
- var inline_view_exports4 = {};
5165
- __export(inline_view_exports4, {
5166
- default: () => inline_view_default4
5219
+ var inline_view_exports5 = {};
5220
+ __export(inline_view_exports5, {
5221
+ default: () => inline_view_default5
5167
5222
  });
5168
- function InlineView6({ state, config, raise }) {
5223
+ function InlineView7({ state, config, raise }) {
5169
5224
  const url = state.url;
5170
5225
  const id = config.id;
5171
- const [showPreview, setShowPreview] = (0, import_react6.useState)(config.showPreview ?? true);
5172
- const [client, setClient] = (0, import_react6.useState)(null);
5226
+ const [showPreview, setShowPreview] = (0, import_react7.useState)(config.showPreview ?? true);
5227
+ const [client, setClient] = (0, import_react7.useState)(null);
5173
5228
  const createClient = (url2) => {
5174
5229
  const client2 = new import_webrtc_client.WhepClient({
5175
5230
  url: url2,
@@ -5188,8 +5243,8 @@ function InlineView6({ state, config, raise }) {
5188
5243
  video.remove();
5189
5244
  });
5190
5245
  };
5191
- const [loadedImage, setLoadedImage] = (0, import_react6.useState)(void 0);
5192
- (0, import_react6.useEffect)(() => {
5246
+ const [loadedImage, setLoadedImage] = (0, import_react7.useState)(void 0);
5247
+ (0, import_react7.useEffect)(() => {
5193
5248
  const container = document.getElementById(`preview-${id}`) ?? void 0;
5194
5249
  if (!container)
5195
5250
  return;
@@ -5198,7 +5253,7 @@ function InlineView6({ state, config, raise }) {
5198
5253
  container.appendChild(loadedImage);
5199
5254
  }
5200
5255
  }, [loadedImage]);
5201
- (0, import_react6.useEffect)(() => {
5256
+ (0, import_react7.useEffect)(() => {
5202
5257
  if (!url || !showPreview) {
5203
5258
  if (client) {
5204
5259
  cleanupClient(client);
@@ -5225,12 +5280,12 @@ function InlineView6({ state, config, raise }) {
5225
5280
  };
5226
5281
  }
5227
5282
  }, [state.url, showPreview]);
5228
- (0, import_react6.useEffect)(() => {
5283
+ (0, import_react7.useEffect)(() => {
5229
5284
  setShowPreview(config.showPreview ?? true);
5230
5285
  }, [config.showPreview]);
5231
- raise && (0, import_react6.useEffect)(raise, []);
5286
+ raise && (0, import_react7.useEffect)(raise, []);
5232
5287
  if (!url)
5233
- return (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, { children: "..." });
5288
+ return (0, import_jsx_runtime12.jsx)(import_jsx_runtime12.Fragment, { children: "..." });
5234
5289
  function percentage(levels) {
5235
5290
  if (!levels) {
5236
5291
  return 0;
@@ -5240,72 +5295,17 @@ function InlineView6({ state, config, raise }) {
5240
5295
  const snapped = Math.floor(capped * 10) * 10;
5241
5296
  return Math.max(0, 100 - snapped);
5242
5297
  }
5243
- return (0, import_jsx_runtime10.jsxs)("div", { className: "preview-outer-container", children: [(0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime10.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime10.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime10.jsx)("div", { className: "preview-video", id: `preview-${id}`, children: (0, import_jsx_runtime10.jsx)("style", { children: `
5298
+ return (0, import_jsx_runtime12.jsxs)("div", { className: "preview-outer-container", children: [(0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime12.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime12.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime12.jsx)("div", { className: "preview-video", id: `preview-${id}`, children: (0, import_jsx_runtime12.jsx)("style", { children: `
5244
5299
  #preview-${id} video::-webkit-media-controls-play-button { display: none; },
5245
- ` }) }) : (0, import_jsx_runtime10.jsx)("div", { className: "preview-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" }), (0, import_jsx_runtime10.jsx)("div", { className: "preview-levels", children: (0, import_jsx_runtime10.jsx)("div", { className: `preview-level clip-${percentage(state.levels)}-preview` }) })] });
5246
- }
5247
- var import_jsx_runtime10, import_react6, import_webrtc_client, inline_view_default4;
5248
- var init_inline_view4 = __esm({
5249
- "build/output.preview/inline-view.js"() {
5250
- "use strict";
5251
- import_jsx_runtime10 = __toESM(require_jsx_runtime());
5252
- import_react6 = __toESM(require_react());
5253
- import_webrtc_client = __toESM(require_webrtc_client());
5254
- inline_view_default4 = InlineView6;
5255
- }
5256
- });
5257
-
5258
- // build/output.rtmp/summary-view.js
5259
- var summary_view_exports4 = {};
5260
- __export(summary_view_exports4, {
5261
- default: () => summary_view_default4
5262
- });
5263
- function SummaryView6({ state, sendCommand }) {
5264
- const handleEnableOutput = () => {
5265
- void enableOutput();
5266
- };
5267
- const enableOutput = async () => {
5268
- sendCommand({
5269
- type: "enable-output"
5270
- });
5271
- };
5272
- const handleDisableOutput = () => {
5273
- void disableOutput();
5274
- };
5275
- const disableOutput = async () => {
5276
- sendCommand({
5277
- type: "disable-output"
5278
- });
5279
- };
5280
- return (0, import_jsx_runtime11.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime11.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-blue-500" : "bg-red-500"}` }), (0, import_jsx_runtime11.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime11.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime11.jsx)("button", { onClick: handleDisableOutput, className: "px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Disable Output" }) : (0, import_jsx_runtime11.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-blue-700 text-white rounded", children: "Enable Output" }) })] }) });
5281
- }
5282
- var import_jsx_runtime11, summary_view_default4;
5283
- var init_summary_view4 = __esm({
5284
- "build/output.rtmp/summary-view.js"() {
5285
- "use strict";
5286
- import_jsx_runtime11 = __toESM(require_jsx_runtime());
5287
- summary_view_default4 = SummaryView6;
5288
- }
5289
- });
5290
-
5291
- // build/output.rtmp/inline-view.js
5292
- var inline_view_exports5 = {};
5293
- __export(inline_view_exports5, {
5294
- default: () => inline_view_default5
5295
- });
5296
- function InlineView7({ state, config }) {
5297
- if (!state.enabled) {
5298
- return (0, import_jsx_runtime12.jsx)("div", { className: "disabled text-gray-500 dark:text-gray-400", children: "Output disabled" });
5299
- }
5300
- const connected = (0, import_jsx_runtime12.jsx)("div", { className: "active text-green-500 dark:text-green-300", children: "Connected and publishing" });
5301
- const disconnected = (0, import_jsx_runtime12.jsxs)("div", { className: "inactive text-orange-500 dark:text-orange-300", children: ["Disconnected ", state.connectRetries > 0 ? `- retrying(${state.connectRetries})` : ""] });
5302
- return (0, import_jsx_runtime12.jsx)("div", { className: "rtmp-output", id: `rtmp-output-${config.id}`, children: state.connected ? connected : disconnected });
5300
+ ` }) }) : (0, import_jsx_runtime12.jsx)("div", { className: "preview-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" }), (0, import_jsx_runtime12.jsx)("div", { className: "preview-levels", children: (0, import_jsx_runtime12.jsx)("div", { className: `preview-level clip-${percentage(state.levels)}-preview` }) })] });
5303
5301
  }
5304
- var import_jsx_runtime12, inline_view_default5;
5302
+ var import_jsx_runtime12, import_react7, import_webrtc_client, inline_view_default5;
5305
5303
  var init_inline_view5 = __esm({
5306
- "build/output.rtmp/inline-view.js"() {
5304
+ "build/output.preview/inline-view.js"() {
5307
5305
  "use strict";
5308
5306
  import_jsx_runtime12 = __toESM(require_jsx_runtime());
5307
+ import_react7 = __toESM(require_react());
5308
+ import_webrtc_client = __toESM(require_webrtc_client());
5309
5309
  inline_view_default5 = InlineView7;
5310
5310
  }
5311
5311
  });
@@ -5403,7 +5403,7 @@ var init_inline_view7 = __esm({
5403
5403
  });
5404
5404
 
5405
5405
  // build/output.statistics/info.js
5406
- function info_default12({ defineComponent, All }) {
5406
+ function info_default14({ defineComponent, All }) {
5407
5407
  const InlineView15 = import_react10.default.lazy(async () => Promise.resolve().then(() => (init_inline_view7(), inline_view_exports7)));
5408
5408
  return defineComponent({
5409
5409
  identifier: "output.statistics",
@@ -21352,12 +21352,144 @@ function info_default8(R) {
21352
21352
  };
21353
21353
  }
21354
21354
 
21355
+ // build/output.rtmp/info.js
21356
+ var import_react6 = __toESM(require_react());
21357
+ function info_default9(r) {
21358
+ const { validation: { JitterBuffer, Z } } = r;
21359
+ return defineRtmpOutputComponent(r, {
21360
+ identifier: "output.rtmp",
21361
+ name: "RTMP Egest",
21362
+ description: "This component handles the output of RTMP (Real-Time Messaging Protocol) streams. It is used to connect to a remote RTMP server and manage the streaming of media. ",
21363
+ configForm: {
21364
+ form: {
21365
+ url: { help: "The URL of the remote RTMP server to connect to, including the full stream path and credentials", hint: { type: "text", validation: Z.string().min(5) } },
21366
+ bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } },
21367
+ avDelayMs: { help: "How many milliseconds to delay A/V to account for subtitles", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 50 } },
21368
+ retryConnectionTimeout: { help: "Number of seconds to wait until a retry is attempted to the RTMP server", hint: { type: "numeric", validation: Z.number().min(1).max(10), defaultValue: 5 } },
21369
+ notes: {
21370
+ help: "Additional notes about this component",
21371
+ hint: { type: "text", optional: true }
21372
+ }
21373
+ }
21374
+ }
21375
+ });
21376
+ }
21377
+ function defineRtmpOutputComponent({ defineComponent, Av }, settings) {
21378
+ const SummaryView12 = import_react6.default.lazy(async () => Promise.resolve().then(() => (init_summary_view4(), summary_view_exports4)));
21379
+ const InlineView15 = import_react6.default.lazy(async () => Promise.resolve().then(() => (init_inline_view4(), inline_view_exports4)));
21380
+ return defineComponent({
21381
+ ...settings,
21382
+ category: "output",
21383
+ subscription: {
21384
+ // No validation?
21385
+ // Accept either *just* audio, or *just* video, or audio *and* video
21386
+ // there can only be one of each though
21387
+ // The selection of these things should determine the subscriptionValidation callback
21388
+ // requireAV or just 'cool cool cool'
21389
+ accepts: {
21390
+ type: "single-stream",
21391
+ media: Av
21392
+ }
21393
+ },
21394
+ display: (_desc) => {
21395
+ return {
21396
+ // url: desc.config.url
21397
+ };
21398
+ },
21399
+ runtime: {
21400
+ initialState: () => ({ connected: false, connectRetries: 0, enabled: true }),
21401
+ handleEvent: (ev, state) => {
21402
+ const evType = ev.type;
21403
+ switch (evType) {
21404
+ case "rtmp-server-connected-and-publishing":
21405
+ state.connected = true;
21406
+ break;
21407
+ case "rtmp-server-connection-failed-retry":
21408
+ state.connected = false;
21409
+ state.connectRetries++;
21410
+ break;
21411
+ case "output-enabled":
21412
+ state.enabled = true;
21413
+ break;
21414
+ case "output-disabled":
21415
+ state.enabled = false;
21416
+ break;
21417
+ default:
21418
+ assertUnreachable4(evType);
21419
+ }
21420
+ return { ...state };
21421
+ },
21422
+ inline: InlineView15,
21423
+ summary: SummaryView12
21424
+ }
21425
+ });
21426
+ }
21427
+ function assertUnreachable4(_) {
21428
+ throw new Error("Didn't expect to get here");
21429
+ }
21430
+
21431
+ // build/output.facebook/info.js
21432
+ function info_default10(r) {
21433
+ const { validation: { Z } } = r;
21434
+ return defineRtmpOutputComponent(r, {
21435
+ identifier: "output.Facebook",
21436
+ name: "Facebook Live",
21437
+ description: "Stream directly to Facebook Live using RTMP",
21438
+ configForm: {
21439
+ form: {
21440
+ streamKey: {
21441
+ help: "Facebook Stream Key",
21442
+ hint: {
21443
+ type: "text",
21444
+ validation: Z.string().min(1)
21445
+ }
21446
+ },
21447
+ notes: {
21448
+ help: "Additional notes about this component",
21449
+ hint: {
21450
+ type: "text",
21451
+ optional: true
21452
+ }
21453
+ }
21454
+ }
21455
+ }
21456
+ });
21457
+ }
21458
+
21459
+ // build/output.linkedin/info.js
21460
+ function info_default11(r) {
21461
+ const { validation: { Z } } = r;
21462
+ return defineRtmpOutputComponent(r, {
21463
+ identifier: "output.LinkedIn",
21464
+ name: "LinkedIn Live",
21465
+ description: "Stream directly to LinkedIn Live using RTMP",
21466
+ configForm: {
21467
+ form: {
21468
+ streamUrl: {
21469
+ help: "LinkedIn Stream URL",
21470
+ hint: {
21471
+ type: "text",
21472
+ validation: Z.string().min(1)
21473
+ }
21474
+ },
21475
+ notes: {
21476
+ help: "Additional notes about this component",
21477
+ hint: {
21478
+ type: "text",
21479
+ optional: true
21480
+ }
21481
+ }
21482
+ }
21483
+ }
21484
+ });
21485
+ }
21486
+
21355
21487
  // build/output.preview/info.js
21356
- var import_react7 = __toESM(require_react());
21488
+ var import_react8 = __toESM(require_react());
21357
21489
  var import_config2 = __toESM(require_config());
21358
- function info_default9(R) {
21490
+ function info_default12(R) {
21359
21491
  const { defineComponent, Av, validation: { JitterBuffer } } = R;
21360
- const InlineView15 = import_react7.default.lazy(async () => Promise.resolve().then(() => (init_inline_view4(), inline_view_exports4)));
21492
+ const InlineView15 = import_react8.default.lazy(async () => Promise.resolve().then(() => (init_inline_view5(), inline_view_exports5)));
21361
21493
  return defineComponent({
21362
21494
  identifier: "output.preview",
21363
21495
  category: "output",
@@ -21407,7 +21539,7 @@ function info_default9(R) {
21407
21539
  state = {};
21408
21540
  break;
21409
21541
  default:
21410
- assertUnreachable4(evType);
21542
+ assertUnreachable5(evType);
21411
21543
  }
21412
21544
  return { ...state };
21413
21545
  },
@@ -21441,76 +21573,6 @@ function info_default9(R) {
21441
21573
  }
21442
21574
  });
21443
21575
  }
21444
- function assertUnreachable4(_) {
21445
- throw new Error("Didn't expect to get here");
21446
- }
21447
-
21448
- // build/output.rtmp/info.js
21449
- var import_react8 = __toESM(require_react());
21450
- function info_default10({ defineComponent, Av, validation: { Z, JitterBuffer } }) {
21451
- const SummaryView12 = import_react8.default.lazy(async () => Promise.resolve().then(() => (init_summary_view4(), summary_view_exports4)));
21452
- const InlineView15 = import_react8.default.lazy(async () => Promise.resolve().then(() => (init_inline_view5(), inline_view_exports5)));
21453
- return defineComponent({
21454
- identifier: "output.rtmp",
21455
- category: "output",
21456
- name: "RTMP Egest",
21457
- description: "This component handles the output of RTMP (Real-Time Messaging Protocol) streams. It is used to connect to a remote RTMP server and manage the streaming of media. ",
21458
- subscription: {
21459
- // No validation?
21460
- // Accept either *just* audio, or *just* video, or audio *and* video
21461
- // there can only be one of each though
21462
- // The selection of these things should determine the subscriptionValidation callback
21463
- // requireAV or just 'cool cool cool'
21464
- accepts: {
21465
- type: "single-stream",
21466
- media: Av
21467
- }
21468
- },
21469
- display: (desc) => {
21470
- return {
21471
- url: desc.config.url
21472
- };
21473
- },
21474
- runtime: {
21475
- initialState: () => ({ connected: false, connectRetries: 0, enabled: true }),
21476
- handleEvent: (ev, state) => {
21477
- const evType = ev.type;
21478
- switch (evType) {
21479
- case "rtmp-server-connected-and-publishing":
21480
- state.connected = true;
21481
- break;
21482
- case "rtmp-server-connection-failed-retry":
21483
- state.connected = false;
21484
- state.connectRetries++;
21485
- break;
21486
- case "output-enabled":
21487
- state.enabled = true;
21488
- break;
21489
- case "output-disabled":
21490
- state.enabled = false;
21491
- break;
21492
- default:
21493
- assertUnreachable5(evType);
21494
- }
21495
- return { ...state };
21496
- },
21497
- inline: InlineView15,
21498
- summary: SummaryView12
21499
- },
21500
- configForm: {
21501
- form: {
21502
- url: { help: "The URL of the remote RTMP server to connect to, including the full stream path and credentials", hint: { type: "text", validation: Z.string().min(5) } },
21503
- bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } },
21504
- avDelayMs: { help: "How many milliseconds to delay A/V to account for subtitles", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 50 } },
21505
- retryConnectionTimeout: { help: "Number of seconds to wait until a retry is attempted to the RTMP server", hint: { type: "numeric", validation: Z.number().min(1).max(10), defaultValue: 5 } },
21506
- notes: {
21507
- help: "Additional notes about this component",
21508
- hint: { type: "text", optional: true }
21509
- }
21510
- }
21511
- }
21512
- });
21513
- }
21514
21576
  function assertUnreachable5(_) {
21515
21577
  throw new Error("Didn't expect to get here");
21516
21578
  }
@@ -21518,7 +21580,7 @@ function assertUnreachable5(_) {
21518
21580
  // build/output.srt/info.js
21519
21581
  var import_react9 = __toESM(require_react());
21520
21582
  var import_util = __toESM(require_util2());
21521
- function info_default11(registration) {
21583
+ function info_default13(registration) {
21522
21584
  const { defineComponent, All, validation } = registration;
21523
21585
  const SummaryView12 = import_react9.default.lazy(async () => Promise.resolve().then(() => (init_summary_view5(), summary_view_exports5)));
21524
21586
  const InlineView15 = import_react9.default.lazy(async () => Promise.resolve().then(() => (init_inline_view6(), inline_view_exports6)));
@@ -21626,8 +21688,36 @@ function info_default11(registration) {
21626
21688
  // build/info.js
21627
21689
  init_info();
21628
21690
 
21691
+ // build/output.twitch/info.js
21692
+ function info_default15(r) {
21693
+ const { validation: { Z } } = r;
21694
+ return defineRtmpOutputComponent(r, {
21695
+ identifier: "output.twitch",
21696
+ name: "Twitch Live",
21697
+ description: "Stream directly to Twitch using RTMP",
21698
+ configForm: {
21699
+ form: {
21700
+ streamKey: {
21701
+ help: "Twitch Stream Key (from Twitch Creator Dashboard)",
21702
+ hint: {
21703
+ type: "text",
21704
+ validation: Z.string().min(1)
21705
+ }
21706
+ },
21707
+ notes: {
21708
+ help: "Additional notes about this component",
21709
+ hint: {
21710
+ type: "text",
21711
+ optional: true
21712
+ }
21713
+ }
21714
+ }
21715
+ }
21716
+ });
21717
+ }
21718
+
21629
21719
  // build/output.udpTs/info.js
21630
- function info_default13({ defineComponent, All, validation: { Port, Hostname, JitterBuffer, Iface, Z } }) {
21720
+ function info_default16({ defineComponent, All, validation: { Port, Hostname, JitterBuffer, Iface, Z } }) {
21631
21721
  return defineComponent({
21632
21722
  identifier: "output.udpTs",
21633
21723
  category: "output",
@@ -21667,7 +21757,7 @@ function info_default13({ defineComponent, All, validation: { Port, Hostname, Ji
21667
21757
  // build/output.whep/info.js
21668
21758
  var import_config3 = __toESM(require_config());
21669
21759
  var import_react12 = __toESM(require_react());
21670
- function info_default14(R) {
21760
+ function info_default17(R) {
21671
21761
  const { defineComponent, Av, validation: { JitterBuffer } } = R;
21672
21762
  const InlineView15 = import_react12.default.lazy(async () => Promise.resolve().then(() => (init_inline_view8(), inline_view_exports8)));
21673
21763
  const SummaryView12 = import_react12.default.lazy(async () => Promise.resolve().then(() => (init_summary_view6(), summary_view_exports6)));
@@ -21732,10 +21822,38 @@ function assertUnreachable8(_) {
21732
21822
  throw new Error("Didn't expect to get here");
21733
21823
  }
21734
21824
 
21825
+ // build/output.youtube/info.js
21826
+ function info_default18(r) {
21827
+ const { validation: { Z } } = r;
21828
+ return defineRtmpOutputComponent(r, {
21829
+ identifier: "output.youtube",
21830
+ name: "YouTube Live",
21831
+ description: "Stream directly to YouTube Live using RTMP",
21832
+ configForm: {
21833
+ form: {
21834
+ streamKey: {
21835
+ help: "YouTube Stream Key",
21836
+ hint: {
21837
+ type: "text",
21838
+ validation: Z.string().min(1)
21839
+ }
21840
+ },
21841
+ notes: {
21842
+ help: "Additional notes about this component",
21843
+ hint: {
21844
+ type: "text",
21845
+ optional: true
21846
+ }
21847
+ }
21848
+ }
21849
+ }
21850
+ });
21851
+ }
21852
+
21735
21853
  // build/processor.audioEncoder/info.js
21736
21854
  var import_client_types2 = __toESM(require_client_types());
21737
21855
  var import_react13 = __toESM(require_react());
21738
- function info_default15({ defineComponent, Audio, validation: { Z } }) {
21856
+ function info_default19({ defineComponent, Audio, validation: { Z } }) {
21739
21857
  const format = (stat) => Math.floor(stat).toLocaleString("en-US", { maximumFractionDigits: 0 });
21740
21858
  const Hz = (v) => ({ display: `${format(v)}Hz`, value: v });
21741
21859
  return defineComponent({
@@ -21868,7 +21986,7 @@ var import_config4 = __toESM(require_config());
21868
21986
  var import_react15 = __toESM(require_react());
21869
21987
  var SummaryView10 = import_react15.default.lazy(async () => Promise.resolve().then(() => (init_summary_view7(), summary_view_exports7)));
21870
21988
  var InlineView12 = import_react15.default.lazy(async () => Promise.resolve().then(() => (init_inline_view9(), inline_view_exports9)));
21871
- function info_default16({ defineComponent, Video, validation: { Z } }) {
21989
+ function info_default20({ defineComponent, Video, validation: { Z } }) {
21872
21990
  return defineComponent({
21873
21991
  identifier: "processor.browserOverlay",
21874
21992
  category: "processor",
@@ -21930,7 +22048,7 @@ function assertUnreachable9(_) {
21930
22048
  }
21931
22049
 
21932
22050
  // build/processor.cascadingSwitch/info.js
21933
- function info_default17({ defineComponent, Av, React: React15, common: { Resolutions, FrameRates } }) {
22051
+ function info_default21({ defineComponent, Av, React: React15, common: { Resolutions, FrameRates } }) {
21934
22052
  const SourceSelection = React15.lazy(async () => Promise.resolve().then(() => (init_source_selection(), source_selection_exports)));
21935
22053
  const InlineView15 = React15.lazy(async () => Promise.resolve().then(() => (init_inline_view10(), inline_view_exports10)));
21936
22054
  return defineComponent({
@@ -22070,7 +22188,7 @@ function assertUnreachable10(_) {
22070
22188
  // build/processor.fixedLadder/info.js
22071
22189
  var import_react18 = __toESM(require_react());
22072
22190
  var import_config5 = __toESM(require_config());
22073
- function info_default18({ defineComponent, Video, common: { FrameRates } }) {
22191
+ function info_default22({ defineComponent, Video, common: { FrameRates } }) {
22074
22192
  const RungView = import_react18.default.lazy(async () => Promise.resolve().then(() => (init_rung_view(), rung_view_exports)));
22075
22193
  const CodecEditor3 = import_react18.default.lazy(async () => Promise.resolve().then(() => (init_codec_editor(), codec_editor_exports)));
22076
22194
  const CodecView = import_react18.default.lazy(async () => Promise.resolve().then(() => (init_codec_view(), codec_view_exports)));
@@ -22410,7 +22528,7 @@ function assertUnreachable11(_) {
22410
22528
  // build/processor.onscreenGraphic/info.js
22411
22529
  var import_config6 = __toESM(require_config());
22412
22530
  var import_react21 = __toESM(require_react());
22413
- function info_default19({ defineComponent, Video }) {
22531
+ function info_default23({ defineComponent, Video }) {
22414
22532
  const GraphicSelection2 = import_react21.default.lazy(async () => Promise.resolve().then(() => (init_image_selection(), image_selection_exports)));
22415
22533
  const SummaryView12 = import_react21.default.lazy(async () => Promise.resolve().then(() => (init_summary_view8(), summary_view_exports8)));
22416
22534
  return defineComponent({
@@ -22491,7 +22609,7 @@ function assertUnreachable13(_) {
22491
22609
  }
22492
22610
 
22493
22611
  // build/processor.streamKeyOverride/info.js
22494
- function info_default20({ defineComponent, All, validation: { Z } }) {
22612
+ function info_default24({ defineComponent, All, validation: { Z } }) {
22495
22613
  return defineComponent({
22496
22614
  identifier: "processor.streamKeyOverride",
22497
22615
  category: "processor",
@@ -22636,9 +22754,55 @@ function info_default20({ defineComponent, All, validation: { Z } }) {
22636
22754
  });
22637
22755
  }
22638
22756
 
22757
+ // build/processor.videoDecoder/info.js
22758
+ function info_default25({ defineComponent, Video }) {
22759
+ return defineComponent({
22760
+ identifier: "processor.videoDecoder",
22761
+ category: "processor",
22762
+ name: "Video Decoder",
22763
+ description: "Explicit video decode.",
22764
+ subscription: {
22765
+ accepts: {
22766
+ type: "single-stream",
22767
+ media: Video
22768
+ },
22769
+ produces: {
22770
+ type: "single-stream",
22771
+ media: Video
22772
+ }
22773
+ },
22774
+ display: ({ config }) => {
22775
+ const displayed = {
22776
+ acceleration: config.mode
22777
+ };
22778
+ return displayed;
22779
+ },
22780
+ extraValidation: (ctx) => {
22781
+ ctx.requireVideo(1);
22782
+ },
22783
+ configForm: {
22784
+ form: {
22785
+ mode: {
22786
+ help: "Acceleration",
22787
+ hint: {
22788
+ type: "select",
22789
+ defaultValue: "software",
22790
+ options: [
22791
+ { display: "Software", value: "software" },
22792
+ { display: "Quadra", value: "quadra" },
22793
+ { display: "Nvidia", value: "nvidia" }
22794
+ ]
22795
+ }
22796
+ },
22797
+ notes: { help: "Notes about this component", hint: { type: "text", optional: true } }
22798
+ }
22799
+ }
22800
+ });
22801
+ }
22802
+
22639
22803
  // build/util.stats.latency/info.js
22640
22804
  var import_react23 = __toESM(require_react());
22641
- function info_default21(R) {
22805
+ function info_default26(R) {
22642
22806
  const { defineComponent } = R;
22643
22807
  const InlineView15 = import_react23.default.lazy(async () => Promise.resolve().then(() => (init_inline_view11(), inline_view_exports11)));
22644
22808
  const SourceNodeSelection2 = import_react23.default.lazy(async () => Promise.resolve().then(() => (init_source_node_selection(), source_node_selection_exports)));
@@ -22750,10 +22914,10 @@ AllComponents.push((r) => info_default5(r));
22750
22914
  AllComponents.push((r) => info_default6(r));
22751
22915
  AllComponents.push((r) => info_default7(r));
22752
22916
  AllComponents.push((r) => info_default8(r));
22753
- AllComponents.push((r) => info_default9(r));
22754
22917
  AllComponents.push((r) => info_default10(r));
22755
22918
  AllComponents.push((r) => info_default11(r));
22756
22919
  AllComponents.push((r) => info_default12(r));
22920
+ AllComponents.push((r) => info_default9(r));
22757
22921
  AllComponents.push((r) => info_default13(r));
22758
22922
  AllComponents.push((r) => info_default14(r));
22759
22923
  AllComponents.push((r) => info_default15(r));
@@ -22763,6 +22927,11 @@ AllComponents.push((r) => info_default18(r));
22763
22927
  AllComponents.push((r) => info_default19(r));
22764
22928
  AllComponents.push((r) => info_default20(r));
22765
22929
  AllComponents.push((r) => info_default21(r));
22930
+ AllComponents.push((r) => info_default22(r));
22931
+ AllComponents.push((r) => info_default23(r));
22932
+ AllComponents.push((r) => info_default24(r));
22933
+ AllComponents.push((r) => info_default25(r));
22934
+ AllComponents.push((r) => info_default26(r));
22766
22935
  export {
22767
22936
  getNodeInfo as default
22768
22937
  };