@ghostlytools/cli 1.3.0 → 1.3.1

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 (80) hide show
  1. package/README.md +9 -3
  2. package/dist/assets/{api-CrxVxtY1.js → api-Dq2QXQDk.js} +141 -40
  3. package/dist/assets/api-Dq2QXQDk.js.map +1 -0
  4. package/dist/assets/{api-BiaX6l6f.js → api-TiB5QSG9.js} +2 -2
  5. package/dist/assets/{apiKit-CajiDxdK.js → apiKit-CA2x5GJF.js} +7 -3
  6. package/dist/assets/apiKit-CA2x5GJF.js.map +1 -0
  7. package/dist/assets/{apps-CbfiCSIw.js → apps-BxV9i_Y4.js} +3 -4
  8. package/dist/assets/{apps-CbfiCSIw.js.map → apps-BxV9i_Y4.js.map} +1 -1
  9. package/dist/assets/{apps-t23gkc28.js → apps-C-T8jeji.js} +1 -1
  10. package/dist/assets/{arkade-D4BVJFEQ.js → arkade-C_qDmHnm.js} +2 -2
  11. package/dist/assets/{arkade-D4BVJFEQ.js.map → arkade-C_qDmHnm.js.map} +1 -1
  12. package/dist/assets/{backup-Cg52WeQi.js → backup-Bugnn3Ue.js} +1 -1
  13. package/dist/assets/{backup-BAMi2lAq.js → backup-CnMN2oUK.js} +8 -8
  14. package/dist/assets/backup-CnMN2oUK.js.map +1 -0
  15. package/dist/assets/bark_ffi_wasm_bg-EY2uc0Bx.js.map +1 -1
  16. package/dist/assets/bitcoind-CZchoh43.js +349 -0
  17. package/dist/assets/bitcoind-CZchoh43.js.map +1 -0
  18. package/dist/assets/bitcoindProvider-DGw3xBSa.js +97 -0
  19. package/dist/assets/bitcoindProvider-DGw3xBSa.js.map +1 -0
  20. package/dist/assets/bitcoindevkit_bg-B-iLWrmX.js.map +1 -1
  21. package/dist/assets/buttons-Bj7Vf7Pn.js +2 -0
  22. package/dist/assets/{buttons-CX1pKB0j.js → buttons-CvNBzh2S.js} +4 -5
  23. package/dist/assets/{buttons-CX1pKB0j.js.map → buttons-CvNBzh2S.js.map} +1 -1
  24. package/dist/assets/{endpoint-Dn7H8qE1.js → endpoint-BOTFMpfS.js} +44 -12
  25. package/dist/assets/endpoint-BOTFMpfS.js.map +1 -0
  26. package/dist/assets/{envelope-BvU0fLEt.js → envelope-WjingYSc.js} +2 -2
  27. package/dist/assets/{envelope-BvU0fLEt.js.map → envelope-WjingYSc.js.map} +1 -1
  28. package/dist/assets/{errors-my6VJR_0.js → errors-DO5z6h_l.js} +29 -1
  29. package/dist/assets/errors-DO5z6h_l.js.map +1 -0
  30. package/dist/assets/groupFiles-IEUW3DQz.js +3202 -0
  31. package/dist/assets/groupFiles-IEUW3DQz.js.map +1 -0
  32. package/dist/assets/{host-Cmd205Dc.js → host-CWt-jtqz.js} +41 -16
  33. package/dist/assets/host-CWt-jtqz.js.map +1 -0
  34. package/dist/assets/{hyperdhtRelay-CEmBpT0Q.js → hyperdhtRelay-CPYwSLLS.js} +2 -3
  35. package/dist/assets/{hyperdhtRelay-CEmBpT0Q.js.map → hyperdhtRelay-CPYwSLLS.js.map} +1 -1
  36. package/dist/assets/{irohWeb--YyEA-hX.js → irohWeb-4oChIOIp.js} +2 -3
  37. package/dist/assets/{irohWeb--YyEA-hX.js.map → irohWeb-4oChIOIp.js.map} +1 -1
  38. package/dist/assets/{main-BzNN6bkx.js → main-DbqcdShN.js} +142 -35
  39. package/dist/assets/main-DbqcdShN.js.map +1 -0
  40. package/dist/assets/{mainline-D5D5C-jT.js → mainline-ZkiOnevs.js} +2 -2
  41. package/dist/assets/{mainline-D5D5C-jT.js.map → mainline-ZkiOnevs.js.map} +1 -1
  42. package/dist/assets/{networkReason-DxZWHw6v.js → networkReason-CetKkTPo.js} +2 -2
  43. package/dist/assets/{networkReason-DxZWHw6v.js.map → networkReason-CetKkTPo.js.map} +1 -1
  44. package/dist/assets/nwc-CgkqyvsE.js +612 -0
  45. package/dist/assets/nwc-CgkqyvsE.js.map +1 -0
  46. package/dist/assets/nwcProvider-4eVz_8HP.js +77 -0
  47. package/dist/assets/nwcProvider-4eVz_8HP.js.map +1 -0
  48. package/dist/assets/{profiles-B6F4oa9K.js → profiles-BHc9pEYg.js} +2 -2
  49. package/dist/assets/{profiles-B6F4oa9K.js.map → profiles-BHc9pEYg.js.map} +1 -1
  50. package/dist/assets/registry-DlAKO0Fy.js +3793 -0
  51. package/dist/assets/registry-DlAKO0Fy.js.map +1 -0
  52. package/dist/assets/registry-OBJBnHVQ.js +2 -0
  53. package/dist/assets/resolve-CouHhCpJ.js +591 -0
  54. package/dist/assets/resolve-CouHhCpJ.js.map +1 -0
  55. package/dist/assets/{server-CBCEYKMN.js → server-Ss0gJ-nw.js} +184 -1181
  56. package/dist/assets/server-Ss0gJ-nw.js.map +1 -0
  57. package/dist/assets/{src-DhfGgAUu.js → src-DDzSERyc.js} +2249 -72
  58. package/dist/assets/src-DDzSERyc.js.map +1 -0
  59. package/dist/assets/{turnRefs-ChEfgbSX.js → turnRefs-B87dtrHM.js} +2 -2
  60. package/dist/assets/{turnRefs-ChEfgbSX.js.map → turnRefs-B87dtrHM.js.map} +1 -1
  61. package/dist/assets/types-C4_KafL_.js +122 -0
  62. package/dist/assets/types-C4_KafL_.js.map +1 -0
  63. package/dist/assets/{usdt-C1Xao2xH.js → usdt-Fj8CQO2z.js} +3 -3
  64. package/dist/assets/{usdt-C1Xao2xH.js.map → usdt-Fj8CQO2z.js.map} +1 -1
  65. package/dist/ghostly.mjs +1 -1
  66. package/package.json +1 -1
  67. package/dist/assets/api-CrxVxtY1.js.map +0 -1
  68. package/dist/assets/apiKit-CajiDxdK.js.map +0 -1
  69. package/dist/assets/backup-BAMi2lAq.js.map +0 -1
  70. package/dist/assets/buttons-CWl2yNJu.js +0 -2
  71. package/dist/assets/endpoint-Dn7H8qE1.js.map +0 -1
  72. package/dist/assets/errors-my6VJR_0.js.map +0 -1
  73. package/dist/assets/groupFiles-BNTSDaoq.js +0 -7685
  74. package/dist/assets/groupFiles-BNTSDaoq.js.map +0 -1
  75. package/dist/assets/groupFiles-DBbjOLuD.js +0 -2088
  76. package/dist/assets/groupFiles-DBbjOLuD.js.map +0 -1
  77. package/dist/assets/host-Cmd205Dc.js.map +0 -1
  78. package/dist/assets/main-BzNN6bkx.js.map +0 -1
  79. package/dist/assets/server-CBCEYKMN.js.map +0 -1
  80. package/dist/assets/src-DhfGgAUu.js.map +0 -1
@@ -1,10 +1,9 @@
1
- import { jt as fromBase64Url } from "./groupFiles-DBbjOLuD.js";
2
- import { Ba as callRtcConfig, Gr as checkPushEndpoint, Ha as extractParamsFromSdp, Ia as CALL_SIGNAL_MAX_AGE_MS, La as RTC_CONFIG, Ra as answersOffer, Ua as parseCallSignal, Us as setLinkTraceSink, Va as callSignalHeardAt, Wa as signalHasVideo, hi as isPublicAddress, za as buildSdpFromSignal } from "./src-DhfGgAUu.js";
3
- import { a as fedimintSdkOn, r as irohRelayProblem } from "./irohWeb--YyEA-hX.js";
4
- import { r as asCliError, t as CliError } from "./errors-my6VJR_0.js";
5
- import { a as findChat } from "./apiKit-CajiDxdK.js";
6
- import { _ as flushCardUpdates, c as paymentJson, d as nodeLocalFetch, f as chatJson, g as resumeHolds, h as groupMessageJson, l as reportAppFrames, m as groupJson, p as chatMessageJson, r as callApi, u as servedApps } from "./api-CrxVxtY1.js";
7
- import { n as RESTORED_MARK, r as acquireLock } from "./profiles-B6F4oa9K.js";
1
+ import { Go as answersOffer, Jo as callSignalHeardAt, Ko as buildSdpFromSignal, Oi as isPublicAddress, Uo as CALL_SIGNAL_MAX_AGE_MS, Wo as RTC_CONFIG, Xo as parseCallSignal, Yo as extractParamsFromSdp, Zc as setLinkTraceSink, Zo as signalHasVideo, gl as fromBase64Url, ii as checkPushEndpoint, qo as callRtcConfig } from "./src-DDzSERyc.js";
2
+ import { a as fedimintSdkOn, r as irohRelayProblem } from "./irohWeb-4oChIOIp.js";
3
+ import { r as asCliError, t as CliError } from "./errors-DO5z6h_l.js";
4
+ import { a as findChat } from "./apiKit-CA2x5GJF.js";
5
+ import { _ as flushCardUpdates, c as paymentJson, d as nodeLocalFetch, f as chatJson, g as resumeHolds, h as groupMessageJson, l as reportAppFrames, m as groupJson, p as chatMessageJson, r as callApi, u as servedApps } from "./api-Dq2QXQDk.js";
6
+ import { n as RESTORED_MARK, r as acquireLock } from "./profiles-BHc9pEYg.js";
8
7
  import { r as privateFolder, t as ownFolder } from "./privateFolder-Bk9C9oFv.js";
9
8
  import { createRequire } from "node:module";
10
9
  import { appendFileSync, chmodSync, closeSync, existsSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync, writeSync } from "node:fs";
@@ -910,8 +909,12 @@ var CallManager = class {
910
909
  calls = /* @__PURE__ */ new Map();
911
910
  /** Per chat: the timestamp of the last signal handled. */
912
911
  lastSignal = /* @__PURE__ */ new Map();
912
+ /** Per chat: the timestamp of the last signal sent (`stamp`). */
913
+ lastSent = /* @__PURE__ */ new Map();
913
914
  /** Per chat: the timer that clears the hang-up signal. */
914
915
  clearing = /* @__PURE__ */ new Map();
916
+ /** Per chat: when this side's last call there ended before it was answered (`CALL_PACE_MS`). */
917
+ unansweredAt = /* @__PURE__ */ new Map();
915
918
  auto;
916
919
  configPath;
917
920
  stopping = false;
@@ -924,6 +927,15 @@ var CallManager = class {
924
927
  get now() {
925
928
  return (this.host.now ?? Date.now)();
926
929
  }
930
+ /**
931
+ * A new signal's timestamp in a chat: now, or 1 ms after the last one sent there. The contact drops a signal no
932
+ * newer than the last it heard, so a redial or a hang-up in the same millisecond as the signal before it would be lost.
933
+ */
934
+ stamp(chat) {
935
+ const ts = Math.max(this.now, (this.lastSent.get(chat) ?? 0) + 1);
936
+ this.lastSent.set(chat, ts);
937
+ return ts;
938
+ }
927
939
  /** A signal the contact's app sent in a chat (the engine's `call-signal`). */
928
940
  onSignal(chat, json) {
929
941
  if (this.stopping) return;
@@ -1035,7 +1047,7 @@ var CallManager = class {
1035
1047
  try {
1036
1048
  const stack = await this.stack();
1037
1049
  if (!await this.connect(call, (media) => CallMedia.offer(stack, media))) return;
1038
- call.offerTs = this.now;
1050
+ call.offerTs = this.stamp(call.chat);
1039
1051
  call.offering = true;
1040
1052
  await this.send(call.chat, {
1041
1053
  t: "o",
@@ -1059,7 +1071,7 @@ var CallManager = class {
1059
1071
  if (!await this.connect(call, (media) => CallMedia.answer(stack, offer, media))) return;
1060
1072
  await this.send(call.chat, {
1061
1073
  t: "a",
1062
- ts: this.now,
1074
+ ts: this.stamp(call.chat),
1063
1075
  o: offer.ts,
1064
1076
  ...call.media.local,
1065
1077
  v: 0
@@ -1122,6 +1134,7 @@ var CallManager = class {
1122
1134
  async start(chat, options) {
1123
1135
  const link = this.callable(chat);
1124
1136
  if (this.byChat(link.id)) throw new CliError("busy", "A call is already on in this chat");
1137
+ this.paced(link.id);
1125
1138
  const rate = rateOf(options.rate, this.auto.rate);
1126
1139
  const stack = await this.stack();
1127
1140
  if (this.byChat(link.id)) throw new CliError("busy", "A call is already on in this chat");
@@ -1130,7 +1143,7 @@ var CallManager = class {
1130
1143
  await this.attach(call, (media) => CallMedia.offer(stack, media));
1131
1144
  if (call.reason === "crossed") throw new CliError("busy", "The contact called at the same time: their call rings here");
1132
1145
  if (call.ended) throw new CliError("unavailable", "The call ended before it was placed");
1133
- call.offerTs = this.now;
1146
+ call.offerTs = this.stamp(link.id);
1134
1147
  call.offering = true;
1135
1148
  await this.send(link.id, {
1136
1149
  t: "o",
@@ -1168,7 +1181,7 @@ var CallManager = class {
1168
1181
  if (call.ended) throw new CliError("unavailable", "The call ended before it was answered");
1169
1182
  await this.send(call.chat, {
1170
1183
  t: "a",
1171
- ts: this.now,
1184
+ ts: this.stamp(call.chat),
1172
1185
  o: call.offer.ts,
1173
1186
  ...call.media.local,
1174
1187
  v: 0
@@ -1388,6 +1401,7 @@ var CallManager = class {
1388
1401
  this.disarm(call);
1389
1402
  if (call.watcher) clearInterval(call.watcher);
1390
1403
  this.calls.delete(call.id);
1404
+ if (call.direction === "out" && call.connectedAt === null && call.state === "ringing" && (reason === "hangup" || reason === "unanswered")) this.unansweredAt.set(call.chat, this.now);
1391
1405
  if (report) process.stderr.write(`ghostly: call ${call.id}: ended (${reason})${call.media ? `, ice ${call.media.ice.state}` : ""}\n`);
1392
1406
  call.media?.close();
1393
1407
  this.stopEarly(call);
@@ -1397,7 +1411,7 @@ var CallManager = class {
1397
1411
  if (tell) {
1398
1412
  await this.send(call.chat, {
1399
1413
  t: "h",
1400
- ts: this.now
1414
+ ts: this.stamp(call.chat)
1401
1415
  }).catch(() => {});
1402
1416
  if (!this.stopping) {
1403
1417
  const timer = setTimeout(() => {
@@ -1416,6 +1430,17 @@ var CallManager = class {
1416
1430
  ...call.connectedAt !== null ? { duration: this.now - call.connectedAt } : {}
1417
1431
  });
1418
1432
  }
1433
+ /** Refuses a call placed too soon after this side's last unanswered one in the chat (`CALL_PACE_MS`). */
1434
+ paced(chat) {
1435
+ const pace = this.host.callPaceMs ?? 2e3, last = this.unansweredAt.get(chat);
1436
+ if (!pace || last === void 0) return;
1437
+ const left = last + pace - this.now;
1438
+ if (left <= 0) {
1439
+ this.unansweredAt.delete(chat);
1440
+ return;
1441
+ }
1442
+ throw new CliError("busy", `Your last call in this chat ended unanswered a moment ago: call again in ${Math.ceil(left / 100) / 10} s`, { retryAfterMs: left });
1443
+ }
1419
1444
  arm(call, ms, reason, tell) {
1420
1445
  this.disarm(call);
1421
1446
  call.timer = setTimeout(() => void this.end(call, reason, tell), ms);
@@ -4358,14 +4383,14 @@ async function startRuntime(paths, options = {}) {
4358
4383
  (await import("./ghostly_iroh_web-Dvzh3Y6E.js")).initSync({ module: irohWasmBytes() });
4359
4384
  const [{ registerFileBytes }, { NodeFileBytes }] = await Promise.all([import("./fileBytes-CgbibpbV.js"), import("./fileBytes-CfSXjTFa.js")]);
4360
4385
  registerFileBytes("native", async () => new NodeFileBytes(paths.files), true);
4361
- const [{ EngineServer }, { createHyperEndpoint }] = await Promise.all([import("./server-CBCEYKMN.js"), import("./endpoint-Dn7H8qE1.js")]);
4386
+ const [{ EngineServer }, { createHyperEndpoint }] = await Promise.all([import("./server-Ss0gJ-nw.js"), import("./endpoint-BOTFMpfS.js")]);
4362
4387
  const network = hyperdhtNetwork();
4363
4388
  const dht = mainlineNetwork();
4364
- const mainline = dht.off ? null : new (await (import("./mainline-D5D5C-jT.js"))).Mainline({
4389
+ const mainline = dht.off ? null : new (await (import("./mainline-ZkiOnevs.js"))).Mainline({
4365
4390
  bootstrap: dht.bootstrap,
4366
4391
  host: dht.host
4367
4392
  });
4368
- const transport = mainline || pinned ? new (await (import("./mainline-D5D5C-jT.js"))).RelaysAndDht(mainline, pinned ? { relays: pinned } : {}, !!pinned) : null;
4393
+ const transport = mainline || pinned ? new (await (import("./mainline-ZkiOnevs.js"))).RelaysAndDht(mainline, pinned ? { relays: pinned } : {}, !!pinned) : null;
4369
4394
  const apps = servedApps(paths.dir).length > 0;
4370
4395
  const server = new EngineServer({
4371
4396
  ...transport ? { transport } : {},
@@ -4645,4 +4670,4 @@ function connection(ctx, socket) {
4645
4670
  //#endregion
4646
4671
  export { BASELINE_NEWEST, MAX_LINE, keepServing, openHost, serve };
4647
4672
 
4648
- //# sourceMappingURL=host-Cmd205Dc.js.map
4673
+ //# sourceMappingURL=host-CWt-jtqz.js.map