@crowdedkingdoms/crowdyjs 17.11.0-dev.1 → 17.13.0-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/MIGRATION.md +56 -0
- package/README.md +31 -1
- package/dist/crowdy-dsh/bridge.d.ts.map +1 -1
- package/dist/crowdy-dsh/bridge.js +2 -0
- package/dist/crowdy-studio/controller.d.ts +44 -0
- package/dist/crowdy-studio/controller.d.ts.map +1 -1
- package/dist/crowdy-studio/controller.js +185 -18
- package/dist/crowdy-studio/dom-shell.d.ts.map +1 -1
- package/dist/crowdy-studio/dom-shell.js +13 -8
- package/dist/crowdy-studio/embed/panel.d.ts +11 -1
- package/dist/crowdy-studio/embed/panel.d.ts.map +1 -1
- package/dist/crowdy-studio/embed/panel.js +6 -0
- package/dist/crowdy-studio/index.d.ts +2 -2
- package/dist/crowdy-studio/index.d.ts.map +1 -1
- package/dist/crowdy-studio/models.d.ts +1 -1
- package/dist/crowdy-studio/starter-projects.d.ts +14 -0
- package/dist/crowdy-studio/starter-projects.d.ts.map +1 -1
- package/dist/crowdy-studio/starter-projects.js +55 -5
- package/dist/domains/exec.d.ts +131 -6
- package/dist/domains/exec.d.ts.map +1 -1
- package/dist/domains/exec.js +156 -4
- package/dist/errors.d.ts +3 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/generated/graphql.d.ts +600 -0
- package/dist/generated/graphql.d.ts.map +1 -1
- package/dist/generated/graphql.js +33 -2
- package/dist/grid-scope.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/kit/npcs.d.ts.map +1 -1
- package/dist/kit/social.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/domains/exec.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { decode, encode } from '@msgpack/msgpack';
|
|
2
2
|
import { CrowdyError } from '../errors.js';
|
|
3
|
-
import { ExecActivateVersionDocument, ExecAppStatusDocument, ExecBuildDocument, ExecBuildStatusDocument, ExecConnectAsDeveloperDocument, ExecConnectDocument, ExecDeployDocument, ExecInstancesDocument, ExecLogsDocument, ExecSetEnabledDocument, ExecStartersDocument, ExecVersionsDocument, } from '../generated/graphql.js';
|
|
3
|
+
import { ExecActivateVersionDocument, ExecAppStatusDocument, ExecBuildDocument, ExecBuildStatusDocument, ExecConnectAsDeveloperDocument, ExecConnectDocument, ExecDeployDocument, ExecEndpointStatsDocument, ExecInstancesDocument, ExecLogsDocument, ExecAppModsDocument, ExecModBuildDocument, ExecModBuildStatusDocument, ExecModDeleteDocument, ExecModDeployDocument, ExecModInstallDocument, ExecModListingsDocument, ExecModLogsDocument, ExecModPublishDocument, ExecModScope, ExecModSetEnabledDocument, ExecModSetSwitchDocument, ExecModStarterDocument, ExecModSwitchesDocument, ExecModUnpublishDocument, ExecModsDocument, ExecMyModsDocument, ExecSetEnabledDocument, ExecStartersDocument, ExecVersionsDocument, } from '../generated/graphql.js';
|
|
4
|
+
export { ExecModScope };
|
|
4
5
|
/**
|
|
5
6
|
* ck-exec, the hub-and-spoke execution service (dev-tier preview).
|
|
6
7
|
*
|
|
@@ -45,16 +46,26 @@ const RETRYABLE = new Set([
|
|
|
45
46
|
'Unavailable',
|
|
46
47
|
'RateLimited',
|
|
47
48
|
]);
|
|
49
|
+
const RETRY_IN = /retry in (\d+) ms/;
|
|
48
50
|
/**
|
|
49
51
|
* A call, subscription or connection that ck-exec refused or could not complete.
|
|
50
52
|
* `status` is the platform's (`AppError` carries the handler's own message);
|
|
51
53
|
* `retryable` says whether trying again later can succeed.
|
|
54
|
+
*
|
|
55
|
+
* The SDK never retries a `Busy` reply. A gateway refuses a player's call over its
|
|
56
|
+
* limit (120 calls per 10 s per player and app on a host) as `Busy` with a message
|
|
57
|
+
* starting `rate limited`: `rateLimited` is then true and `retryAfterMs` says how long
|
|
58
|
+
* to wait. Calling again sooner is refused again and does not shorten the wait.
|
|
52
59
|
*/
|
|
53
60
|
export class CrowdyExecError extends CrowdyError {
|
|
54
61
|
constructor(status, message, cause) {
|
|
55
62
|
super({ message: `${status}: ${message}`, cause });
|
|
56
63
|
this.status = status;
|
|
57
64
|
this.retryable = RETRYABLE.has(status);
|
|
65
|
+
this.rateLimited =
|
|
66
|
+
status === 'RateLimited' || (status === 'Busy' && message.startsWith('rate limited'));
|
|
67
|
+
const retryIn = this.rateLimited ? RETRY_IN.exec(message) : null;
|
|
68
|
+
this.retryAfterMs = retryIn ? Number(retryIn[1]) : undefined;
|
|
58
69
|
}
|
|
59
70
|
}
|
|
60
71
|
const utf8 = new TextEncoder();
|
|
@@ -413,7 +424,7 @@ export class ExecConnection {
|
|
|
413
424
|
/**
|
|
414
425
|
* Calls a node's endpoint with raw bytes and returns the reply's bytes. A call
|
|
415
426
|
* whose connection closes, or that is answered `Moved`, is tried once more on a
|
|
416
|
-
* fresh connection.
|
|
427
|
+
* fresh connection. A `Busy` reply is not retried: see {@link CrowdyExecError.retryAfterMs}.
|
|
417
428
|
* @throws {CrowdyExecError} for any status but `Ok`.
|
|
418
429
|
*/
|
|
419
430
|
async callRaw(nodeType, key, method, payload = new Uint8Array(), options = {}) {
|
|
@@ -512,6 +523,20 @@ async function sha256Hex(bytes) {
|
|
|
512
523
|
const d = new Uint8Array(await crypto.subtle.digest('SHA-256', bytes));
|
|
513
524
|
return Array.from(d, (x) => x.toString(16).padStart(2, '0')).join('');
|
|
514
525
|
}
|
|
526
|
+
/** The node type players call a mod by: `mod:<name>`, keyed by its grid id. */
|
|
527
|
+
export function execModType(name) {
|
|
528
|
+
return `mod:${name}`;
|
|
529
|
+
}
|
|
530
|
+
function parseManifest(json) {
|
|
531
|
+
if (!json)
|
|
532
|
+
return null;
|
|
533
|
+
try {
|
|
534
|
+
return JSON.parse(json);
|
|
535
|
+
}
|
|
536
|
+
catch {
|
|
537
|
+
return null;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
515
540
|
function strip(v) {
|
|
516
541
|
const { __typename: _, ...rest } = v;
|
|
517
542
|
return rest;
|
|
@@ -563,10 +588,22 @@ export class ExecAPI {
|
|
|
563
588
|
const data = await this.graphql.request(ExecInstancesDocument, { appId });
|
|
564
589
|
return data.execInstances.map(strip);
|
|
565
590
|
}
|
|
566
|
-
/** The app's versions, newest first. Requires `view_compute_diagnostics`. */
|
|
591
|
+
/** The app's versions, newest first, with their manifests. Requires `view_compute_diagnostics`. */
|
|
567
592
|
async versions(appId) {
|
|
568
593
|
const data = await this.graphql.request(ExecVersionsDocument, { appId });
|
|
569
|
-
return data.execVersions.map(
|
|
594
|
+
return data.execVersions.map((v) => {
|
|
595
|
+
const version = strip(v);
|
|
596
|
+
return { ...version, manifest: parseManifest(version.manifestJson) };
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Calls to each endpoint of the app's code over the last `sinceMinutes` (default 60), by
|
|
601
|
+
* outcome and with their latency, most called first. Each host reports a minute once it
|
|
602
|
+
* ends. Requires `view_compute_diagnostics`.
|
|
603
|
+
*/
|
|
604
|
+
async endpointStats(appId, options = {}) {
|
|
605
|
+
const data = await this.graphql.request(ExecEndpointStatsDocument, { appId, ...options });
|
|
606
|
+
return data.execEndpointStats.map(strip);
|
|
570
607
|
}
|
|
571
608
|
/** The active version and the switches. Requires `view_compute_diagnostics`. */
|
|
572
609
|
async status(appId) {
|
|
@@ -648,6 +685,121 @@ export class ExecAPI {
|
|
|
648
685
|
await new Promise((r) => setTimeout(r, options.intervalMs ?? 2000));
|
|
649
686
|
}
|
|
650
687
|
}
|
|
688
|
+
// ---- mods: players' code on grids they own ----
|
|
689
|
+
/** The mod starter (`grid-mod`), a crate to build with {@link modBuild}. Requires access to the app. */
|
|
690
|
+
async modStarter(appId) {
|
|
691
|
+
const data = await this.graphql.request(ExecModStarterDocument, { appId });
|
|
692
|
+
const s = data.execModStarter;
|
|
693
|
+
return { crate: s.crate, nodeType: s.nodeType, description: s.description, files: s.files.map(strip) };
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Builds a mod from one `ckx-sdk` crate, as {@link build} does a developer's. Returns at
|
|
697
|
+
* once; wait with {@link waitForModBuild}, then {@link modDeploy}. One build at a time per
|
|
698
|
+
* player. Requires `write_server_code` in the app.
|
|
699
|
+
*/
|
|
700
|
+
async modBuild(appId, crate) {
|
|
701
|
+
const files = Array.isArray(crate.files)
|
|
702
|
+
? crate.files
|
|
703
|
+
: Object.entries(crate.files).map(([path, content]) => ({ path, content }));
|
|
704
|
+
const data = await this.graphql.request(ExecModBuildDocument, {
|
|
705
|
+
appId,
|
|
706
|
+
crate: { name: crate.name, files },
|
|
707
|
+
});
|
|
708
|
+
return build(data.execModBuild);
|
|
709
|
+
}
|
|
710
|
+
/** A mod build of yours. */
|
|
711
|
+
async modBuildStatus(appId, buildId) {
|
|
712
|
+
const data = await this.graphql.request(ExecModBuildStatusDocument, { appId, buildId });
|
|
713
|
+
return build(data.execModBuildStatus);
|
|
714
|
+
}
|
|
715
|
+
/** Polls a mod build until it succeeds or fails, like {@link waitForBuild}. */
|
|
716
|
+
async waitForModBuild(appId, buildId, options = {}) {
|
|
717
|
+
const until = Date.now() + (options.timeoutMs ?? 600000);
|
|
718
|
+
for (;;) {
|
|
719
|
+
const b = await this.modBuildStatus(appId, buildId);
|
|
720
|
+
if (b.status === 'succeeded' || b.status === 'failed')
|
|
721
|
+
return b;
|
|
722
|
+
if (Date.now() > until)
|
|
723
|
+
throw new CrowdyError({ message: `build ${buildId} is still ${b.status}` });
|
|
724
|
+
await new Promise((r) => setTimeout(r, options.intervalMs ?? 2000));
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
/**
|
|
728
|
+
* Deploys a mod build of yours to a grid you own: a new mod starts switched off, and a
|
|
729
|
+
* running one restarts on the new version. Requires being the grid's owner and
|
|
730
|
+
* `write_server_code` on the app tier and the grid.
|
|
731
|
+
*/
|
|
732
|
+
async modDeploy(appId, gridId, name, buildId) {
|
|
733
|
+
const data = await this.graphql.request(ExecModDeployDocument, { appId, gridId, name, buildId });
|
|
734
|
+
return strip(data.execModDeploy);
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* Switches a mod on your grid on or off. On, it runs as you once the app's code admission
|
|
738
|
+
* admits it. Requires `run_server_code` on the app tier and the grid.
|
|
739
|
+
*/
|
|
740
|
+
async modSetEnabled(appId, gridId, name, enabled) {
|
|
741
|
+
const data = await this.graphql.request(ExecModSetEnabledDocument, { appId, gridId, name, enabled });
|
|
742
|
+
return strip(data.execModSetEnabled);
|
|
743
|
+
}
|
|
744
|
+
/** Stops and removes a mod on your grid, with its state. */
|
|
745
|
+
async modDelete(appId, gridId, name) {
|
|
746
|
+
const data = await this.graphql.request(ExecModDeleteDocument, { appId, gridId, name });
|
|
747
|
+
return data.execModDelete;
|
|
748
|
+
}
|
|
749
|
+
/** A grid's mods, which players in it call as `mod:<name>` with the grid id as key. */
|
|
750
|
+
async mods(appId, gridId) {
|
|
751
|
+
const data = await this.graphql.request(ExecModsDocument, { appId, gridId });
|
|
752
|
+
return data.execMods.map(strip);
|
|
753
|
+
}
|
|
754
|
+
/** Your mods in the app, on every grid. */
|
|
755
|
+
async myMods(appId) {
|
|
756
|
+
const data = await this.graphql.request(ExecMyModsDocument, { appId });
|
|
757
|
+
return data.execMyMods.map(strip);
|
|
758
|
+
}
|
|
759
|
+
/** A mod of yours' guest log lines, newest first. */
|
|
760
|
+
async modLogs(appId, gridId, name, options = {}) {
|
|
761
|
+
const data = await this.graphql.request(ExecModLogsDocument, { appId, gridId, name, ...options });
|
|
762
|
+
return data.execModLogs.map(strip);
|
|
763
|
+
}
|
|
764
|
+
/** Publishes a mod of yours, at its current version, for other grid owners to install. */
|
|
765
|
+
async modPublish(appId, gridId, name, title, description) {
|
|
766
|
+
const data = await this.graphql.request(ExecModPublishDocument, { appId, gridId, name, title, description });
|
|
767
|
+
return strip(data.execModPublish);
|
|
768
|
+
}
|
|
769
|
+
/** The app's listed mods, most installed first. */
|
|
770
|
+
async modListings(appId) {
|
|
771
|
+
const data = await this.graphql.request(ExecModListingsDocument, { appId });
|
|
772
|
+
return data.execModListings.map(strip);
|
|
773
|
+
}
|
|
774
|
+
/** Delists a listing you published; installed copies keep running. */
|
|
775
|
+
async modUnpublish(appId, listingId) {
|
|
776
|
+
const data = await this.graphql.request(ExecModUnpublishDocument, { appId, listingId });
|
|
777
|
+
return data.execModUnpublish;
|
|
778
|
+
}
|
|
779
|
+
/** Installs a listing onto a grid you own as your own mod, switched off. */
|
|
780
|
+
async modInstall(appId, gridId, name, listingId) {
|
|
781
|
+
const data = await this.graphql.request(ExecModInstallDocument, { appId, gridId, name, listingId });
|
|
782
|
+
return strip(data.execModInstall);
|
|
783
|
+
}
|
|
784
|
+
/** The app's mods by grid or owner, or all of them. Requires `view_compute_diagnostics`. */
|
|
785
|
+
async appMods(appId, options = {}) {
|
|
786
|
+
const data = await this.graphql.request(ExecAppModsDocument, { appId, ...options });
|
|
787
|
+
return data.execAppMods.map(strip);
|
|
788
|
+
}
|
|
789
|
+
/** The app's mod switches that are off. Requires `view_compute_diagnostics`. */
|
|
790
|
+
async modSwitches(appId) {
|
|
791
|
+
const data = await this.graphql.request(ExecModSwitchesDocument, { appId });
|
|
792
|
+
return data.execModSwitches.map(strip);
|
|
793
|
+
}
|
|
794
|
+
/**
|
|
795
|
+
* The mods kill ladder: switch off (or on) one mod (`target`: its mod id), a player's mods
|
|
796
|
+
* (their user id), a grid's (its id), a listing's installs (its id), or every mod in the
|
|
797
|
+
* app (no target). Returns the switches that are off. Requires `manage_compute`.
|
|
798
|
+
*/
|
|
799
|
+
async modSetSwitch(appId, scope, off, options = {}) {
|
|
800
|
+
const data = await this.graphql.request(ExecModSetSwitchDocument, { appId, scope, off, ...options });
|
|
801
|
+
return data.execModSetSwitch.map(strip);
|
|
802
|
+
}
|
|
651
803
|
/** A host for this player and its connect token (valid for about a minute). */
|
|
652
804
|
async endpoint(appId, options = {}) {
|
|
653
805
|
const data = await this.graphql.request(ExecConnectDocument, {
|
package/dist/errors.d.ts
CHANGED
|
@@ -175,7 +175,9 @@ export type CrowdyFaultBlame = 'PLATFORM' | 'AUTHOR' | 'BUDGET';
|
|
|
175
175
|
* reads the full detail in the Crowdy console. Treat it as an open union: the server may
|
|
176
176
|
* add a code, and a client that switches on it should have a default branch.
|
|
177
177
|
*/
|
|
178
|
-
export type CrowdyFaultCode = 'USER_CODE_ERROR' | 'USER_CODE_TOO_SLOW' | 'USER_CODE_LIMIT_EXCEEDED' | 'PLATFORM_BUSY' | 'PLATFORM_ERROR' | 'BUDGET_EXCEEDED' | 'RATE_LIMITED' | 'QUOTA_EXHAUSTED' | 'CIRCUIT_OPEN' | 'TEMPORARILY_DISABLED' | 'INVALID_REQUEST' | 'NOT_ALLOWED' | 'NOT_FOUND' | 'UNAUTHENTICATED' | 'WRONG_DATACENTER' | 'APP_UNAVAILABLE'
|
|
178
|
+
export type CrowdyFaultCode = 'USER_CODE_ERROR' | 'USER_CODE_TOO_SLOW' | 'USER_CODE_LIMIT_EXCEEDED' | 'PLATFORM_BUSY' | 'PLATFORM_ERROR' | 'BUDGET_EXCEEDED' | 'RATE_LIMITED' | 'QUOTA_EXHAUSTED' | 'CIRCUIT_OPEN' | 'TEMPORARILY_DISABLED' | 'INVALID_REQUEST' | 'NOT_ALLOWED' | 'NOT_FOUND' | 'UNAUTHENTICATED' | 'WRONG_DATACENTER' | 'APP_UNAVAILABLE'
|
|
179
|
+
/** The tier switched the legacy engine off (compute, player compute, game model); never retryable. */
|
|
180
|
+
| 'ENGINE_SWITCHED_OFF' | (string & {});
|
|
179
181
|
/** What the platform says about a failure, in the only vocabulary a player is shown. */
|
|
180
182
|
export interface CrowdyPlayerFault {
|
|
181
183
|
/** A stable, enumerated reason. Branch on this, never on a message. */
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,iFAAiF;AACjF,MAAM,WAAW,yBAAyB;IACxC,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC/B,2EAA2E;IAC3E,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACpC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,oEAAoE;AACpE,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,yDAAyD;IACzD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEb,OAAO,EAAE,kBAAkB;CAKxC;AAED;;;;;;GAMG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAKzC;AAED;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,SAAQ,WAAW;IACjD,oEAAoE;IACpE,QAAQ,CAAC,aAAa,EAAE,yBAAyB,EAAE,CAAC;gBAExC,MAAM,EAAE,yBAAyB,EAAE;IAK/C;;;;;;OAMG;IACH,IAAI,IAAI,IAAI,OAAO,CAElB;IAED;;;;OAIG;IACH,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAEpD;CACF;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD,0EAA0E;AAC1E,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,yBAA0B,SAAQ,kBAAkB;IAC/D,8DAA8D;IAC9D,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAG9B;IAED;;;OAGG;IACH,IAAI,aAAa,IAAI,MAAM,GAAG,SAAS,CAGtC;IAED;;;;;OAKG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,oBAAoB,GACpB,0BAA0B,GAC1B,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,iBAAiB,GACjB,cAAc,GACd,sBAAsB,GACtB,iBAAiB,GACjB,aAAa,GACb,WAAW,GACX,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|