@remavideo/sdk 0.9.0 → 0.11.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.
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { readFile } from "fs/promises";
3
3
 
4
4
  // src/node.ts
5
+ import { TypedEmitter } from "tiny-typed-emitter";
5
6
  var NODE_STATES = /* @__PURE__ */ new Set([
6
7
  "READY",
7
8
  "ACTIVE",
@@ -9,24 +10,30 @@ var NODE_STATES = /* @__PURE__ */ new Set([
9
10
  "ERROR",
10
11
  "CLOSED"
11
12
  ]);
12
- function dispatchNodeCallbacks(evt, callbacks) {
13
+ function dispatchNodeCallbacks(node, evt, callbacks) {
13
14
  if (NODE_STATES.has(evt.kind)) {
14
- callbacks.onStatusChange?.(evt.kind, evt.message);
15
+ const state = evt.kind;
16
+ callbacks.onStatusChange?.(state, evt.message);
17
+ node.emit("statusChange", state, evt.message);
15
18
  }
16
19
  if (evt.kind === "ERROR") {
17
- callbacks.onError?.(new Error(evt.message ?? "node error"));
20
+ const err = new Error(evt.message ?? "node error");
21
+ callbacks.onError?.(err);
22
+ node.emit("error", err);
18
23
  }
19
24
  if (evt.kind === "CLOSED") {
20
25
  callbacks.onClose?.();
26
+ node.emit("close");
21
27
  }
22
28
  }
23
- var BaseNode = class _BaseNode {
29
+ var BaseNode = class _BaseNode extends TypedEmitter {
24
30
  nodeId;
25
31
  workflowId;
26
32
  client;
27
33
  _eventCleanup = null;
28
34
  _callbacks = {};
29
35
  constructor(nodeId, client, workflowId) {
36
+ super();
30
37
  this.nodeId = nodeId;
31
38
  this.workflowId = workflowId;
32
39
  this.client = client;
@@ -133,6 +140,7 @@ var BaseNode = class _BaseNode {
133
140
  nodeId: this.nodeId
134
141
  });
135
142
  this._callbacks.onClose?.();
143
+ this.emit("close");
136
144
  }
137
145
  };
138
146
 
@@ -196,7 +204,7 @@ async function createCaptionSourceNode(workflow, settings = {}, nodeId) {
196
204
  const node = new CaptionSourceNode(id, workflow, settings);
197
205
  node._bindCallbacks(settings);
198
206
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
199
- dispatchNodeCallbacks(evt, settings);
207
+ dispatchNodeCallbacks(node, evt, settings);
200
208
  });
201
209
  node._setEventCleanup(removeHandler);
202
210
  await workflow.client.trpc.createNode.mutate({
@@ -244,7 +252,7 @@ async function createFileInputNode(workflow, settings, nodeId) {
244
252
  if (evt.kind === "ACTIVE" && evt.message !== void 0)
245
253
  settings.onStreamStart?.(Number(evt.message));
246
254
  if (evt.kind === "ENDED") settings.onEnded?.();
247
- dispatchNodeCallbacks(evt, settings);
255
+ dispatchNodeCallbacks(node, evt, settings);
248
256
  });
249
257
  node._setEventCleanup(removeHandler);
250
258
  await workflow.client.trpc.createNode.mutate({
@@ -329,7 +337,7 @@ async function createNodeStreamInputNode(workflow, settings, nodeId) {
329
337
  if (evt.kind === "ACTIVE" && evt.message !== void 0)
330
338
  settings.onStreamStart?.(Number(evt.message));
331
339
  if (evt.kind === "ENDED") settings.onEnded?.();
332
- dispatchNodeCallbacks(evt, settings);
340
+ dispatchNodeCallbacks(node, evt, settings);
333
341
  });
334
342
  node._setEventCleanup(removeHandler);
335
343
  await workflow.client.trpc.createNode.mutate({
@@ -387,7 +395,7 @@ async function createRtmpAnnouncerNode(workflow, settings, nodeId) {
387
395
  const info = JSON.parse(evt.message);
388
396
  settings.onDisconnect?.(info);
389
397
  }
390
- dispatchNodeCallbacks(evt, settings);
398
+ dispatchNodeCallbacks(node, evt, settings);
391
399
  });
392
400
  node._setEventCleanup(removeHandler);
393
401
  await workflow.client.trpc.createNode.mutate({
@@ -426,7 +434,7 @@ async function createRtmpMultiplexerNode(workflow, settings, nodeId) {
426
434
  const activeStreams = /* @__PURE__ */ new Map();
427
435
  node._bindCallbacks(settings);
428
436
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
429
- dispatchNodeCallbacks(evt, settings);
437
+ dispatchNodeCallbacks(node, evt, settings);
430
438
  if (evt.kind === "CHILD_CREATED" && evt.message !== void 0) {
431
439
  const { childNodeId, sourceName } = JSON.parse(evt.message);
432
440
  Promise.resolve(settings.onConnect?.({ app, sourceName })).then(async (result) => {
@@ -504,7 +512,7 @@ async function createRtmpReaderNode(workflow, settings, nodeId) {
504
512
  settings.onStreamStart?.(Number(evt.message));
505
513
  }
506
514
  if (evt.kind === "ENDED") settings.onStreamEnded?.();
507
- dispatchNodeCallbacks(evt, settings);
515
+ dispatchNodeCallbacks(node, evt, settings);
508
516
  });
509
517
  node._setEventCleanup(removeHandler);
510
518
  await workflow.client.trpc.createNode.mutate({
@@ -552,7 +560,7 @@ async function createSrtAnnouncerNode(workflow, settings, nodeId) {
552
560
  const info = JSON.parse(evt.message);
553
561
  settings.onDisconnect?.(info);
554
562
  }
555
- dispatchNodeCallbacks(evt, settings);
563
+ dispatchNodeCallbacks(node, evt, settings);
556
564
  });
557
565
  node._setEventCleanup(removeHandler);
558
566
  await workflow.client.trpc.createNode.mutate({
@@ -599,7 +607,7 @@ async function createSrtReaderNode(workflow, settings, nodeId) {
599
607
  settings.onStreamStart?.(Number(evt.message));
600
608
  }
601
609
  if (evt.kind === "ENDED") settings.onStreamEnded?.();
602
- dispatchNodeCallbacks(evt, settings);
610
+ dispatchNodeCallbacks(node, evt, settings);
603
611
  });
604
612
  node._setEventCleanup(removeHandler);
605
613
  await workflow.client.trpc.createNode.mutate({
@@ -628,7 +636,7 @@ async function createFileOutputNode(workflow, settings, nodeId) {
628
636
  const node = new FileOutputNode(id, workflow, settings);
629
637
  node._bindCallbacks(settings);
630
638
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
631
- dispatchNodeCallbacks(evt, settings);
639
+ dispatchNodeCallbacks(node, evt, settings);
632
640
  });
633
641
  node._setEventCleanup(removeHandler);
634
642
  await workflow.client.trpc.createNode.mutate({
@@ -674,7 +682,7 @@ async function createHlsOutputNode(workflow, settings, nodeId) {
674
682
  const node = new HlsOutputNode(id, workflow, settings);
675
683
  node._bindCallbacks(settings);
676
684
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
677
- dispatchNodeCallbacks(evt, settings);
685
+ dispatchNodeCallbacks(node, evt, settings);
678
686
  });
679
687
  node._setEventCleanup(removeHandler);
680
688
  await workflow.client.trpc.createNode.mutate({
@@ -709,7 +717,7 @@ async function createRtmpOutputNode(workflow, settings, nodeId) {
709
717
  const node = new RtmpOutputNode(id, workflow, settings);
710
718
  node._bindCallbacks(settings);
711
719
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
712
- dispatchNodeCallbacks(evt, settings);
720
+ dispatchNodeCallbacks(node, evt, settings);
713
721
  });
714
722
  node._setEventCleanup(removeHandler);
715
723
  await workflow.client.trpc.createNode.mutate({
@@ -738,7 +746,7 @@ async function createSrtOutputNode(workflow, settings, nodeId) {
738
746
  const node = new SrtOutputNode(id, workflow, settings);
739
747
  node._bindCallbacks(settings);
740
748
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
741
- dispatchNodeCallbacks(evt, settings);
749
+ dispatchNodeCallbacks(node, evt, settings);
742
750
  });
743
751
  node._setEventCleanup(removeHandler);
744
752
  await workflow.client.trpc.createNode.mutate({
@@ -767,7 +775,7 @@ async function createBufferNode(workflow, settings, nodeId) {
767
775
  const node = new BufferNode(id, workflow, settings);
768
776
  node._bindCallbacks(settings);
769
777
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
770
- dispatchNodeCallbacks(evt, settings);
778
+ dispatchNodeCallbacks(node, evt, settings);
771
779
  });
772
780
  node._setEventCleanup(removeHandler);
773
781
  await workflow.client.trpc.createNode.mutate({
@@ -796,7 +804,7 @@ async function createCambAiTranslateNode(workflow, settings, nodeId) {
796
804
  const node = new CambAiTranslateNode(id, workflow, settings);
797
805
  node._bindCallbacks(settings);
798
806
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
799
- dispatchNodeCallbacks(evt, settings);
807
+ dispatchNodeCallbacks(node, evt, settings);
800
808
  });
801
809
  node._setEventCleanup(removeHandler);
802
810
  await workflow.client.trpc.createNode.mutate({
@@ -832,7 +840,7 @@ async function createCea608EncoderNode(workflow, settings = {}, nodeId) {
832
840
  const node = new Cea608EncoderNode(id, workflow, settings);
833
841
  node._bindCallbacks(settings);
834
842
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
835
- dispatchNodeCallbacks(evt, settings);
843
+ dispatchNodeCallbacks(node, evt, settings);
836
844
  });
837
845
  node._setEventCleanup(removeHandler);
838
846
  await workflow.client.trpc.createNode.mutate({
@@ -882,7 +890,7 @@ async function createFfprobeMonitorNode(workflow, settings = {}, nodeId) {
882
890
  const node = new FfprobeMonitorNode(id, workflow, settings);
883
891
  node._bindCallbacks(settings);
884
892
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
885
- dispatchNodeCallbacks(evt, settings);
893
+ dispatchNodeCallbacks(node, evt, settings);
886
894
  });
887
895
  node._setEventCleanup(removeHandler);
888
896
  await workflow.client.trpc.createNode.mutate({
@@ -914,7 +922,7 @@ async function createGateNode(workflow, settings = {}, nodeId) {
914
922
  const node = new GateNode(id, workflow, settings);
915
923
  node._bindCallbacks(settings);
916
924
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
917
- dispatchNodeCallbacks(evt, settings);
925
+ dispatchNodeCallbacks(node, evt, settings);
918
926
  });
919
927
  node._setEventCleanup(removeHandler);
920
928
  await workflow.client.trpc.createNode.mutate({
@@ -950,7 +958,7 @@ async function createGeminiTranslateNode(workflow, settings, nodeId) {
950
958
  const node = new GeminiTranslateNode(id, workflow, settings);
951
959
  node._bindCallbacks(settings);
952
960
  const removeHandler = workflow._onNodeEvent(id, (evt) => {
953
- dispatchNodeCallbacks(evt, settings);
961
+ dispatchNodeCallbacks(node, evt, settings);
954
962
  });
955
963
  node._setEventCleanup(removeHandler);
956
964
  await workflow.client.trpc.createNode.mutate({
@@ -1031,7 +1039,8 @@ var RemaClient = class _RemaClient {
1031
1039
  };
1032
1040
 
1033
1041
  // src/workflow.ts
1034
- var Workflow = class {
1042
+ import { TypedEmitter as TypedEmitter2 } from "tiny-typed-emitter";
1043
+ var Workflow = class extends TypedEmitter2 {
1035
1044
  workflowId;
1036
1045
  /** Non-private: accessible to factory functions via WorkflowHandle. */
1037
1046
  client;
@@ -1044,6 +1053,7 @@ var Workflow = class {
1044
1053
  _closedFired = false;
1045
1054
  /** @internal — use `rema.workflow.create()` instead */
1046
1055
  constructor(workflowId, client, callbacks = {}) {
1056
+ super();
1047
1057
  this.workflowId = workflowId;
1048
1058
  this.client = client;
1049
1059
  this._callbacks = callbacks;
@@ -1098,7 +1108,9 @@ var Workflow = class {
1098
1108
  this._seenInList = true;
1099
1109
  if (entry.status === "crashed" && !this._erroredFired) {
1100
1110
  this._erroredFired = true;
1101
- this._callbacks.onError?.(new Error("workflow worker crashed"));
1111
+ const err = new Error("workflow worker crashed");
1112
+ this._callbacks.onError?.(err);
1113
+ this.emit("error", err);
1102
1114
  }
1103
1115
  return;
1104
1116
  }
@@ -1114,6 +1126,7 @@ var Workflow = class {
1114
1126
  this._closedFired = true;
1115
1127
  this._stateSub?.unsubscribe();
1116
1128
  this._callbacks.onClose?.();
1129
+ this.emit("close");
1117
1130
  }
1118
1131
  // ─── Input nodes ─────────────────────────────────────────────────────────
1119
1132
  input = {
@@ -1199,6 +1212,7 @@ var Workflow = class {
1199
1212
  if (!this._closedFired) {
1200
1213
  this._closedFired = true;
1201
1214
  this._callbacks.onClose?.();
1215
+ this.emit("close");
1202
1216
  }
1203
1217
  }
1204
1218
  };