@crowdedkingdoms/crowdy-dsh 0.4.7-dev.1 → 0.4.9-dev.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.
package/dist/dsh-web/BUILD.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "@crowdedkingdoms/crowdy-dsh",
|
|
3
|
-
"version": "0.4.
|
|
4
|
-
"builtAt": "2026-10-
|
|
3
|
+
"version": "0.4.9",
|
|
4
|
+
"builtAt": "2026-10-16T00:55:35.856Z",
|
|
5
5
|
"source": {
|
|
6
6
|
"repository": "CrowdedKingdoms/crowdy-dsh",
|
|
7
|
-
"commit": "
|
|
7
|
+
"commit": "00f9782d0b449acfcec6025c2e63d52298a0e1ef",
|
|
8
8
|
"dirty": false
|
|
9
9
|
},
|
|
10
10
|
"upstream": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"crowdyjs": {
|
|
17
17
|
"name": "@crowdedkingdoms/crowdyjs",
|
|
18
|
-
"version": "18.
|
|
18
|
+
"version": "18.13.0-dev.1",
|
|
19
19
|
"source": "node_modules"
|
|
20
20
|
},
|
|
21
21
|
"files": {
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
"manifest.webmanifest": "sha256:9b54d57eea00f2fdd1affe6e7999a4209a515755f12ac1a3299da2d55e178d4c",
|
|
113
113
|
"preview/bootstrap-CYECZNXt.js": "sha256:9f303a0485c0badfdd19fad0c357ef050c5b9a343744ab5bf0c70015e7d95092",
|
|
114
114
|
"preview/crowdy-boot-Cklh1qNl.js": "sha256:b21e8eb126e1cd8a52159d2d577e610df6c8af36a436f9ed5028cfabd11a85ff",
|
|
115
|
-
"preview/vfs-image.tar.gz": "sha256:
|
|
115
|
+
"preview/vfs-image.tar.gz": "sha256:9eec4e84bf3530fa569beb85862ce4d5c4b914d49c3c86802fe3639e72bab6d0",
|
|
116
116
|
"preview/worker-C8-_ANaz.js": "sha256:81099e5732dfe0c32bacd5897316b7956c5a0a22da01b4a0c6e21d0a3b9d9aa1"
|
|
117
117
|
}
|
|
118
118
|
}
|
|
Binary file
|
|
@@ -10340,6 +10340,28 @@ function parseKitRefusal(message) {
|
|
|
10340
10340
|
const m = CODED.exec(message);
|
|
10341
10341
|
return m ? { code: m[1], text: m[2] } : null;
|
|
10342
10342
|
}
|
|
10343
|
+
var KIT_CODES = {
|
|
10344
|
+
BAD_REQUEST: "bad_request",
|
|
10345
|
+
NOT_FOUND: "not_found",
|
|
10346
|
+
FORBIDDEN: "forbidden",
|
|
10347
|
+
CONFLICT: "conflict",
|
|
10348
|
+
FULL: "full",
|
|
10349
|
+
LIMIT: "limit",
|
|
10350
|
+
COOLDOWN: "cooldown",
|
|
10351
|
+
NOT_YOUR_TURN: "not_your_turn",
|
|
10352
|
+
NOT_MEMBER: "not_member",
|
|
10353
|
+
STARTED: "started",
|
|
10354
|
+
FINISHED: "finished",
|
|
10355
|
+
NOT_READY: "not_ready",
|
|
10356
|
+
RESERVED: "reserved",
|
|
10357
|
+
EMPTY: "empty",
|
|
10358
|
+
OUT_OF_REACH: "out_of_reach",
|
|
10359
|
+
EXPIRED: "expired",
|
|
10360
|
+
INSUFFICIENT: "insufficient",
|
|
10361
|
+
ALREADY_DONE: "already_done",
|
|
10362
|
+
/** A hub the call needed did not answer: the kit sends it again with its action id. */
|
|
10363
|
+
UNAVAILABLE: "unavailable"
|
|
10364
|
+
};
|
|
10343
10365
|
var KitError = class _KitError extends CrowdyExecError {
|
|
10344
10366
|
constructor(code, text, cause) {
|
|
10345
10367
|
super("AppError", `kit:${code}: ${text}`, cause);
|
|
@@ -10595,6 +10617,443 @@ var CollectionMirror = class extends TopicMirror {
|
|
|
10595
10617
|
return this.get()?.get(id);
|
|
10596
10618
|
}
|
|
10597
10619
|
};
|
|
10620
|
+
var PrivateState = class {
|
|
10621
|
+
constructor(runtime, source) {
|
|
10622
|
+
this.runtime = runtime;
|
|
10623
|
+
this.source = source;
|
|
10624
|
+
this.reading = null;
|
|
10625
|
+
this.again = false;
|
|
10626
|
+
this.stopSub = null;
|
|
10627
|
+
this.offReconnect = null;
|
|
10628
|
+
this.listeners = /* @__PURE__ */ new Set();
|
|
10629
|
+
this.watching = null;
|
|
10630
|
+
this.whats = new Set(typeof source.what === "string" ? [source.what] : source.what);
|
|
10631
|
+
}
|
|
10632
|
+
/** Subscribes and reads the first value. Idempotent. */
|
|
10633
|
+
start() {
|
|
10634
|
+
if (!this.watching) {
|
|
10635
|
+
this.watching = (async () => {
|
|
10636
|
+
this.offReconnect = this.runtime.onReconnect(() => void this.refresh().catch(() => void 0));
|
|
10637
|
+
this.stopSub = await this.runtime.subscribe(this.source.nodeType, this.source.key, this.source.topic, (p) => this.onPush(p));
|
|
10638
|
+
return this.refresh();
|
|
10639
|
+
})().catch((e) => {
|
|
10640
|
+
this.watching = null;
|
|
10641
|
+
throw e;
|
|
10642
|
+
});
|
|
10643
|
+
}
|
|
10644
|
+
return this.watching;
|
|
10645
|
+
}
|
|
10646
|
+
async stop() {
|
|
10647
|
+
this.offReconnect?.();
|
|
10648
|
+
this.offReconnect = null;
|
|
10649
|
+
const stop = this.stopSub;
|
|
10650
|
+
this.stopSub = null;
|
|
10651
|
+
this.watching = null;
|
|
10652
|
+
await stop?.();
|
|
10653
|
+
}
|
|
10654
|
+
/** Reads the value again (one read at a time; a request during one runs after it). */
|
|
10655
|
+
refresh() {
|
|
10656
|
+
if (this.reading) {
|
|
10657
|
+
this.again = true;
|
|
10658
|
+
return this.reading;
|
|
10659
|
+
}
|
|
10660
|
+
this.reading = (async () => {
|
|
10661
|
+
try {
|
|
10662
|
+
let v;
|
|
10663
|
+
do {
|
|
10664
|
+
this.again = false;
|
|
10665
|
+
v = await this.source.read();
|
|
10666
|
+
} while (this.again);
|
|
10667
|
+
this.value = v;
|
|
10668
|
+
for (const l of [...this.listeners])
|
|
10669
|
+
l(v);
|
|
10670
|
+
return v;
|
|
10671
|
+
} finally {
|
|
10672
|
+
this.reading = null;
|
|
10673
|
+
}
|
|
10674
|
+
})();
|
|
10675
|
+
return this.reading;
|
|
10676
|
+
}
|
|
10677
|
+
get() {
|
|
10678
|
+
return this.value;
|
|
10679
|
+
}
|
|
10680
|
+
subscribe(listener) {
|
|
10681
|
+
this.listeners.add(listener);
|
|
10682
|
+
return () => this.listeners.delete(listener);
|
|
10683
|
+
}
|
|
10684
|
+
onPush(push) {
|
|
10685
|
+
const msg = splitKitMessage(push.value);
|
|
10686
|
+
if (!msg || msg.header.kind !== "changed" || !this.whats.has(msg.body.what))
|
|
10687
|
+
return;
|
|
10688
|
+
const who = Array.isArray(msg.body.who) ? msg.body.who.map(String) : [];
|
|
10689
|
+
void this.runtime.playerId().then((me) => {
|
|
10690
|
+
if (me === null || who.includes(me))
|
|
10691
|
+
void this.refresh().catch(() => void 0);
|
|
10692
|
+
});
|
|
10693
|
+
}
|
|
10694
|
+
};
|
|
10695
|
+
|
|
10696
|
+
var ArenasKit = class {
|
|
10697
|
+
constructor(runtime, nodeType = "arena") {
|
|
10698
|
+
this.runtime = runtime;
|
|
10699
|
+
this.nodeType = nodeType;
|
|
10700
|
+
this.arenas = /* @__PURE__ */ new Map();
|
|
10701
|
+
}
|
|
10702
|
+
arena(key) {
|
|
10703
|
+
let a = this.arenas.get(key);
|
|
10704
|
+
if (!a) {
|
|
10705
|
+
a = new ArenaMatch(this.runtime, this.nodeType, key);
|
|
10706
|
+
this.arenas.set(key, a);
|
|
10707
|
+
}
|
|
10708
|
+
return a;
|
|
10709
|
+
}
|
|
10710
|
+
};
|
|
10711
|
+
var ArenaMatch = class {
|
|
10712
|
+
constructor(runtime, nodeType, key) {
|
|
10713
|
+
this.runtime = runtime;
|
|
10714
|
+
this.nodeType = nodeType;
|
|
10715
|
+
this.key = key;
|
|
10716
|
+
this.view = new HubState(runtime, nodeType, key, "arena");
|
|
10717
|
+
}
|
|
10718
|
+
watch() {
|
|
10719
|
+
return this.view.start();
|
|
10720
|
+
}
|
|
10721
|
+
unwatch() {
|
|
10722
|
+
return this.view.stop();
|
|
10723
|
+
}
|
|
10724
|
+
/** Joins as `heroClass` (the starter's are `warrior` and `mage`). @throws {KitError} `bad_request`, `full`, `started`. */
|
|
10725
|
+
join(heroClass) {
|
|
10726
|
+
return this.runtime.call(this.nodeType, this.key, "join", { class: heroClass }, { action: true });
|
|
10727
|
+
}
|
|
10728
|
+
leave() {
|
|
10729
|
+
return this.runtime.call(this.nodeType, this.key, "leave", null, { action: true });
|
|
10730
|
+
}
|
|
10731
|
+
/** The first to join, or a developer. @throws {KitError} `forbidden`, `not_ready` (one fighter), `started`. */
|
|
10732
|
+
start() {
|
|
10733
|
+
return this.runtime.call(this.nodeType, this.key, "start", null, { action: true });
|
|
10734
|
+
}
|
|
10735
|
+
/**
|
|
10736
|
+
* Reports where the player is; resolves with the position the hub kept (a move too fast is cut
|
|
10737
|
+
* short, a jump refused). Not sent with an action id: the next report replaces it.
|
|
10738
|
+
* @throws {KitError} `forbidden` (removed for movement the warden refused), `conflict` (down).
|
|
10739
|
+
*/
|
|
10740
|
+
move(x, z) {
|
|
10741
|
+
return this.runtime.call(this.nodeType, this.key, "move", { x, z });
|
|
10742
|
+
}
|
|
10743
|
+
/**
|
|
10744
|
+
* Casts `ability` aimed at `(x, z)`; resolves with whether a hit-scan strike hit someone at once
|
|
10745
|
+
* (a projectile or an area lands later, as an `impact` event).
|
|
10746
|
+
* @throws {KitError} `cooldown`, `insufficient` (resource), `out_of_reach`, `not_found` (not the class's).
|
|
10747
|
+
*/
|
|
10748
|
+
cast(ability, x, z) {
|
|
10749
|
+
return this.runtime.call(this.nodeType, this.key, "cast", { ability, x, z }, { action: true });
|
|
10750
|
+
}
|
|
10751
|
+
};
|
|
10752
|
+
|
|
10753
|
+
var EncountersKit = class {
|
|
10754
|
+
constructor(runtime, nodeType = "director") {
|
|
10755
|
+
this.runtime = runtime;
|
|
10756
|
+
this.nodeType = nodeType;
|
|
10757
|
+
this.encounters = /* @__PURE__ */ new Map();
|
|
10758
|
+
}
|
|
10759
|
+
encounter(key) {
|
|
10760
|
+
let e = this.encounters.get(key);
|
|
10761
|
+
if (!e) {
|
|
10762
|
+
e = new Encounter(this.runtime, this.nodeType, key);
|
|
10763
|
+
this.encounters.set(key, e);
|
|
10764
|
+
}
|
|
10765
|
+
return e;
|
|
10766
|
+
}
|
|
10767
|
+
};
|
|
10768
|
+
var Encounter = class {
|
|
10769
|
+
constructor(runtime, nodeType, key) {
|
|
10770
|
+
this.runtime = runtime;
|
|
10771
|
+
this.nodeType = nodeType;
|
|
10772
|
+
this.key = key;
|
|
10773
|
+
this.view = new HubState(runtime, nodeType, key, "encounter");
|
|
10774
|
+
}
|
|
10775
|
+
watch() {
|
|
10776
|
+
return this.view.start();
|
|
10777
|
+
}
|
|
10778
|
+
unwatch() {
|
|
10779
|
+
return this.view.stop();
|
|
10780
|
+
}
|
|
10781
|
+
/** @throws {KitError} `full`. */
|
|
10782
|
+
join() {
|
|
10783
|
+
return this.runtime.call(this.nodeType, this.key, "join", null, { action: true });
|
|
10784
|
+
}
|
|
10785
|
+
/** The first to join, or a developer. @throws {KitError} `forbidden`, `started`, `bad_request` (no way to the base). */
|
|
10786
|
+
start() {
|
|
10787
|
+
return this.runtime.call(this.nodeType, this.key, "start", null, { action: true });
|
|
10788
|
+
}
|
|
10789
|
+
/**
|
|
10790
|
+
* Builds a tower at `(x, z)`; resolves with the gold left.
|
|
10791
|
+
* @throws {KitError} `blocks_lane`, `insufficient` (gold), `conflict` (taken), `bad_request`, `not_member`.
|
|
10792
|
+
*/
|
|
10793
|
+
build(x, z) {
|
|
10794
|
+
return this.runtime.call(this.nodeType, this.key, "build", { x, z }, { action: true });
|
|
10795
|
+
}
|
|
10796
|
+
/** Strikes enemy `enemy`; resolves with its hp left. @throws {KitError} `cooldown`, `not_found`, `not_member`. */
|
|
10797
|
+
hit(enemy) {
|
|
10798
|
+
return this.runtime.call(this.nodeType, this.key, "hit", { enemy }, { action: true });
|
|
10799
|
+
}
|
|
10800
|
+
};
|
|
10801
|
+
|
|
10802
|
+
var InstancesKit = class {
|
|
10803
|
+
constructor(runtime, nodeType = "instance") {
|
|
10804
|
+
this.runtime = runtime;
|
|
10805
|
+
this.nodeType = nodeType;
|
|
10806
|
+
this.runs = /* @__PURE__ */ new Map();
|
|
10807
|
+
}
|
|
10808
|
+
/** The run with key `key` (a key the game makes up, one per run). */
|
|
10809
|
+
run(key) {
|
|
10810
|
+
let r = this.runs.get(key);
|
|
10811
|
+
if (!r) {
|
|
10812
|
+
r = new InstanceRun(this.runtime, this.nodeType, key);
|
|
10813
|
+
this.runs.set(key, r);
|
|
10814
|
+
}
|
|
10815
|
+
return r;
|
|
10816
|
+
}
|
|
10817
|
+
};
|
|
10818
|
+
var InstanceRun = class {
|
|
10819
|
+
constructor(runtime, nodeType, key) {
|
|
10820
|
+
this.runtime = runtime;
|
|
10821
|
+
this.nodeType = nodeType;
|
|
10822
|
+
this.key = key;
|
|
10823
|
+
this.view = new HubState(runtime, nodeType, key, "run");
|
|
10824
|
+
}
|
|
10825
|
+
watch() {
|
|
10826
|
+
return this.view.start();
|
|
10827
|
+
}
|
|
10828
|
+
unwatch() {
|
|
10829
|
+
return this.view.stop();
|
|
10830
|
+
}
|
|
10831
|
+
/**
|
|
10832
|
+
* Opens the run as its owner (a developer kit opens one for `party`); resolves with its seed.
|
|
10833
|
+
* @throws {KitError} `started`, `bad_request` (party size), `conflict` (its grid could not be reserved).
|
|
10834
|
+
*/
|
|
10835
|
+
open(options = {}) {
|
|
10836
|
+
const args = {};
|
|
10837
|
+
if (options.seed !== void 0)
|
|
10838
|
+
args.seed = options.seed;
|
|
10839
|
+
if (options.party?.length)
|
|
10840
|
+
args.party = options.party.map(Number);
|
|
10841
|
+
return this.runtime.call(this.nodeType, this.key, "open", args, { action: true });
|
|
10842
|
+
}
|
|
10843
|
+
/** The owner invites a player. @throws {KitError} `forbidden`, `full`. */
|
|
10844
|
+
invite(player) {
|
|
10845
|
+
return this.runtime.call(this.nodeType, this.key, "invite", { player: Number(player) }, { action: true });
|
|
10846
|
+
}
|
|
10847
|
+
/** An invited player joins. @throws {KitError} `forbidden`. */
|
|
10848
|
+
join() {
|
|
10849
|
+
return this.runtime.call(this.nodeType, this.key, "join", null, { action: true });
|
|
10850
|
+
}
|
|
10851
|
+
/**
|
|
10852
|
+
* Resolves the room the party is at; resolves with what happened, as the log has it.
|
|
10853
|
+
* @throws {KitError} `not_member`, `forbidden` (the caller is down), `conflict` (descend first), `finished`.
|
|
10854
|
+
*/
|
|
10855
|
+
enter() {
|
|
10856
|
+
return this.runtime.call(this.nodeType, this.key, "enter", null, { action: true });
|
|
10857
|
+
}
|
|
10858
|
+
/** The owner leads the party to the next floor; resolves with it. @throws {KitError} `not_ready` (rooms left), `forbidden`. */
|
|
10859
|
+
descend() {
|
|
10860
|
+
return this.runtime.call(this.nodeType, this.key, "descend", null, { action: true });
|
|
10861
|
+
}
|
|
10862
|
+
/** The owner (or a developer) ends the run. */
|
|
10863
|
+
abandon() {
|
|
10864
|
+
return this.runtime.call(this.nodeType, this.key, "abandon", null, { action: true });
|
|
10865
|
+
}
|
|
10866
|
+
};
|
|
10867
|
+
|
|
10868
|
+
var LeaderboardsKit = class {
|
|
10869
|
+
constructor(runtime, nodeType = "leaderboard") {
|
|
10870
|
+
this.runtime = runtime;
|
|
10871
|
+
this.nodeType = nodeType;
|
|
10872
|
+
this.boards = /* @__PURE__ */ new Map();
|
|
10873
|
+
}
|
|
10874
|
+
/** The board named `name` (`weekly-score`, `fastest-lap`, ...). */
|
|
10875
|
+
board(name) {
|
|
10876
|
+
let b = this.boards.get(name);
|
|
10877
|
+
if (!b) {
|
|
10878
|
+
b = new LeaderboardHandle(this.runtime, this.nodeType, name);
|
|
10879
|
+
this.boards.set(name, b);
|
|
10880
|
+
}
|
|
10881
|
+
return b;
|
|
10882
|
+
}
|
|
10883
|
+
};
|
|
10884
|
+
var LeaderboardHandle = class {
|
|
10885
|
+
constructor(runtime, nodeType, name) {
|
|
10886
|
+
this.runtime = runtime;
|
|
10887
|
+
this.nodeType = nodeType;
|
|
10888
|
+
this.name = name;
|
|
10889
|
+
this.view = new HubState(runtime, nodeType, name, "board");
|
|
10890
|
+
}
|
|
10891
|
+
watch() {
|
|
10892
|
+
return this.view.start();
|
|
10893
|
+
}
|
|
10894
|
+
unwatch() {
|
|
10895
|
+
return this.view.stop();
|
|
10896
|
+
}
|
|
10897
|
+
/** A page of the board, best first. */
|
|
10898
|
+
top(options = {}) {
|
|
10899
|
+
return this.runtime.call(this.nodeType, this.name, "top", options);
|
|
10900
|
+
}
|
|
10901
|
+
/** The places around a player (the caller's own, without `player`). */
|
|
10902
|
+
around(options = {}) {
|
|
10903
|
+
const args = {};
|
|
10904
|
+
if (options.player !== void 0)
|
|
10905
|
+
args.player = Number(options.player);
|
|
10906
|
+
if (options.radius !== void 0)
|
|
10907
|
+
args.radius = options.radius;
|
|
10908
|
+
return this.runtime.call(this.nodeType, this.name, "around", args);
|
|
10909
|
+
}
|
|
10910
|
+
/** The caller's own place, or null without a score this season. */
|
|
10911
|
+
me() {
|
|
10912
|
+
return this.runtime.call(this.nodeType, this.name, "me");
|
|
10913
|
+
}
|
|
10914
|
+
season() {
|
|
10915
|
+
return this.runtime.call(this.nodeType, this.name, "season");
|
|
10916
|
+
}
|
|
10917
|
+
/** Submits a score for `player`. Developers only (a developer kit); players are refused. */
|
|
10918
|
+
submit(player, score) {
|
|
10919
|
+
return this.runtime.call(this.nodeType, this.name, "submit", { player: Number(player), score }, { action: true });
|
|
10920
|
+
}
|
|
10921
|
+
/** Sets the board's config. Developers only. */
|
|
10922
|
+
configure(config) {
|
|
10923
|
+
return this.runtime.call(this.nodeType, this.name, "configure", config, { action: true });
|
|
10924
|
+
}
|
|
10925
|
+
/** Ends the season now; resolves with the new season. Developers only. */
|
|
10926
|
+
roll() {
|
|
10927
|
+
return this.runtime.call(this.nodeType, this.name, "roll", null, { action: true });
|
|
10928
|
+
}
|
|
10929
|
+
};
|
|
10930
|
+
|
|
10931
|
+
var TOPIC = "market";
|
|
10932
|
+
var MarketCore = class {
|
|
10933
|
+
constructor(runtime, nodeType, key) {
|
|
10934
|
+
this.runtime = runtime;
|
|
10935
|
+
this.nodeType = nodeType;
|
|
10936
|
+
this.key = key;
|
|
10937
|
+
this.view = new HubState(runtime, nodeType, key, TOPIC);
|
|
10938
|
+
const source = { nodeType, key, topic: TOPIC };
|
|
10939
|
+
this.orders = new PrivateState(runtime, { ...source, what: "orders", read: () => runtime.call(nodeType, key, "orders") });
|
|
10940
|
+
this.trades = new PrivateState(runtime, { ...source, what: "trades", read: () => runtime.call(nodeType, key, "trades") });
|
|
10941
|
+
}
|
|
10942
|
+
change(method, args) {
|
|
10943
|
+
return this.runtime.call(this.nodeType, this.key, method, args, { action: true });
|
|
10944
|
+
}
|
|
10945
|
+
};
|
|
10946
|
+
var MarketsKit = class {
|
|
10947
|
+
constructor(core) {
|
|
10948
|
+
this.core = core;
|
|
10949
|
+
}
|
|
10950
|
+
at(key = "town") {
|
|
10951
|
+
return new MarketHandle(this.core(key));
|
|
10952
|
+
}
|
|
10953
|
+
};
|
|
10954
|
+
var MarketHandle = class {
|
|
10955
|
+
constructor(core) {
|
|
10956
|
+
this.core = core;
|
|
10957
|
+
}
|
|
10958
|
+
get view() {
|
|
10959
|
+
return this.core.view;
|
|
10960
|
+
}
|
|
10961
|
+
get orders() {
|
|
10962
|
+
return this.core.orders;
|
|
10963
|
+
}
|
|
10964
|
+
async watch() {
|
|
10965
|
+
const [view] = await Promise.all([this.core.view.start(), this.core.orders.start()]);
|
|
10966
|
+
return view;
|
|
10967
|
+
}
|
|
10968
|
+
async unwatch() {
|
|
10969
|
+
await Promise.all([this.core.view.stop(), this.core.orders.stop()]);
|
|
10970
|
+
}
|
|
10971
|
+
book(item) {
|
|
10972
|
+
return this.core.runtime.call(this.core.nodeType, this.core.key, "book", { item });
|
|
10973
|
+
}
|
|
10974
|
+
/**
|
|
10975
|
+
* Places a limit order; a buy holds `price * count` of the market's currency, a sell the items.
|
|
10976
|
+
* @throws {KitError} `insufficient`, `limit` (open orders), `not_found` (no book), `unavailable`.
|
|
10977
|
+
*/
|
|
10978
|
+
order(order) {
|
|
10979
|
+
return this.core.change("order", order);
|
|
10980
|
+
}
|
|
10981
|
+
/** Cancels an open order; what it still holds comes back. @throws {KitError} `not_found`. */
|
|
10982
|
+
cancel(order) {
|
|
10983
|
+
return this.core.change("cancel", { order });
|
|
10984
|
+
}
|
|
10985
|
+
};
|
|
10986
|
+
var ShopsKit = class {
|
|
10987
|
+
constructor(core) {
|
|
10988
|
+
this.core = core;
|
|
10989
|
+
}
|
|
10990
|
+
at(key = "town") {
|
|
10991
|
+
return new ShopHandle(this.core(key));
|
|
10992
|
+
}
|
|
10993
|
+
};
|
|
10994
|
+
var ShopHandle = class {
|
|
10995
|
+
constructor(core) {
|
|
10996
|
+
this.core = core;
|
|
10997
|
+
}
|
|
10998
|
+
get view() {
|
|
10999
|
+
return this.core.view;
|
|
11000
|
+
}
|
|
11001
|
+
watch() {
|
|
11002
|
+
return this.core.view.start();
|
|
11003
|
+
}
|
|
11004
|
+
unwatch() {
|
|
11005
|
+
return this.core.view.stop();
|
|
11006
|
+
}
|
|
11007
|
+
vendors() {
|
|
11008
|
+
return this.core.runtime.call(this.core.nodeType, this.core.key, "vendors");
|
|
11009
|
+
}
|
|
11010
|
+
/** Buys `count` (one by default). @throws {KitError} `insufficient` (gold or stock), `limit`, `full`, `not_found`, `unavailable`. */
|
|
11011
|
+
buy(vendor, item, count) {
|
|
11012
|
+
return this.core.change("buy", count === void 0 ? { vendor, item } : { vendor, item, count });
|
|
11013
|
+
}
|
|
11014
|
+
/** Sells `count` (one by default). @throws {KitError} `forbidden` (it does not buy them), `insufficient`, `unavailable`. */
|
|
11015
|
+
sell(vendor, item, count) {
|
|
11016
|
+
return this.core.change("sell", count === void 0 ? { vendor, item } : { vendor, item, count });
|
|
11017
|
+
}
|
|
11018
|
+
};
|
|
11019
|
+
var TradesKit = class {
|
|
11020
|
+
constructor(core) {
|
|
11021
|
+
this.core = core;
|
|
11022
|
+
}
|
|
11023
|
+
at(key = "town") {
|
|
11024
|
+
return new TradeDesk(this.core(key));
|
|
11025
|
+
}
|
|
11026
|
+
};
|
|
11027
|
+
var TradeDesk = class {
|
|
11028
|
+
constructor(core) {
|
|
11029
|
+
this.core = core;
|
|
11030
|
+
}
|
|
11031
|
+
get mine() {
|
|
11032
|
+
return this.core.trades;
|
|
11033
|
+
}
|
|
11034
|
+
async watch() {
|
|
11035
|
+
return this.core.trades.start();
|
|
11036
|
+
}
|
|
11037
|
+
unwatch() {
|
|
11038
|
+
return this.core.trades.stop();
|
|
11039
|
+
}
|
|
11040
|
+
/** Opens a trade with `player`; resolves with its id. */
|
|
11041
|
+
open(player) {
|
|
11042
|
+
return this.core.change("trade", { with: Number(player) });
|
|
11043
|
+
}
|
|
11044
|
+
/** Offers `bundle` (held at once; an empty one withdraws). @throws {KitError} `insufficient`, `forbidden`, `finished`. */
|
|
11045
|
+
offer(trade, bundle) {
|
|
11046
|
+
return this.core.change("offer", { trade, bundle });
|
|
11047
|
+
}
|
|
11048
|
+
/** Accepts the offers as they stand; resolves with the trade's state. @throws {KitError} `not_ready`, `finished`. */
|
|
11049
|
+
accept(trade) {
|
|
11050
|
+
return this.core.change("accept", { trade });
|
|
11051
|
+
}
|
|
11052
|
+
/** Calls it off; what each offered comes back. */
|
|
11053
|
+
decline(trade) {
|
|
11054
|
+
return this.core.change("decline", { trade });
|
|
11055
|
+
}
|
|
11056
|
+
};
|
|
10598
11057
|
|
|
10599
11058
|
var WritableKitStore = class {
|
|
10600
11059
|
constructor(initial) {
|
|
@@ -10721,6 +11180,296 @@ var MatchQueue = class {
|
|
|
10721
11180
|
}
|
|
10722
11181
|
};
|
|
10723
11182
|
|
|
11183
|
+
var MinigamesKit = class {
|
|
11184
|
+
constructor(runtime, nodeType = "minigame") {
|
|
11185
|
+
this.runtime = runtime;
|
|
11186
|
+
this.nodeType = nodeType;
|
|
11187
|
+
this.duels = /* @__PURE__ */ new Map();
|
|
11188
|
+
}
|
|
11189
|
+
duel(key) {
|
|
11190
|
+
let d = this.duels.get(key);
|
|
11191
|
+
if (!d) {
|
|
11192
|
+
d = new Duel(this.runtime, this.nodeType, key);
|
|
11193
|
+
this.duels.set(key, d);
|
|
11194
|
+
}
|
|
11195
|
+
return d;
|
|
11196
|
+
}
|
|
11197
|
+
};
|
|
11198
|
+
var Duel = class {
|
|
11199
|
+
constructor(runtime, nodeType, key) {
|
|
11200
|
+
this.runtime = runtime;
|
|
11201
|
+
this.nodeType = nodeType;
|
|
11202
|
+
this.key = key;
|
|
11203
|
+
this.view = new HubState(runtime, nodeType, key, "duel");
|
|
11204
|
+
}
|
|
11205
|
+
watch() {
|
|
11206
|
+
return this.view.start();
|
|
11207
|
+
}
|
|
11208
|
+
unwatch() {
|
|
11209
|
+
return this.view.stop();
|
|
11210
|
+
}
|
|
11211
|
+
/** Takes a seat; resolves with whether this seat started the first round. @throws {KitError} `full`. */
|
|
11212
|
+
join() {
|
|
11213
|
+
return this.runtime.call(this.nodeType, this.key, "join", null, { action: true });
|
|
11214
|
+
}
|
|
11215
|
+
/** Before the duel starts. @throws {KitError} `started`. */
|
|
11216
|
+
leave() {
|
|
11217
|
+
return this.runtime.call(this.nodeType, this.key, "leave", null, { action: true });
|
|
11218
|
+
}
|
|
11219
|
+
/**
|
|
11220
|
+
* The caller's hidden throw this round; resolves with whether it completed the round.
|
|
11221
|
+
* @throws {KitError} `conflict` (already in, or no round open), `bad_request` (not a hand), `not_member`.
|
|
11222
|
+
*/
|
|
11223
|
+
throw(hand) {
|
|
11224
|
+
return this.runtime.call(this.nodeType, this.key, "throw", { hand }, { action: true });
|
|
11225
|
+
}
|
|
11226
|
+
/** Once it is over: play again. @throws {KitError} `conflict`, `not_member`. */
|
|
11227
|
+
rematch() {
|
|
11228
|
+
return this.runtime.call(this.nodeType, this.key, "rematch", null, { action: true });
|
|
11229
|
+
}
|
|
11230
|
+
};
|
|
11231
|
+
|
|
11232
|
+
var TOPIC2 = "player";
|
|
11233
|
+
var Relay = class extends WritableKitStore {
|
|
11234
|
+
constructor() {
|
|
11235
|
+
super(void 0);
|
|
11236
|
+
}
|
|
11237
|
+
attach(source) {
|
|
11238
|
+
source.subscribe((v) => this.set(v));
|
|
11239
|
+
if (source.get() !== void 0)
|
|
11240
|
+
this.set(source.get());
|
|
11241
|
+
}
|
|
11242
|
+
};
|
|
11243
|
+
var PlayerKit = class {
|
|
11244
|
+
constructor(runtime, nodeType = "player", playerKey) {
|
|
11245
|
+
this.runtime = runtime;
|
|
11246
|
+
this.nodeType = nodeType;
|
|
11247
|
+
this.playerKey = playerKey;
|
|
11248
|
+
this.profile = new Relay();
|
|
11249
|
+
this.inventory = new Relay();
|
|
11250
|
+
this.wallet = new Relay();
|
|
11251
|
+
this.progress = new Relay();
|
|
11252
|
+
this.parts = null;
|
|
11253
|
+
this.rulesRead = null;
|
|
11254
|
+
this.events = /* @__PURE__ */ new Set();
|
|
11255
|
+
}
|
|
11256
|
+
/** The hub's key: the player's id. */
|
|
11257
|
+
async key() {
|
|
11258
|
+
const key = this.playerKey ?? await this.runtime.playerId();
|
|
11259
|
+
if (key === null || key === void 0) {
|
|
11260
|
+
throw new CrowdyError({ message: "the kit does not know which player it is: pass playerId to client.kit()" });
|
|
11261
|
+
}
|
|
11262
|
+
return key;
|
|
11263
|
+
}
|
|
11264
|
+
ready() {
|
|
11265
|
+
this.parts ?? (this.parts = (async () => {
|
|
11266
|
+
const key = await this.key();
|
|
11267
|
+
const read = (method) => () => this.runtime.call(this.nodeType, key, method);
|
|
11268
|
+
const source = { nodeType: this.nodeType, key, topic: TOPIC2 };
|
|
11269
|
+
const parts = {
|
|
11270
|
+
key,
|
|
11271
|
+
profile: new HubState(this.runtime, this.nodeType, key, TOPIC2),
|
|
11272
|
+
inventory: new PrivateState(this.runtime, { ...source, what: "inventory", read: read("inventory") }),
|
|
11273
|
+
wallet: new PrivateState(this.runtime, { ...source, what: "wallet", read: read("wallet") }),
|
|
11274
|
+
progress: new PrivateState(this.runtime, { ...source, what: "progress", read: read("progress") })
|
|
11275
|
+
};
|
|
11276
|
+
this.profile.attach(parts.profile);
|
|
11277
|
+
this.inventory.attach(parts.inventory);
|
|
11278
|
+
this.wallet.attach(parts.wallet);
|
|
11279
|
+
this.progress.attach(parts.progress);
|
|
11280
|
+
parts.profile.onEvent((body) => {
|
|
11281
|
+
for (const l of [...this.events])
|
|
11282
|
+
l(body);
|
|
11283
|
+
});
|
|
11284
|
+
return parts;
|
|
11285
|
+
})().catch((e) => {
|
|
11286
|
+
this.parts = null;
|
|
11287
|
+
throw e;
|
|
11288
|
+
}));
|
|
11289
|
+
return this.parts;
|
|
11290
|
+
}
|
|
11291
|
+
/** Mirrors the profile and reads what only the player reads (all of it, or the parts named). */
|
|
11292
|
+
async watch(...which) {
|
|
11293
|
+
const parts = await this.ready();
|
|
11294
|
+
const all = which.length ? which : ["profile", "inventory", "wallet", "progress"];
|
|
11295
|
+
await Promise.all(all.map((w) => parts[w].start()));
|
|
11296
|
+
}
|
|
11297
|
+
async unwatch() {
|
|
11298
|
+
if (!this.parts)
|
|
11299
|
+
return;
|
|
11300
|
+
const parts = await this.parts;
|
|
11301
|
+
await Promise.all([parts.profile.stop(), parts.inventory.stop(), parts.wallet.stop(), parts.progress.stop()]);
|
|
11302
|
+
}
|
|
11303
|
+
/** Levels gained and achievements unlocked, as the `player` topic announces them. */
|
|
11304
|
+
onEvent(listener) {
|
|
11305
|
+
this.events.add(listener);
|
|
11306
|
+
return () => this.events.delete(listener);
|
|
11307
|
+
}
|
|
11308
|
+
/** Calls the player's hub; a change carries an action id. */
|
|
11309
|
+
async call(method, args, change = true) {
|
|
11310
|
+
return this.runtime.call(this.nodeType, await this.key(), method, args ?? null, change ? { action: true } : {});
|
|
11311
|
+
}
|
|
11312
|
+
/** Everything the hub keeps for the player. */
|
|
11313
|
+
me() {
|
|
11314
|
+
return this.call("me", null, false);
|
|
11315
|
+
}
|
|
11316
|
+
/** The game's items, recipes, loot tables, quests and achievements (read once). */
|
|
11317
|
+
rules() {
|
|
11318
|
+
this.rulesRead ?? (this.rulesRead = this.call("rules", null, false).catch((e) => {
|
|
11319
|
+
this.rulesRead = null;
|
|
11320
|
+
throw e;
|
|
11321
|
+
}));
|
|
11322
|
+
return this.rulesRead;
|
|
11323
|
+
}
|
|
11324
|
+
/** Another player's public profile. */
|
|
11325
|
+
profileOf(player) {
|
|
11326
|
+
return this.runtime.call(this.nodeType, String(player), "profile");
|
|
11327
|
+
}
|
|
11328
|
+
};
|
|
11329
|
+
var InventoryKit = class {
|
|
11330
|
+
constructor(player) {
|
|
11331
|
+
this.player = player;
|
|
11332
|
+
}
|
|
11333
|
+
get items() {
|
|
11334
|
+
return this.player.inventory;
|
|
11335
|
+
}
|
|
11336
|
+
async watch() {
|
|
11337
|
+
await this.player.watch("inventory");
|
|
11338
|
+
return this.player.inventory.get();
|
|
11339
|
+
}
|
|
11340
|
+
/** How many of `item` the player has, as last read. */
|
|
11341
|
+
count(item) {
|
|
11342
|
+
return (this.player.inventory.get()?.stacks ?? []).filter((s) => s.item === item).reduce((n, s) => n + s.count, 0);
|
|
11343
|
+
}
|
|
11344
|
+
/** @throws {KitError} `insufficient`. */
|
|
11345
|
+
discard(item, count) {
|
|
11346
|
+
return this.player.call("discard", { item, count });
|
|
11347
|
+
}
|
|
11348
|
+
/** Moves what fits from the mail into the inventory; resolves with what moved. */
|
|
11349
|
+
takeMail() {
|
|
11350
|
+
return this.player.call("take_mail");
|
|
11351
|
+
}
|
|
11352
|
+
};
|
|
11353
|
+
var WalletKit = class {
|
|
11354
|
+
constructor(player) {
|
|
11355
|
+
this.player = player;
|
|
11356
|
+
}
|
|
11357
|
+
get balances() {
|
|
11358
|
+
return this.player.wallet;
|
|
11359
|
+
}
|
|
11360
|
+
async watch() {
|
|
11361
|
+
await this.player.watch("wallet");
|
|
11362
|
+
return this.player.wallet.get();
|
|
11363
|
+
}
|
|
11364
|
+
/** The balance of `currency`, as last read. */
|
|
11365
|
+
balance(currency) {
|
|
11366
|
+
return this.player.wallet.get()?.balances[currency] ?? 0;
|
|
11367
|
+
}
|
|
11368
|
+
};
|
|
11369
|
+
var ProgressionKit = class {
|
|
11370
|
+
constructor(player) {
|
|
11371
|
+
this.player = player;
|
|
11372
|
+
}
|
|
11373
|
+
get progress() {
|
|
11374
|
+
return this.player.progress;
|
|
11375
|
+
}
|
|
11376
|
+
get profile() {
|
|
11377
|
+
return this.player.profile;
|
|
11378
|
+
}
|
|
11379
|
+
async watch() {
|
|
11380
|
+
await this.player.watch("profile", "progress");
|
|
11381
|
+
return this.player.progress.get();
|
|
11382
|
+
}
|
|
11383
|
+
/** Another player's public profile. */
|
|
11384
|
+
profileOf(player) {
|
|
11385
|
+
return this.player.profileOf(player);
|
|
11386
|
+
}
|
|
11387
|
+
/** Called with each level the player reaches. */
|
|
11388
|
+
onLevel(listener) {
|
|
11389
|
+
return this.player.onEvent((e) => e.type === "level" && listener(e.level));
|
|
11390
|
+
}
|
|
11391
|
+
};
|
|
11392
|
+
var AchievementsKit = class {
|
|
11393
|
+
constructor(player) {
|
|
11394
|
+
this.player = player;
|
|
11395
|
+
}
|
|
11396
|
+
async watch() {
|
|
11397
|
+
await this.player.watch("profile", "progress");
|
|
11398
|
+
return this.list();
|
|
11399
|
+
}
|
|
11400
|
+
/** The achievements with their counts, as last read (hidden ones once unlocked). */
|
|
11401
|
+
list() {
|
|
11402
|
+
return this.player.progress.get()?.achievements ?? [];
|
|
11403
|
+
}
|
|
11404
|
+
/** Called with each achievement the player unlocks. */
|
|
11405
|
+
onUnlock(listener) {
|
|
11406
|
+
return this.player.onEvent((e) => e.type === "achievement" && listener(e.achievement));
|
|
11407
|
+
}
|
|
11408
|
+
};
|
|
11409
|
+
var QuestsKit = class {
|
|
11410
|
+
constructor(player) {
|
|
11411
|
+
this.player = player;
|
|
11412
|
+
}
|
|
11413
|
+
async watch() {
|
|
11414
|
+
await this.player.watch("progress");
|
|
11415
|
+
return this.list();
|
|
11416
|
+
}
|
|
11417
|
+
list() {
|
|
11418
|
+
return this.player.progress.get()?.quests ?? [];
|
|
11419
|
+
}
|
|
11420
|
+
/** @throws {KitError} `conflict` (taken, done, or another first), `forbidden` (level), `not_found`. */
|
|
11421
|
+
accept(quest) {
|
|
11422
|
+
return this.player.call("accept", { quest });
|
|
11423
|
+
}
|
|
11424
|
+
/** Claims a complete quest's reward. @throws {KitError} `not_ready`, `full`. */
|
|
11425
|
+
claim(quest) {
|
|
11426
|
+
return this.player.call("claim", { quest });
|
|
11427
|
+
}
|
|
11428
|
+
/**
|
|
11429
|
+
* Reports one of the counters the game lets a client report (a tutorial step).
|
|
11430
|
+
* @throws {KitError} `forbidden` for a counter the game's hubs count.
|
|
11431
|
+
*/
|
|
11432
|
+
step(counter) {
|
|
11433
|
+
return this.player.call("step", { counter });
|
|
11434
|
+
}
|
|
11435
|
+
};
|
|
11436
|
+
var CraftingKit = class {
|
|
11437
|
+
constructor(player) {
|
|
11438
|
+
this.player = player;
|
|
11439
|
+
}
|
|
11440
|
+
async recipes() {
|
|
11441
|
+
return (await this.player.rules()).recipes;
|
|
11442
|
+
}
|
|
11443
|
+
/** Crafts `times` (once by default). @throws {KitError} `insufficient`, `full`, `forbidden` (level), `not_found`. */
|
|
11444
|
+
craft(recipe, times) {
|
|
11445
|
+
return this.player.call("craft", times === void 0 ? { recipe } : { recipe, times });
|
|
11446
|
+
}
|
|
11447
|
+
};
|
|
11448
|
+
var LootKit = class {
|
|
11449
|
+
constructor(player) {
|
|
11450
|
+
this.player = player;
|
|
11451
|
+
}
|
|
11452
|
+
async tables() {
|
|
11453
|
+
return (await this.player.rules()).loot;
|
|
11454
|
+
}
|
|
11455
|
+
/** Pays the table's cost and rolls once. @throws {KitError} `insufficient`, `full`, `not_found`. */
|
|
11456
|
+
open(table) {
|
|
11457
|
+
return this.player.call("open", { table });
|
|
11458
|
+
}
|
|
11459
|
+
};
|
|
11460
|
+
var ProductionKit = class {
|
|
11461
|
+
constructor(player) {
|
|
11462
|
+
this.player = player;
|
|
11463
|
+
}
|
|
11464
|
+
async view() {
|
|
11465
|
+
return (await this.player.me()).production;
|
|
11466
|
+
}
|
|
11467
|
+
/** Moves what the producers made into the inventory, as far as it fits. */
|
|
11468
|
+
collect() {
|
|
11469
|
+
return this.player.call("collect");
|
|
11470
|
+
}
|
|
11471
|
+
};
|
|
11472
|
+
|
|
10724
11473
|
var NpcsKit = class {
|
|
10725
11474
|
constructor(runtime, options = {}) {
|
|
10726
11475
|
this.runtime = runtime;
|
|
@@ -10921,6 +11670,105 @@ var EmotesKit = class {
|
|
|
10921
11670
|
}
|
|
10922
11671
|
};
|
|
10923
11672
|
|
|
11673
|
+
var RacingKit = class {
|
|
11674
|
+
constructor(runtime, raceType = "race", ballType = "ball") {
|
|
11675
|
+
this.runtime = runtime;
|
|
11676
|
+
this.raceType = raceType;
|
|
11677
|
+
this.ballType = ballType;
|
|
11678
|
+
this.races = /* @__PURE__ */ new Map();
|
|
11679
|
+
this.matches = /* @__PURE__ */ new Map();
|
|
11680
|
+
}
|
|
11681
|
+
/** The race with key `key`. */
|
|
11682
|
+
race(key) {
|
|
11683
|
+
let r = this.races.get(key);
|
|
11684
|
+
if (!r) {
|
|
11685
|
+
r = new Race(this.runtime, this.raceType, key);
|
|
11686
|
+
this.races.set(key, r);
|
|
11687
|
+
}
|
|
11688
|
+
return r;
|
|
11689
|
+
}
|
|
11690
|
+
/** The ball game with key `key`. */
|
|
11691
|
+
ball(key) {
|
|
11692
|
+
let m = this.matches.get(key);
|
|
11693
|
+
if (!m) {
|
|
11694
|
+
m = new BallMatch(this.runtime, this.ballType, key);
|
|
11695
|
+
this.matches.set(key, m);
|
|
11696
|
+
}
|
|
11697
|
+
return m;
|
|
11698
|
+
}
|
|
11699
|
+
};
|
|
11700
|
+
var Race = class {
|
|
11701
|
+
constructor(runtime, nodeType, key) {
|
|
11702
|
+
this.runtime = runtime;
|
|
11703
|
+
this.nodeType = nodeType;
|
|
11704
|
+
this.key = key;
|
|
11705
|
+
this.view = new HubState(runtime, nodeType, key, "race");
|
|
11706
|
+
}
|
|
11707
|
+
watch() {
|
|
11708
|
+
return this.view.start();
|
|
11709
|
+
}
|
|
11710
|
+
unwatch() {
|
|
11711
|
+
return this.view.stop();
|
|
11712
|
+
}
|
|
11713
|
+
/** @throws {KitError} `started`, `full`. */
|
|
11714
|
+
join() {
|
|
11715
|
+
return this.runtime.call(this.nodeType, this.key, "join", null, { action: true });
|
|
11716
|
+
}
|
|
11717
|
+
leave() {
|
|
11718
|
+
return this.runtime.call(this.nodeType, this.key, "leave", null, { action: true });
|
|
11719
|
+
}
|
|
11720
|
+
/** Starts the countdown (the first to join, or a developer). @throws {KitError} `forbidden`, `started`. */
|
|
11721
|
+
start() {
|
|
11722
|
+
return this.runtime.call(this.nodeType, this.key, "start", null, { action: true });
|
|
11723
|
+
}
|
|
11724
|
+
/** Reports where the racer is; resolves with the position the hub kept. */
|
|
11725
|
+
pos(x, z) {
|
|
11726
|
+
return this.runtime.call(this.nodeType, this.key, "pos", { x, z });
|
|
11727
|
+
}
|
|
11728
|
+
/** The winner's run, once there is one. */
|
|
11729
|
+
ghost() {
|
|
11730
|
+
return this.runtime.call(this.nodeType, this.key, "ghost");
|
|
11731
|
+
}
|
|
11732
|
+
};
|
|
11733
|
+
var BallMatch = class {
|
|
11734
|
+
constructor(runtime, nodeType, key) {
|
|
11735
|
+
this.runtime = runtime;
|
|
11736
|
+
this.nodeType = nodeType;
|
|
11737
|
+
this.key = key;
|
|
11738
|
+
this.view = new HubState(runtime, nodeType, key, "ball");
|
|
11739
|
+
}
|
|
11740
|
+
watch() {
|
|
11741
|
+
return this.view.start();
|
|
11742
|
+
}
|
|
11743
|
+
unwatch() {
|
|
11744
|
+
return this.view.stop();
|
|
11745
|
+
}
|
|
11746
|
+
/** @throws {KitError} `bad_request` (red or blue), `full`, `started`. */
|
|
11747
|
+
join(team) {
|
|
11748
|
+
return this.runtime.call(this.nodeType, this.key, "join", { team }, { action: true });
|
|
11749
|
+
}
|
|
11750
|
+
/** @throws {KitError} `forbidden`, `not_ready` (each team needs a player), `started`. */
|
|
11751
|
+
start() {
|
|
11752
|
+
return this.runtime.call(this.nodeType, this.key, "start", null, { action: true });
|
|
11753
|
+
}
|
|
11754
|
+
/** Reports where the player is; resolves with the position the hub kept. */
|
|
11755
|
+
pos(x, z) {
|
|
11756
|
+
return this.runtime.call(this.nodeType, this.key, "pos", { x, z });
|
|
11757
|
+
}
|
|
11758
|
+
/** Claims the ball. @throws {KitError} `out_of_reach`, `cooldown` (too soon, or its holder's protection), `conflict` (a teammate has it). */
|
|
11759
|
+
claim() {
|
|
11760
|
+
return this.runtime.call(this.nodeType, this.key, "claim", null, { action: true });
|
|
11761
|
+
}
|
|
11762
|
+
/** Passes to a teammate. @throws {KitError} `conflict` (not the holder), `bad_request` (not a teammate). */
|
|
11763
|
+
pass(to) {
|
|
11764
|
+
return this.runtime.call(this.nodeType, this.key, "pass", { to: Number(to) }, { action: true });
|
|
11765
|
+
}
|
|
11766
|
+
/** Shoots toward `(x, z)`. @throws {KitError} `conflict` (not the holder). */
|
|
11767
|
+
shoot(x, z) {
|
|
11768
|
+
return this.runtime.call(this.nodeType, this.key, "shoot", { x, z }, { action: true });
|
|
11769
|
+
}
|
|
11770
|
+
};
|
|
11771
|
+
|
|
10924
11772
|
var SessionsKit = class {
|
|
10925
11773
|
constructor(runtime, options = {}) {
|
|
10926
11774
|
this.runtime = runtime;
|
|
@@ -10998,6 +11846,206 @@ var GameSessionHandle = class {
|
|
|
10998
11846
|
}
|
|
10999
11847
|
};
|
|
11000
11848
|
|
|
11849
|
+
var TablesKit = class {
|
|
11850
|
+
constructor(runtime, nodeType = "deck") {
|
|
11851
|
+
this.runtime = runtime;
|
|
11852
|
+
this.nodeType = nodeType;
|
|
11853
|
+
this.tables = /* @__PURE__ */ new Map();
|
|
11854
|
+
}
|
|
11855
|
+
table(key) {
|
|
11856
|
+
let t = this.tables.get(key);
|
|
11857
|
+
if (!t) {
|
|
11858
|
+
t = new CardTable(this.runtime, this.nodeType, key);
|
|
11859
|
+
this.tables.set(key, t);
|
|
11860
|
+
}
|
|
11861
|
+
return t;
|
|
11862
|
+
}
|
|
11863
|
+
};
|
|
11864
|
+
var CardTable = class {
|
|
11865
|
+
constructor(runtime, nodeType, key) {
|
|
11866
|
+
this.runtime = runtime;
|
|
11867
|
+
this.nodeType = nodeType;
|
|
11868
|
+
this.key = key;
|
|
11869
|
+
this.table = new HubState(runtime, nodeType, key, "table");
|
|
11870
|
+
this.hand = new PrivateState(runtime, {
|
|
11871
|
+
nodeType,
|
|
11872
|
+
key,
|
|
11873
|
+
topic: "table",
|
|
11874
|
+
what: "hand",
|
|
11875
|
+
read: () => runtime.call(nodeType, key, "hand")
|
|
11876
|
+
});
|
|
11877
|
+
}
|
|
11878
|
+
/** Mirrors the table and the caller's hand. */
|
|
11879
|
+
async watch() {
|
|
11880
|
+
const [view] = await Promise.all([this.table.start(), this.hand.start()]);
|
|
11881
|
+
return view;
|
|
11882
|
+
}
|
|
11883
|
+
async unwatch() {
|
|
11884
|
+
await Promise.all([this.table.stop(), this.hand.stop()]);
|
|
11885
|
+
}
|
|
11886
|
+
/** @throws {KitError} `started`, `full`. */
|
|
11887
|
+
join() {
|
|
11888
|
+
return this.runtime.call(this.nodeType, this.key, "join", null, { action: true });
|
|
11889
|
+
}
|
|
11890
|
+
leave() {
|
|
11891
|
+
return this.runtime.call(this.nodeType, this.key, "leave", null, { action: true });
|
|
11892
|
+
}
|
|
11893
|
+
/** Deals (the host, from two players). @throws {KitError} `forbidden`, `too_few_players`, `started`. */
|
|
11894
|
+
start() {
|
|
11895
|
+
return this.runtime.call(this.nodeType, this.key, "start", null, { action: true });
|
|
11896
|
+
}
|
|
11897
|
+
/**
|
|
11898
|
+
* Plays a card from the caller's hand; an eight names `suit` (`S`, `H`, `D` or `C`).
|
|
11899
|
+
* @throws {KitError} `not_your_turn`, `not_found` (not in the hand), `not_playable` (the rule),
|
|
11900
|
+
* `bad_request` (an eight without a suit).
|
|
11901
|
+
*/
|
|
11902
|
+
play(card, suit) {
|
|
11903
|
+
const args = suit === void 0 ? { card } : { card, suit };
|
|
11904
|
+
return this.runtime.call(this.nodeType, this.key, "play", args, { action: true });
|
|
11905
|
+
}
|
|
11906
|
+
/** Draws a card (once a turn). @throws {KitError} `not_your_turn`, `conflict`, `empty`. */
|
|
11907
|
+
draw() {
|
|
11908
|
+
return this.runtime.call(this.nodeType, this.key, "draw", null, { action: true });
|
|
11909
|
+
}
|
|
11910
|
+
/** Passes, after drawing. @throws {KitError} `conflict` (draw first). */
|
|
11911
|
+
pass() {
|
|
11912
|
+
return this.runtime.call(this.nodeType, this.key, "pass", null, { action: true });
|
|
11913
|
+
}
|
|
11914
|
+
};
|
|
11915
|
+
|
|
11916
|
+
var TacticsKit = class {
|
|
11917
|
+
constructor(runtime, nodeType = "tactics") {
|
|
11918
|
+
this.runtime = runtime;
|
|
11919
|
+
this.nodeType = nodeType;
|
|
11920
|
+
this.battles = /* @__PURE__ */ new Map();
|
|
11921
|
+
}
|
|
11922
|
+
battle(key) {
|
|
11923
|
+
let b = this.battles.get(key);
|
|
11924
|
+
if (!b) {
|
|
11925
|
+
b = new TacticsBattle(this.runtime, this.nodeType, key);
|
|
11926
|
+
this.battles.set(key, b);
|
|
11927
|
+
}
|
|
11928
|
+
return b;
|
|
11929
|
+
}
|
|
11930
|
+
};
|
|
11931
|
+
var TacticsBattle = class {
|
|
11932
|
+
constructor(runtime, nodeType, key) {
|
|
11933
|
+
this.runtime = runtime;
|
|
11934
|
+
this.nodeType = nodeType;
|
|
11935
|
+
this.key = key;
|
|
11936
|
+
this.battle = new HubState(runtime, nodeType, key, "battle");
|
|
11937
|
+
}
|
|
11938
|
+
watch() {
|
|
11939
|
+
return this.battle.start();
|
|
11940
|
+
}
|
|
11941
|
+
unwatch() {
|
|
11942
|
+
return this.battle.stop();
|
|
11943
|
+
}
|
|
11944
|
+
/** The player's units, as the mirror last saw them. */
|
|
11945
|
+
async myUnits() {
|
|
11946
|
+
const me = await this.runtime.playerId();
|
|
11947
|
+
return (this.battle.get()?.units ?? []).filter((u) => me !== null && String(u.owner) === me);
|
|
11948
|
+
}
|
|
11949
|
+
/** @throws {KitError} `started`, `full`. */
|
|
11950
|
+
join() {
|
|
11951
|
+
return this.runtime.call(this.nodeType, this.key, "join", null, { action: true });
|
|
11952
|
+
}
|
|
11953
|
+
/** @throws {KitError} `forbidden` (the host starts it), `started`. */
|
|
11954
|
+
start() {
|
|
11955
|
+
return this.runtime.call(this.nodeType, this.key, "start", null, { action: true });
|
|
11956
|
+
}
|
|
11957
|
+
/**
|
|
11958
|
+
* Moves the player's unit to `(x, z)`.
|
|
11959
|
+
* @throws {KitError} `not_your_turn`, `conflict` (it moved), `out_of_reach`, `not_member`.
|
|
11960
|
+
*/
|
|
11961
|
+
move(x, z) {
|
|
11962
|
+
return this.runtime.call(this.nodeType, this.key, "move", { x, z }, { action: true });
|
|
11963
|
+
}
|
|
11964
|
+
/**
|
|
11965
|
+
* Attacks unit `target` with the player's unit.
|
|
11966
|
+
* @throws {KitError} `not_your_turn`, `conflict` (it attacked), `out_of_reach`, `forbidden` (its own side), `not_found`.
|
|
11967
|
+
*/
|
|
11968
|
+
attack(target) {
|
|
11969
|
+
return this.runtime.call(this.nodeType, this.key, "attack", { target }, { action: true });
|
|
11970
|
+
}
|
|
11971
|
+
/** Ends the player's turn this phase. */
|
|
11972
|
+
endTurn() {
|
|
11973
|
+
return this.runtime.call(this.nodeType, this.key, "end_turn", null, { action: true });
|
|
11974
|
+
}
|
|
11975
|
+
};
|
|
11976
|
+
|
|
11977
|
+
var TerritoryKit = class {
|
|
11978
|
+
constructor(runtime, territoryType = "territory", zoneType = "zone") {
|
|
11979
|
+
this.runtime = runtime;
|
|
11980
|
+
this.territoryType = territoryType;
|
|
11981
|
+
this.zoneType = zoneType;
|
|
11982
|
+
this.maps = /* @__PURE__ */ new Map();
|
|
11983
|
+
this.zones = /* @__PURE__ */ new Map();
|
|
11984
|
+
}
|
|
11985
|
+
/** The war on map `key`. */
|
|
11986
|
+
map(key) {
|
|
11987
|
+
let m = this.maps.get(key);
|
|
11988
|
+
if (!m) {
|
|
11989
|
+
m = new TerritoryMap(this.runtime, this.territoryType, key);
|
|
11990
|
+
this.maps.set(key, m);
|
|
11991
|
+
}
|
|
11992
|
+
return m;
|
|
11993
|
+
}
|
|
11994
|
+
/** The circle of match `key`. */
|
|
11995
|
+
zone(key) {
|
|
11996
|
+
let z = this.zones.get(key);
|
|
11997
|
+
if (!z) {
|
|
11998
|
+
z = new ZoneMatch(this.runtime, this.zoneType, key);
|
|
11999
|
+
this.zones.set(key, z);
|
|
12000
|
+
}
|
|
12001
|
+
return z;
|
|
12002
|
+
}
|
|
12003
|
+
};
|
|
12004
|
+
var TerritoryMap = class {
|
|
12005
|
+
constructor(runtime, nodeType, key) {
|
|
12006
|
+
this.runtime = runtime;
|
|
12007
|
+
this.nodeType = nodeType;
|
|
12008
|
+
this.key = key;
|
|
12009
|
+
this.view = new HubState(runtime, nodeType, key, "territory");
|
|
12010
|
+
}
|
|
12011
|
+
watch() {
|
|
12012
|
+
return this.view.start();
|
|
12013
|
+
}
|
|
12014
|
+
unwatch() {
|
|
12015
|
+
return this.view.stop();
|
|
12016
|
+
}
|
|
12017
|
+
/** Joins a faction, once: a player keeps theirs. @throws {KitError} `conflict`, `bad_request`, `full`. */
|
|
12018
|
+
join(faction) {
|
|
12019
|
+
return this.runtime.call(this.nodeType, this.key, "join", { faction }, { action: true });
|
|
12020
|
+
}
|
|
12021
|
+
/** A new war. Developers only. */
|
|
12022
|
+
reset() {
|
|
12023
|
+
return this.runtime.call(this.nodeType, this.key, "reset", null, { action: true });
|
|
12024
|
+
}
|
|
12025
|
+
};
|
|
12026
|
+
var ZoneMatch = class {
|
|
12027
|
+
constructor(runtime, nodeType, key) {
|
|
12028
|
+
this.runtime = runtime;
|
|
12029
|
+
this.nodeType = nodeType;
|
|
12030
|
+
this.key = key;
|
|
12031
|
+
this.view = new HubState(runtime, nodeType, key, "zone");
|
|
12032
|
+
}
|
|
12033
|
+
watch() {
|
|
12034
|
+
return this.view.start();
|
|
12035
|
+
}
|
|
12036
|
+
unwatch() {
|
|
12037
|
+
return this.view.stop();
|
|
12038
|
+
}
|
|
12039
|
+
/** @throws {KitError} `started`, `full`. */
|
|
12040
|
+
join() {
|
|
12041
|
+
return this.runtime.call(this.nodeType, this.key, "join", null, { action: true });
|
|
12042
|
+
}
|
|
12043
|
+
/** The first to join, or a developer. @throws {KitError} `forbidden`, `not_ready`, `started`. */
|
|
12044
|
+
start() {
|
|
12045
|
+
return this.runtime.call(this.nodeType, this.key, "start", null, { action: true });
|
|
12046
|
+
}
|
|
12047
|
+
};
|
|
12048
|
+
|
|
11001
12049
|
var WorldKit = class {
|
|
11002
12050
|
constructor(runtime, options = {}) {
|
|
11003
12051
|
this.runtime = runtime;
|
|
@@ -11135,6 +12183,10 @@ var KitRuntime = class {
|
|
|
11135
12183
|
return await conn.call(nodeType, key, method, sent, { timeoutMs: options.timeoutMs });
|
|
11136
12184
|
} catch (e) {
|
|
11137
12185
|
const err = KitError.from(e);
|
|
12186
|
+
if (attempt < this.retries && actionId && err instanceof KitError && err.code === KIT_CODES.UNAVAILABLE) {
|
|
12187
|
+
await sleep(Math.min(2e3, 200 * 2 ** attempt) * (0.5 + Math.random() / 2));
|
|
12188
|
+
continue;
|
|
12189
|
+
}
|
|
11138
12190
|
if (attempt < this.retries && err instanceof CrowdyExecError && !(err instanceof KitError)) {
|
|
11139
12191
|
if (err.status === "Busy" && err.rateLimited) {
|
|
11140
12192
|
this.budget.hold(err.retryAfterMs ?? 1e3);
|
|
@@ -11578,6 +12630,26 @@ var GameKitClient = class {
|
|
|
11578
12630
|
this.spectateKit = null;
|
|
11579
12631
|
this.emotesKit = null;
|
|
11580
12632
|
this.shardKit = null;
|
|
12633
|
+
this.leaderboardsKit = null;
|
|
12634
|
+
this.tablesKit = null;
|
|
12635
|
+
this.tacticsKit = null;
|
|
12636
|
+
this.encountersKit = null;
|
|
12637
|
+
this.minigamesKit = null;
|
|
12638
|
+
this.instancesKit = null;
|
|
12639
|
+
this.arenasKit = null;
|
|
12640
|
+
this.racingKit = null;
|
|
12641
|
+
this.territoryKit = null;
|
|
12642
|
+
this.playerKit = null;
|
|
12643
|
+
this.economy = /* @__PURE__ */ new Map();
|
|
12644
|
+
this.markets = /* @__PURE__ */ new Map();
|
|
12645
|
+
this.marketCore = (key) => {
|
|
12646
|
+
let core = this.markets.get(key);
|
|
12647
|
+
if (!core) {
|
|
12648
|
+
core = new MarketCore(this.runtime, this.options.nodes?.market ?? "market", key);
|
|
12649
|
+
this.markets.set(key, core);
|
|
12650
|
+
}
|
|
12651
|
+
return core;
|
|
12652
|
+
};
|
|
11581
12653
|
this.social = new SocialKit(appId, domains.teams, domains.channels, domains.udp, gameApps, options.social);
|
|
11582
12654
|
this.runtime = new KitRuntime(String(appId), domains.exec, options, domains.whoAmI);
|
|
11583
12655
|
}
|
|
@@ -11601,6 +12673,96 @@ var GameKitClient = class {
|
|
|
11601
12673
|
const opts = { nodeType: this.options.nodes?.npcs, areaSize: this.options.areaSize };
|
|
11602
12674
|
return this.npcsKit ?? (this.npcsKit = new NpcsKit(this.runtime, opts));
|
|
11603
12675
|
}
|
|
12676
|
+
/** Leaderboards the hubs rank (a client never submits its own score). */
|
|
12677
|
+
get leaderboards() {
|
|
12678
|
+
return this.leaderboardsKit ?? (this.leaderboardsKit = new LeaderboardsKit(this.runtime, this.options.nodes?.leaderboard));
|
|
12679
|
+
}
|
|
12680
|
+
/** Card tables with hidden hands the hub holds. */
|
|
12681
|
+
get tables() {
|
|
12682
|
+
return this.tablesKit ?? (this.tablesKit = new TablesKit(this.runtime, this.options.nodes?.deck));
|
|
12683
|
+
}
|
|
12684
|
+
/** Grid battles in turns, against the hub's units. */
|
|
12685
|
+
get tactics() {
|
|
12686
|
+
return this.tacticsKit ?? (this.tacticsKit = new TacticsKit(this.runtime, this.options.nodes?.tactics));
|
|
12687
|
+
}
|
|
12688
|
+
/** Encounters: waves down a lane, towers, a boss with phases. */
|
|
12689
|
+
get encounters() {
|
|
12690
|
+
return this.encountersKit ?? (this.encountersKit = new EncountersKit(this.runtime, this.options.nodes?.director));
|
|
12691
|
+
}
|
|
12692
|
+
/** Duels of hidden throws, revealed together. */
|
|
12693
|
+
get minigames() {
|
|
12694
|
+
return this.minigamesKit ?? (this.minigamesKit = new MinigamesKit(this.runtime, this.options.nodes?.minigame));
|
|
12695
|
+
}
|
|
12696
|
+
/** Private runs for one party: seeded floors, permadeath, expiry. */
|
|
12697
|
+
get instances() {
|
|
12698
|
+
return this.instancesKit ?? (this.instancesKit = new InstancesKit(this.runtime, this.options.nodes?.instance));
|
|
12699
|
+
}
|
|
12700
|
+
/** Real-time arenas: classes, abilities, the hub's referee. */
|
|
12701
|
+
get arenas() {
|
|
12702
|
+
return this.arenasKit ?? (this.arenasKit = new ArenasKit(this.runtime, this.options.nodes?.arena));
|
|
12703
|
+
}
|
|
12704
|
+
/** Races and ball games, on positions the hub's warden keeps. */
|
|
12705
|
+
get racing() {
|
|
12706
|
+
return this.racingKit ?? (this.racingKit = new RacingKit(this.runtime, this.options.nodes?.race, this.options.nodes?.ball));
|
|
12707
|
+
}
|
|
12708
|
+
/** Control points factions capture, and shrinking circles. */
|
|
12709
|
+
get territory() {
|
|
12710
|
+
return this.territoryKit ?? (this.territoryKit = new TerritoryKit(this.runtime, this.options.nodes?.territory, this.options.nodes?.zone));
|
|
12711
|
+
}
|
|
12712
|
+
/**
|
|
12713
|
+
* The caller's own `player` hub: what they own and what they did. The economy lives in hub
|
|
12714
|
+
* state and is not a ledger. The modules below are views of it.
|
|
12715
|
+
*/
|
|
12716
|
+
get player() {
|
|
12717
|
+
return this.playerKit ?? (this.playerKit = new PlayerKit(this.runtime, this.options.nodes?.player));
|
|
12718
|
+
}
|
|
12719
|
+
view(name, make) {
|
|
12720
|
+
if (!this.economy.has(name))
|
|
12721
|
+
this.economy.set(name, make(this.player));
|
|
12722
|
+
return this.economy.get(name);
|
|
12723
|
+
}
|
|
12724
|
+
/** The player's items: stacks in slots, and mail for what did not fit. */
|
|
12725
|
+
get inventory() {
|
|
12726
|
+
return this.view("inventory", (p) => new InventoryKit(p));
|
|
12727
|
+
}
|
|
12728
|
+
/** The player's soft currencies. */
|
|
12729
|
+
get wallet() {
|
|
12730
|
+
return this.view("wallet", (p) => new WalletKit(p));
|
|
12731
|
+
}
|
|
12732
|
+
/** Experience, levels and public profiles. */
|
|
12733
|
+
get progression() {
|
|
12734
|
+
return this.view("progression", (p) => new ProgressionKit(p));
|
|
12735
|
+
}
|
|
12736
|
+
get achievements() {
|
|
12737
|
+
return this.view("achievements", (p) => new AchievementsKit(p));
|
|
12738
|
+
}
|
|
12739
|
+
/** Quests, first-session tutorials among them. */
|
|
12740
|
+
get quests() {
|
|
12741
|
+
return this.view("quests", (p) => new QuestsKit(p));
|
|
12742
|
+
}
|
|
12743
|
+
get crafting() {
|
|
12744
|
+
return this.view("crafting", (p) => new CraftingKit(p));
|
|
12745
|
+
}
|
|
12746
|
+
/** Loot tables with pity. */
|
|
12747
|
+
get loot() {
|
|
12748
|
+
return this.view("loot", (p) => new LootKit(p));
|
|
12749
|
+
}
|
|
12750
|
+
/** Idle production that catches up on the time away. */
|
|
12751
|
+
get production() {
|
|
12752
|
+
return this.view("production", (p) => new ProductionKit(p));
|
|
12753
|
+
}
|
|
12754
|
+
/** Markets' order books. */
|
|
12755
|
+
get market() {
|
|
12756
|
+
return this.view("market", () => new MarketsKit(this.marketCore));
|
|
12757
|
+
}
|
|
12758
|
+
/** Markets' vendors. */
|
|
12759
|
+
get shops() {
|
|
12760
|
+
return this.view("shops", () => new ShopsKit(this.marketCore));
|
|
12761
|
+
}
|
|
12762
|
+
/** Trades between two players at a market. */
|
|
12763
|
+
get trades() {
|
|
12764
|
+
return this.view("trades", () => new TradesKit(this.marketCore));
|
|
12765
|
+
}
|
|
11604
12766
|
/** Composing and deploying the app's tree of starter hubs (developers). */
|
|
11605
12767
|
get topology() {
|
|
11606
12768
|
return this.topologyKit ?? (this.topologyKit = new KitTopology(String(this.appId), this.domains.exec));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crowdedkingdoms/crowdy-dsh",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.9-dev.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -94,11 +94,11 @@
|
|
|
94
94
|
"crowdyDsh": {
|
|
95
95
|
"build": {
|
|
96
96
|
"package": "@crowdedkingdoms/crowdy-dsh",
|
|
97
|
-
"version": "0.4.
|
|
98
|
-
"builtAt": "2026-10-
|
|
97
|
+
"version": "0.4.9",
|
|
98
|
+
"builtAt": "2026-10-16T00:55:35.856Z",
|
|
99
99
|
"source": {
|
|
100
100
|
"repository": "CrowdedKingdoms/crowdy-dsh",
|
|
101
|
-
"commit": "
|
|
101
|
+
"commit": "00f9782d0b449acfcec6025c2e63d52298a0e1ef",
|
|
102
102
|
"dirty": false
|
|
103
103
|
},
|
|
104
104
|
"upstream": {
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
},
|
|
110
110
|
"crowdyjs": {
|
|
111
111
|
"name": "@crowdedkingdoms/crowdyjs",
|
|
112
|
-
"version": "18.
|
|
112
|
+
"version": "18.13.0-dev.1",
|
|
113
113
|
"source": "node_modules"
|
|
114
114
|
},
|
|
115
115
|
"files": {
|
|
@@ -206,7 +206,7 @@
|
|
|
206
206
|
"manifest.webmanifest": "sha256:9b54d57eea00f2fdd1affe6e7999a4209a515755f12ac1a3299da2d55e178d4c",
|
|
207
207
|
"preview/bootstrap-CYECZNXt.js": "sha256:9f303a0485c0badfdd19fad0c357ef050c5b9a343744ab5bf0c70015e7d95092",
|
|
208
208
|
"preview/crowdy-boot-Cklh1qNl.js": "sha256:b21e8eb126e1cd8a52159d2d577e610df6c8af36a436f9ed5028cfabd11a85ff",
|
|
209
|
-
"preview/vfs-image.tar.gz": "sha256:
|
|
209
|
+
"preview/vfs-image.tar.gz": "sha256:9eec4e84bf3530fa569beb85862ce4d5c4b914d49c3c86802fe3639e72bab6d0",
|
|
210
210
|
"preview/worker-C8-_ANaz.js": "sha256:81099e5732dfe0c32bacd5897316b7956c5a0a22da01b4a0c6e21d0a3b9d9aa1"
|
|
211
211
|
}
|
|
212
212
|
}
|