@arcanewizards/timecode-toolbox 0.1.4 → 0.1.5

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
@@ -6832,9 +6832,27 @@ var createArtnet = (config) => {
6832
6832
  })();
6833
6833
  return connectPromise;
6834
6834
  };
6835
+ const getNextFrameTiming = (mode, timeMillis) => {
6836
+ const timecode = getTimecodeFromMillis(mode, timeMillis);
6837
+ timecode.frame += 1;
6838
+ if (timecode.frame >= TIMECODE_FPS[mode]) {
6839
+ timecode.frame = 0;
6840
+ timecode.seconds += 1;
6841
+ if (timecode.seconds >= 60) {
6842
+ timecode.seconds = 0;
6843
+ timecode.minutes += 1;
6844
+ if (timecode.minutes >= 60) {
6845
+ timecode.minutes = 0;
6846
+ timecode.hours += 1;
6847
+ }
6848
+ }
6849
+ }
6850
+ const nextFrameTimeMillis = getTimeMillisFromTimecode(timecode);
6851
+ return { nextFrameTimeMillis };
6852
+ };
6835
6853
  const sendTimecode = (mode, timeMillis) => {
6836
6854
  if (timeMillis < 0) {
6837
- return Promise.resolve();
6855
+ return Promise.resolve(getNextFrameTiming(mode, timeMillis));
6838
6856
  }
6839
6857
  if (!sendSocket) {
6840
6858
  return Promise.reject(new Error("ArtNet connection has not been opened"));
@@ -6875,7 +6893,7 @@ var createArtnet = (config) => {
6875
6893
  events.emit("error", error);
6876
6894
  reject(error);
6877
6895
  } else {
6878
- resolve();
6896
+ resolve(getNextFrameTiming(mode, timeMillis));
6879
6897
  }
6880
6898
  }
6881
6899
  )
@@ -6888,6 +6906,7 @@ var createArtnet = (config) => {
6888
6906
  };
6889
6907
  return {
6890
6908
  connect,
6909
+ getNextFrameTiming,
6891
6910
  sendTimecode,
6892
6911
  on,
6893
6912
  addListener,
@@ -6968,7 +6987,7 @@ var ArtnetInputConnection = ({
6968
6987
  created.connect().then(() => {
6969
6988
  artnet = created;
6970
6989
  setArtnetInstance(created);
6971
- log.info("ArtNet Timecode output initialized");
6990
+ log.info("ArtNet Timecode input initialized");
6972
6991
  setConnection({ ...connectionConfig, status: "active" });
6973
6992
  }).catch((err) => {
6974
6993
  const error = new Error("Failed to start ArtNet Timecode output");
@@ -14292,12 +14311,30 @@ var ArtnetOutputConnection = ({
14292
14311
  }
14293
14312
  if (timecodeState?.state === "playing" || timecodeState?.state === "lagging") {
14294
14313
  const tcState = timecodeState;
14295
- const interval = setInterval(() => {
14314
+ let timeoutId = null;
14315
+ const sendNextFrame = () => {
14316
+ const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14317
+ artnetInstance.sendTimecode(mode, time).then(({ nextFrameTimeMillis }) => {
14318
+ const delay = nextFrameTimeMillis - time + 1;
14319
+ timeoutId = setTimeout(sendNextFrame, delay);
14320
+ }).catch(() => {
14321
+ scheduleNextFrame();
14322
+ });
14323
+ };
14324
+ const scheduleNextFrame = () => {
14296
14325
  const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14297
- artnetInstance.sendTimecode(mode, time);
14298
- }, 1e3 / TIMECODE_FPS[mode]);
14326
+ const { nextFrameTimeMillis } = artnetInstance.getNextFrameTiming(
14327
+ mode,
14328
+ time
14329
+ );
14330
+ const delay = nextFrameTimeMillis - time + 1;
14331
+ timeoutId = setTimeout(sendNextFrame, delay);
14332
+ };
14333
+ scheduleNextFrame();
14299
14334
  return () => {
14300
- clearInterval(interval);
14335
+ if (timeoutId) {
14336
+ clearTimeout(timeoutId);
14337
+ }
14301
14338
  };
14302
14339
  } else if (timecodeState?.state === "stopped") {
14303
14340
  artnetInstance.sendTimecode(mode, timecodeState?.positionMillis ?? 0);
@@ -14551,6 +14588,8 @@ var ClockGenerator = ({
14551
14588
  timecode: {
14552
14589
  metadata: null,
14553
14590
  name: null,
14591
+ errors: [],
14592
+ warnings: [],
14554
14593
  state: {
14555
14594
  accuracyMillis: null,
14556
14595
  smpteMode: null,
@@ -14924,7 +14963,7 @@ var createApp = (props) => {
14924
14963
  };
14925
14964
 
14926
14965
  // package.json
14927
- var version = "0.1.4";
14966
+ var version = "0.1.5";
14928
14967
 
14929
14968
  // src/urls.ts
14930
14969
  var urls_exports = {};
package/dist/index.mjs CHANGED
@@ -6844,9 +6844,27 @@ var createArtnet = (config) => {
6844
6844
  })();
6845
6845
  return connectPromise;
6846
6846
  };
6847
+ const getNextFrameTiming = (mode, timeMillis) => {
6848
+ const timecode = getTimecodeFromMillis(mode, timeMillis);
6849
+ timecode.frame += 1;
6850
+ if (timecode.frame >= TIMECODE_FPS[mode]) {
6851
+ timecode.frame = 0;
6852
+ timecode.seconds += 1;
6853
+ if (timecode.seconds >= 60) {
6854
+ timecode.seconds = 0;
6855
+ timecode.minutes += 1;
6856
+ if (timecode.minutes >= 60) {
6857
+ timecode.minutes = 0;
6858
+ timecode.hours += 1;
6859
+ }
6860
+ }
6861
+ }
6862
+ const nextFrameTimeMillis = getTimeMillisFromTimecode(timecode);
6863
+ return { nextFrameTimeMillis };
6864
+ };
6847
6865
  const sendTimecode = (mode, timeMillis) => {
6848
6866
  if (timeMillis < 0) {
6849
- return Promise.resolve();
6867
+ return Promise.resolve(getNextFrameTiming(mode, timeMillis));
6850
6868
  }
6851
6869
  if (!sendSocket) {
6852
6870
  return Promise.reject(new Error("ArtNet connection has not been opened"));
@@ -6887,7 +6905,7 @@ var createArtnet = (config) => {
6887
6905
  events.emit("error", error);
6888
6906
  reject(error);
6889
6907
  } else {
6890
- resolve();
6908
+ resolve(getNextFrameTiming(mode, timeMillis));
6891
6909
  }
6892
6910
  }
6893
6911
  )
@@ -6900,6 +6918,7 @@ var createArtnet = (config) => {
6900
6918
  };
6901
6919
  return {
6902
6920
  connect,
6921
+ getNextFrameTiming,
6903
6922
  sendTimecode,
6904
6923
  on,
6905
6924
  addListener,
@@ -6980,7 +6999,7 @@ var ArtnetInputConnection = ({
6980
6999
  created.connect().then(() => {
6981
7000
  artnet = created;
6982
7001
  setArtnetInstance(created);
6983
- log.info("ArtNet Timecode output initialized");
7002
+ log.info("ArtNet Timecode input initialized");
6984
7003
  setConnection({ ...connectionConfig, status: "active" });
6985
7004
  }).catch((err) => {
6986
7005
  const error = new Error("Failed to start ArtNet Timecode output");
@@ -14315,12 +14334,30 @@ var ArtnetOutputConnection = ({
14315
14334
  }
14316
14335
  if (timecodeState?.state === "playing" || timecodeState?.state === "lagging") {
14317
14336
  const tcState = timecodeState;
14318
- const interval = setInterval(() => {
14337
+ let timeoutId = null;
14338
+ const sendNextFrame = () => {
14339
+ const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14340
+ artnetInstance.sendTimecode(mode, time).then(({ nextFrameTimeMillis }) => {
14341
+ const delay = nextFrameTimeMillis - time + 1;
14342
+ timeoutId = setTimeout(sendNextFrame, delay);
14343
+ }).catch(() => {
14344
+ scheduleNextFrame();
14345
+ });
14346
+ };
14347
+ const scheduleNextFrame = () => {
14319
14348
  const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14320
- artnetInstance.sendTimecode(mode, time);
14321
- }, 1e3 / TIMECODE_FPS[mode]);
14349
+ const { nextFrameTimeMillis } = artnetInstance.getNextFrameTiming(
14350
+ mode,
14351
+ time
14352
+ );
14353
+ const delay = nextFrameTimeMillis - time + 1;
14354
+ timeoutId = setTimeout(sendNextFrame, delay);
14355
+ };
14356
+ scheduleNextFrame();
14322
14357
  return () => {
14323
- clearInterval(interval);
14358
+ if (timeoutId) {
14359
+ clearTimeout(timeoutId);
14360
+ }
14324
14361
  };
14325
14362
  } else if (timecodeState?.state === "stopped") {
14326
14363
  artnetInstance.sendTimecode(mode, timecodeState?.positionMillis ?? 0);
@@ -14579,6 +14616,8 @@ var ClockGenerator = ({
14579
14616
  timecode: {
14580
14617
  metadata: null,
14581
14618
  name: null,
14619
+ errors: [],
14620
+ warnings: [],
14582
14621
  state: {
14583
14622
  accuracyMillis: null,
14584
14623
  smpteMode: null,
@@ -14952,7 +14991,7 @@ var createApp = (props) => {
14952
14991
  };
14953
14992
 
14954
14993
  // package.json
14955
- var version = "0.1.4";
14994
+ var version = "0.1.5";
14956
14995
 
14957
14996
  // src/urls.ts
14958
14997
  var urls_exports = {};
package/dist/start.js CHANGED
@@ -6833,9 +6833,27 @@ var createArtnet = (config) => {
6833
6833
  })();
6834
6834
  return connectPromise;
6835
6835
  };
6836
+ const getNextFrameTiming = (mode, timeMillis) => {
6837
+ const timecode = getTimecodeFromMillis(mode, timeMillis);
6838
+ timecode.frame += 1;
6839
+ if (timecode.frame >= TIMECODE_FPS[mode]) {
6840
+ timecode.frame = 0;
6841
+ timecode.seconds += 1;
6842
+ if (timecode.seconds >= 60) {
6843
+ timecode.seconds = 0;
6844
+ timecode.minutes += 1;
6845
+ if (timecode.minutes >= 60) {
6846
+ timecode.minutes = 0;
6847
+ timecode.hours += 1;
6848
+ }
6849
+ }
6850
+ }
6851
+ const nextFrameTimeMillis = getTimeMillisFromTimecode(timecode);
6852
+ return { nextFrameTimeMillis };
6853
+ };
6836
6854
  const sendTimecode = (mode, timeMillis) => {
6837
6855
  if (timeMillis < 0) {
6838
- return Promise.resolve();
6856
+ return Promise.resolve(getNextFrameTiming(mode, timeMillis));
6839
6857
  }
6840
6858
  if (!sendSocket) {
6841
6859
  return Promise.reject(new Error("ArtNet connection has not been opened"));
@@ -6876,7 +6894,7 @@ var createArtnet = (config) => {
6876
6894
  events.emit("error", error);
6877
6895
  reject(error);
6878
6896
  } else {
6879
- resolve();
6897
+ resolve(getNextFrameTiming(mode, timeMillis));
6880
6898
  }
6881
6899
  }
6882
6900
  )
@@ -6889,6 +6907,7 @@ var createArtnet = (config) => {
6889
6907
  };
6890
6908
  return {
6891
6909
  connect,
6910
+ getNextFrameTiming,
6892
6911
  sendTimecode,
6893
6912
  on,
6894
6913
  addListener,
@@ -6969,7 +6988,7 @@ var ArtnetInputConnection = ({
6969
6988
  created.connect().then(() => {
6970
6989
  artnet = created;
6971
6990
  setArtnetInstance(created);
6972
- log.info("ArtNet Timecode output initialized");
6991
+ log.info("ArtNet Timecode input initialized");
6973
6992
  setConnection({ ...connectionConfig, status: "active" });
6974
6993
  }).catch((err) => {
6975
6994
  const error = new Error("Failed to start ArtNet Timecode output");
@@ -14293,12 +14312,30 @@ var ArtnetOutputConnection = ({
14293
14312
  }
14294
14313
  if (timecodeState?.state === "playing" || timecodeState?.state === "lagging") {
14295
14314
  const tcState = timecodeState;
14296
- const interval = setInterval(() => {
14315
+ let timeoutId = null;
14316
+ const sendNextFrame = () => {
14317
+ const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14318
+ artnetInstance.sendTimecode(mode, time).then(({ nextFrameTimeMillis }) => {
14319
+ const delay = nextFrameTimeMillis - time + 1;
14320
+ timeoutId = setTimeout(sendNextFrame, delay);
14321
+ }).catch(() => {
14322
+ scheduleNextFrame();
14323
+ });
14324
+ };
14325
+ const scheduleNextFrame = () => {
14297
14326
  const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14298
- artnetInstance.sendTimecode(mode, time);
14299
- }, 1e3 / TIMECODE_FPS[mode]);
14327
+ const { nextFrameTimeMillis } = artnetInstance.getNextFrameTiming(
14328
+ mode,
14329
+ time
14330
+ );
14331
+ const delay = nextFrameTimeMillis - time + 1;
14332
+ timeoutId = setTimeout(sendNextFrame, delay);
14333
+ };
14334
+ scheduleNextFrame();
14300
14335
  return () => {
14301
- clearInterval(interval);
14336
+ if (timeoutId) {
14337
+ clearTimeout(timeoutId);
14338
+ }
14302
14339
  };
14303
14340
  } else if (timecodeState?.state === "stopped") {
14304
14341
  artnetInstance.sendTimecode(mode, timecodeState?.positionMillis ?? 0);
@@ -14552,6 +14589,8 @@ var ClockGenerator = ({
14552
14589
  timecode: {
14553
14590
  metadata: null,
14554
14591
  name: null,
14592
+ errors: [],
14593
+ warnings: [],
14555
14594
  state: {
14556
14595
  accuracyMillis: null,
14557
14596
  smpteMode: null,
@@ -14925,7 +14964,7 @@ var createApp = (props) => {
14925
14964
  };
14926
14965
 
14927
14966
  // package.json
14928
- var version = "0.1.4";
14967
+ var version = "0.1.5";
14929
14968
 
14930
14969
  // src/index.ts
14931
14970
  var runTimecodeToolboxServer = ({
package/dist/start.mjs CHANGED
@@ -6849,9 +6849,27 @@ var createArtnet = (config) => {
6849
6849
  })();
6850
6850
  return connectPromise;
6851
6851
  };
6852
+ const getNextFrameTiming = (mode, timeMillis) => {
6853
+ const timecode = getTimecodeFromMillis(mode, timeMillis);
6854
+ timecode.frame += 1;
6855
+ if (timecode.frame >= TIMECODE_FPS[mode]) {
6856
+ timecode.frame = 0;
6857
+ timecode.seconds += 1;
6858
+ if (timecode.seconds >= 60) {
6859
+ timecode.seconds = 0;
6860
+ timecode.minutes += 1;
6861
+ if (timecode.minutes >= 60) {
6862
+ timecode.minutes = 0;
6863
+ timecode.hours += 1;
6864
+ }
6865
+ }
6866
+ }
6867
+ const nextFrameTimeMillis = getTimeMillisFromTimecode(timecode);
6868
+ return { nextFrameTimeMillis };
6869
+ };
6852
6870
  const sendTimecode = (mode, timeMillis) => {
6853
6871
  if (timeMillis < 0) {
6854
- return Promise.resolve();
6872
+ return Promise.resolve(getNextFrameTiming(mode, timeMillis));
6855
6873
  }
6856
6874
  if (!sendSocket) {
6857
6875
  return Promise.reject(new Error("ArtNet connection has not been opened"));
@@ -6892,7 +6910,7 @@ var createArtnet = (config) => {
6892
6910
  events.emit("error", error);
6893
6911
  reject(error);
6894
6912
  } else {
6895
- resolve();
6913
+ resolve(getNextFrameTiming(mode, timeMillis));
6896
6914
  }
6897
6915
  }
6898
6916
  )
@@ -6905,6 +6923,7 @@ var createArtnet = (config) => {
6905
6923
  };
6906
6924
  return {
6907
6925
  connect,
6926
+ getNextFrameTiming,
6908
6927
  sendTimecode,
6909
6928
  on,
6910
6929
  addListener,
@@ -6985,7 +7004,7 @@ var ArtnetInputConnection = ({
6985
7004
  created.connect().then(() => {
6986
7005
  artnet = created;
6987
7006
  setArtnetInstance(created);
6988
- log.info("ArtNet Timecode output initialized");
7007
+ log.info("ArtNet Timecode input initialized");
6989
7008
  setConnection({ ...connectionConfig, status: "active" });
6990
7009
  }).catch((err) => {
6991
7010
  const error = new Error("Failed to start ArtNet Timecode output");
@@ -14320,12 +14339,30 @@ var ArtnetOutputConnection = ({
14320
14339
  }
14321
14340
  if (timecodeState?.state === "playing" || timecodeState?.state === "lagging") {
14322
14341
  const tcState = timecodeState;
14323
- const interval = setInterval(() => {
14342
+ let timeoutId = null;
14343
+ const sendNextFrame = () => {
14344
+ const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14345
+ artnetInstance.sendTimecode(mode, time).then(({ nextFrameTimeMillis }) => {
14346
+ const delay = nextFrameTimeMillis - time + 1;
14347
+ timeoutId = setTimeout(sendNextFrame, delay);
14348
+ }).catch(() => {
14349
+ scheduleNextFrame();
14350
+ });
14351
+ };
14352
+ const scheduleNextFrame = () => {
14324
14353
  const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14325
- artnetInstance.sendTimecode(mode, time);
14326
- }, 1e3 / TIMECODE_FPS[mode]);
14354
+ const { nextFrameTimeMillis } = artnetInstance.getNextFrameTiming(
14355
+ mode,
14356
+ time
14357
+ );
14358
+ const delay = nextFrameTimeMillis - time + 1;
14359
+ timeoutId = setTimeout(sendNextFrame, delay);
14360
+ };
14361
+ scheduleNextFrame();
14327
14362
  return () => {
14328
- clearInterval(interval);
14363
+ if (timeoutId) {
14364
+ clearTimeout(timeoutId);
14365
+ }
14329
14366
  };
14330
14367
  } else if (timecodeState?.state === "stopped") {
14331
14368
  artnetInstance.sendTimecode(mode, timecodeState?.positionMillis ?? 0);
@@ -14584,6 +14621,8 @@ var ClockGenerator = ({
14584
14621
  timecode: {
14585
14622
  metadata: null,
14586
14623
  name: null,
14624
+ errors: [],
14625
+ warnings: [],
14587
14626
  state: {
14588
14627
  accuracyMillis: null,
14589
14628
  smpteMode: null,
@@ -14957,7 +14996,7 @@ var createApp = (props) => {
14957
14996
  };
14958
14997
 
14959
14998
  // package.json
14960
- var version = "0.1.4";
14999
+ var version = "0.1.5";
14961
15000
 
14962
15001
  // src/index.ts
14963
15002
  var runTimecodeToolboxServer = ({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcanewizards/timecode-toolbox",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -55,10 +55,10 @@
55
55
  "osc-js": "^2.4.1",
56
56
  "radix-ui": "^1.4.3",
57
57
  "@arcanewizards/apis": "^0.0.1",
58
- "@arcanewizards/artnet": "^0.1.3",
58
+ "@arcanewizards/artnet": "^0.1.4",
59
59
  "@arcanewizards/eslint-config": "^0.0.0",
60
60
  "@arcanewizards/net-utils": "^0.1.3",
61
- "@arcanewizards/sigil": "^0.1.6",
61
+ "@arcanewizards/sigil": "^0.1.7",
62
62
  "@arcanewizards/tcnet": "^0.1.3",
63
63
  "@arcanewizards/typescript-config": "^0.0.0"
64
64
  },
@@ -70,10 +70,11 @@
70
70
  "react": "^19.2.0"
71
71
  },
72
72
  "scripts": {
73
- "build": "pnpm check:types && rm -rf dist && cp ../../LICENSE ./LICENSE && tsup && pnpm build:entrypoint && pnpm build:frontend && pnpm build:styles && check-export-map",
73
+ "build": "pnpm check:types && pnpm clean && cp ../../LICENSE ./LICENSE && tsup && pnpm build:entrypoint && pnpm build:frontend && pnpm build:styles && check-export-map",
74
74
  "build:entrypoint": "arcane-build-frontend --entry src/components/frontend/entrypoint.ts --outfile dist/entrypoint.js --sourcemap",
75
75
  "build:frontend": "arcane-build-frontend --entry src/components/frontend/index.tsx --outfile dist/frontend.js --sourcemap",
76
76
  "build:styles": "tailwindcss -i ./src/components/frontend/frontend.css -o ./dist/entrypoint.css",
77
+ "clean": "rm -rf dist",
77
78
  "check:types": "tsc --noEmit",
78
79
  "format:fix": "cd .. && pnpm format:fix",
79
80
  "lint": "eslint . --max-warnings 0",