@arcanewizards/timecode-toolbox 0.1.4 → 0.1.6

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,35 @@ var ArtnetOutputConnection = ({
14292
14311
  }
14293
14312
  if (timecodeState?.state === "playing" || timecodeState?.state === "lagging") {
14294
14313
  const tcState = timecodeState;
14295
- const interval = setInterval(() => {
14314
+ let transmit = true;
14315
+ let timeoutId = null;
14316
+ const sendNextFrame = () => {
14317
+ if (!transmit) {
14318
+ return;
14319
+ }
14296
14320
  const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14297
- artnetInstance.sendTimecode(mode, time);
14298
- }, 1e3 / TIMECODE_FPS[mode]);
14321
+ artnetInstance.sendTimecode(mode, time).then(({ nextFrameTimeMillis }) => {
14322
+ const delay = nextFrameTimeMillis - time + 1;
14323
+ timeoutId = setTimeout(sendNextFrame, delay);
14324
+ }).catch(() => {
14325
+ scheduleNextFrame();
14326
+ });
14327
+ };
14328
+ const scheduleNextFrame = () => {
14329
+ const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14330
+ const { nextFrameTimeMillis } = artnetInstance.getNextFrameTiming(
14331
+ mode,
14332
+ time
14333
+ );
14334
+ const delay = nextFrameTimeMillis - time + 1;
14335
+ timeoutId = setTimeout(sendNextFrame, delay);
14336
+ };
14337
+ scheduleNextFrame();
14299
14338
  return () => {
14300
- clearInterval(interval);
14339
+ transmit = false;
14340
+ if (timeoutId) {
14341
+ clearTimeout(timeoutId);
14342
+ }
14301
14343
  };
14302
14344
  } else if (timecodeState?.state === "stopped") {
14303
14345
  artnetInstance.sendTimecode(mode, timecodeState?.positionMillis ?? 0);
@@ -14551,6 +14593,8 @@ var ClockGenerator = ({
14551
14593
  timecode: {
14552
14594
  metadata: null,
14553
14595
  name: null,
14596
+ errors: [],
14597
+ warnings: [],
14554
14598
  state: {
14555
14599
  accuracyMillis: null,
14556
14600
  smpteMode: null,
@@ -14924,7 +14968,7 @@ var createApp = (props) => {
14924
14968
  };
14925
14969
 
14926
14970
  // package.json
14927
- var version = "0.1.4";
14971
+ var version = "0.1.6";
14928
14972
 
14929
14973
  // src/urls.ts
14930
14974
  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,35 @@ var ArtnetOutputConnection = ({
14315
14334
  }
14316
14335
  if (timecodeState?.state === "playing" || timecodeState?.state === "lagging") {
14317
14336
  const tcState = timecodeState;
14318
- const interval = setInterval(() => {
14337
+ let transmit = true;
14338
+ let timeoutId = null;
14339
+ const sendNextFrame = () => {
14340
+ if (!transmit) {
14341
+ return;
14342
+ }
14319
14343
  const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14320
- artnetInstance.sendTimecode(mode, time);
14321
- }, 1e3 / TIMECODE_FPS[mode]);
14344
+ artnetInstance.sendTimecode(mode, time).then(({ nextFrameTimeMillis }) => {
14345
+ const delay = nextFrameTimeMillis - time + 1;
14346
+ timeoutId = setTimeout(sendNextFrame, delay);
14347
+ }).catch(() => {
14348
+ scheduleNextFrame();
14349
+ });
14350
+ };
14351
+ const scheduleNextFrame = () => {
14352
+ const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14353
+ const { nextFrameTimeMillis } = artnetInstance.getNextFrameTiming(
14354
+ mode,
14355
+ time
14356
+ );
14357
+ const delay = nextFrameTimeMillis - time + 1;
14358
+ timeoutId = setTimeout(sendNextFrame, delay);
14359
+ };
14360
+ scheduleNextFrame();
14322
14361
  return () => {
14323
- clearInterval(interval);
14362
+ transmit = false;
14363
+ if (timeoutId) {
14364
+ clearTimeout(timeoutId);
14365
+ }
14324
14366
  };
14325
14367
  } else if (timecodeState?.state === "stopped") {
14326
14368
  artnetInstance.sendTimecode(mode, timecodeState?.positionMillis ?? 0);
@@ -14579,6 +14621,8 @@ var ClockGenerator = ({
14579
14621
  timecode: {
14580
14622
  metadata: null,
14581
14623
  name: null,
14624
+ errors: [],
14625
+ warnings: [],
14582
14626
  state: {
14583
14627
  accuracyMillis: null,
14584
14628
  smpteMode: null,
@@ -14952,7 +14996,7 @@ var createApp = (props) => {
14952
14996
  };
14953
14997
 
14954
14998
  // package.json
14955
- var version = "0.1.4";
14999
+ var version = "0.1.6";
14956
15000
 
14957
15001
  // src/urls.ts
14958
15002
  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,35 @@ var ArtnetOutputConnection = ({
14293
14312
  }
14294
14313
  if (timecodeState?.state === "playing" || timecodeState?.state === "lagging") {
14295
14314
  const tcState = timecodeState;
14296
- const interval = setInterval(() => {
14315
+ let transmit = true;
14316
+ let timeoutId = null;
14317
+ const sendNextFrame = () => {
14318
+ if (!transmit) {
14319
+ return;
14320
+ }
14297
14321
  const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14298
- artnetInstance.sendTimecode(mode, time);
14299
- }, 1e3 / TIMECODE_FPS[mode]);
14322
+ artnetInstance.sendTimecode(mode, time).then(({ nextFrameTimeMillis }) => {
14323
+ const delay = nextFrameTimeMillis - time + 1;
14324
+ timeoutId = setTimeout(sendNextFrame, delay);
14325
+ }).catch(() => {
14326
+ scheduleNextFrame();
14327
+ });
14328
+ };
14329
+ const scheduleNextFrame = () => {
14330
+ const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14331
+ const { nextFrameTimeMillis } = artnetInstance.getNextFrameTiming(
14332
+ mode,
14333
+ time
14334
+ );
14335
+ const delay = nextFrameTimeMillis - time + 1;
14336
+ timeoutId = setTimeout(sendNextFrame, delay);
14337
+ };
14338
+ scheduleNextFrame();
14300
14339
  return () => {
14301
- clearInterval(interval);
14340
+ transmit = false;
14341
+ if (timeoutId) {
14342
+ clearTimeout(timeoutId);
14343
+ }
14302
14344
  };
14303
14345
  } else if (timecodeState?.state === "stopped") {
14304
14346
  artnetInstance.sendTimecode(mode, timecodeState?.positionMillis ?? 0);
@@ -14552,6 +14594,8 @@ var ClockGenerator = ({
14552
14594
  timecode: {
14553
14595
  metadata: null,
14554
14596
  name: null,
14597
+ errors: [],
14598
+ warnings: [],
14555
14599
  state: {
14556
14600
  accuracyMillis: null,
14557
14601
  smpteMode: null,
@@ -14925,7 +14969,7 @@ var createApp = (props) => {
14925
14969
  };
14926
14970
 
14927
14971
  // package.json
14928
- var version = "0.1.4";
14972
+ var version = "0.1.6";
14929
14973
 
14930
14974
  // src/index.ts
14931
14975
  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,35 @@ var ArtnetOutputConnection = ({
14320
14339
  }
14321
14340
  if (timecodeState?.state === "playing" || timecodeState?.state === "lagging") {
14322
14341
  const tcState = timecodeState;
14323
- const interval = setInterval(() => {
14342
+ let transmit = true;
14343
+ let timeoutId = null;
14344
+ const sendNextFrame = () => {
14345
+ if (!transmit) {
14346
+ return;
14347
+ }
14324
14348
  const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14325
- artnetInstance.sendTimecode(mode, time);
14326
- }, 1e3 / TIMECODE_FPS[mode]);
14349
+ artnetInstance.sendTimecode(mode, time).then(({ nextFrameTimeMillis }) => {
14350
+ const delay = nextFrameTimeMillis - time + 1;
14351
+ timeoutId = setTimeout(sendNextFrame, delay);
14352
+ }).catch(() => {
14353
+ scheduleNextFrame();
14354
+ });
14355
+ };
14356
+ const scheduleNextFrame = () => {
14357
+ const time = (Date.now() - tcState.effectiveStartTimeMillis) * tcState.speed;
14358
+ const { nextFrameTimeMillis } = artnetInstance.getNextFrameTiming(
14359
+ mode,
14360
+ time
14361
+ );
14362
+ const delay = nextFrameTimeMillis - time + 1;
14363
+ timeoutId = setTimeout(sendNextFrame, delay);
14364
+ };
14365
+ scheduleNextFrame();
14327
14366
  return () => {
14328
- clearInterval(interval);
14367
+ transmit = false;
14368
+ if (timeoutId) {
14369
+ clearTimeout(timeoutId);
14370
+ }
14329
14371
  };
14330
14372
  } else if (timecodeState?.state === "stopped") {
14331
14373
  artnetInstance.sendTimecode(mode, timecodeState?.positionMillis ?? 0);
@@ -14584,6 +14626,8 @@ var ClockGenerator = ({
14584
14626
  timecode: {
14585
14627
  metadata: null,
14586
14628
  name: null,
14629
+ errors: [],
14630
+ warnings: [],
14587
14631
  state: {
14588
14632
  accuracyMillis: null,
14589
14633
  smpteMode: null,
@@ -14957,7 +15001,7 @@ var createApp = (props) => {
14957
15001
  };
14958
15002
 
14959
15003
  // package.json
14960
- var version = "0.1.4";
15004
+ var version = "0.1.6";
14961
15005
 
14962
15006
  // src/index.ts
14963
15007
  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.6",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -54,11 +54,11 @@
54
54
  "music-metadata": "^11.0.0",
55
55
  "osc-js": "^2.4.1",
56
56
  "radix-ui": "^1.4.3",
57
+ "@arcanewizards/artnet": "^0.1.4",
57
58
  "@arcanewizards/apis": "^0.0.1",
58
- "@arcanewizards/artnet": "^0.1.3",
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",