@indiegems/gem-web-sdk 16.1.0 → 16.3.0
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/CHANGELOG.md +26 -0
- package/README.md +2 -1
- package/dist/function.d.ts +27 -3
- package/dist/game.d.ts +77 -4
- package/dist/gem-web-sdk.conformance.js +3 -3
- package/dist/gem-web-sdk.esm.js +3 -3
- package/dist/gem-web-sdk.function.js +3 -3
- package/dist/gem-web-sdk.game.js +3 -3
- package/dist/gem-web-sdk.min.js +3 -3
- package/dist/gem-web-sdk.sdk.js +3 -3
- package/dist/gem-web-sdk.server.js +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/sdk.d.ts +79 -4
- package/dist/server-api.d.ts +3 -0
- package/dist/server.d.ts +3 -0
- package/docs/api/api-reference-function.md +169 -5
- package/docs/api/api-reference-game.md +594 -5
- package/docs/api/api-reference-server.md +1 -1
- package/docs/api/reference.json +761 -17
- package/docs/arcade-and-store.md +6 -0
- package/docs/brand-art.md +14 -3
- package/docs/branding.md +160 -0
- package/docs/changelog.md +26 -0
- package/docs/getting-started.md +1 -1
- package/docs/manifest.json +17 -12
- package/docs/saving-player-progress.md +171 -5
- package/docs/server-bundles.md +2 -2
- package/package.json +1 -1
package/docs/api/reference.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema_version": 2,
|
|
3
3
|
"source": {
|
|
4
4
|
"repo": "IndieGems/gem-web-sdk",
|
|
5
|
-
"version": "16.
|
|
5
|
+
"version": "16.3.0"
|
|
6
6
|
},
|
|
7
7
|
"entries": [
|
|
8
8
|
{
|
|
@@ -77,6 +77,10 @@
|
|
|
77
77
|
"key": "store",
|
|
78
78
|
"title": "The Arcade Store, for real money"
|
|
79
79
|
},
|
|
80
|
+
{
|
|
81
|
+
"key": "branding",
|
|
82
|
+
"title": "The platform branding: logo, wordmark, currency marks"
|
|
83
|
+
},
|
|
80
84
|
{
|
|
81
85
|
"key": "vibration",
|
|
82
86
|
"title": "Vibrating the device"
|
|
@@ -2805,7 +2809,7 @@
|
|
|
2805
2809
|
"group": "saves",
|
|
2806
2810
|
"signature": "readonly etag: string",
|
|
2807
2811
|
"documented": true,
|
|
2808
|
-
"summary": "This save's version, which changes whenever the save does.\n\nNOT something to pass back on a write —
|
|
2812
|
+
"summary": "This save's version, which changes whenever the save does.\n\nNOT something to pass back on a write — the SDK remembers the version of\neach slot you last loaded or wrote and sends it for you, so a write that\nwould replace a save you never saw is refused as `save_conflict`. This is\nhow a game holding a copy tells whether the stored save is still the one\nit has.",
|
|
2809
2813
|
"deprecated": null,
|
|
2810
2814
|
"params": [],
|
|
2811
2815
|
"returns": null,
|
|
@@ -2936,9 +2940,9 @@
|
|
|
2936
2940
|
"name": "reason",
|
|
2937
2941
|
"anchor": "gemsaveerror-reason",
|
|
2938
2942
|
"group": "failures",
|
|
2939
|
-
"signature": "readonly reason: \"upload_failed\" | \"download_failed\" | \"save_timeout\" | \"save_malformed\"",
|
|
2943
|
+
"signature": "readonly reason: \"upload_failed\" | \"download_failed\" | \"save_timeout\" | \"save_malformed\" | \"save_conflict\" | \"load_failed\"",
|
|
2940
2944
|
"documented": true,
|
|
2941
|
-
"summary": "Which part failed.\n\n- `upload_failed` — the bytes could not be written to storage.\n- `download_failed` — the stored bytes could not be fetched.\n- `save_timeout` — a hop did not finish in the time the call allows.\n- `save_malformed` — the answer, or the stored payload, was not what it\n claims to be.\n\n`save_timeout`, and a one-off `upload_failed` or `download_failed`, are\nworth one retry. `save_malformed` is not: the same bytes will fail the\nsame way.\n\nAn `upload_failed` that repeats on EVERY save, for every player, is not\ntransient either — it is a platform-side misconfiguration, and retrying\nis a loop rather than a recovery. See the saves guide.",
|
|
2945
|
+
"summary": "Which part failed.\n\n- `upload_failed` — the bytes could not be written to storage.\n- `download_failed` — the stored bytes could not be fetched.\n- `save_timeout` — a hop did not finish in the time the call allows.\n- `save_malformed` — the answer, or the stored payload, was not what it\n claims to be.\n- `save_conflict` — a write was refused because the stored save changed\n since this game last loaded or wrote it: another device or tab saved\n in between. Nothing was written.\n- `load_failed` — a write was refused before anything was sent, because\n the last load of this slot failed, so what the write would replace is\n unknown — it could be the player's real progress.\n\n`save_timeout`, and a one-off `upload_failed` or `download_failed`, are\nworth one retry. `save_malformed` is not: the same bytes will fail the\nsame way.\n\nNeither is `save_conflict` or `load_failed`: resending the same write\nfails the same way. Load the slot again and decide what to write from\nwhat is stored — merge, or ask the player. Pass `overwrite: true` only to\nreplace whatever is stored on purpose.\n\nAn `upload_failed` that repeats on EVERY save, for every player, is not\ntransient either — it is a platform-side misconfiguration, and retrying\nis a loop rather than a recovery. See the saves guide.\n\nA RATE LIMIT IS NOT ONE OF THESE. Refused for the rate on any leg — the\nplatform, the upload, the download — a save or load rejects as\n`GemApiError` reason `rate_limited`, with `retryAfterSeconds` when a wait\nwas named.",
|
|
2942
2946
|
"deprecated": null,
|
|
2943
2947
|
"params": [],
|
|
2944
2948
|
"returns": null,
|
|
@@ -2991,7 +2995,7 @@
|
|
|
2991
2995
|
"group": "saves",
|
|
2992
2996
|
"signature": "readonly signal?: AbortSignal",
|
|
2993
2997
|
"documented": true,
|
|
2994
|
-
"summary": "Cancel the write.\n\nA save is several hops, so a cancelled write can land after the platform\nhas already agreed to it. Re-read rather than assuming nothing was stored.",
|
|
2998
|
+
"summary": "Cancel the write.\n\nA save is several hops, so a cancelled write can land after the platform\nhas already agreed to it. Re-read rather than assuming nothing was stored.\n\nA write that replaced earlier ones still waiting on its slot carries them,\nso cancelling it before it goes out cancels them too. Cancelling a write\nthat a later one replaced rejects only this call; the later write goes on.",
|
|
2995
2999
|
"deprecated": null,
|
|
2996
3000
|
"params": [],
|
|
2997
3001
|
"returns": null,
|
|
@@ -3007,7 +3011,39 @@
|
|
|
3007
3011
|
"group": "saves",
|
|
3008
3012
|
"signature": "readonly timeoutMs?: number",
|
|
3009
3013
|
"documented": true,
|
|
3010
|
-
"summary": "How long this whole save may take, every hop together. Overrides the 30\nsecond default.\n\nSET THIS WHEN YOU ARE RACING A CLOCK YOU DO NOT CONTROL — above all when\nsaving from [GemTerminationNotice](api-reference-game.md#gemterminationnotice), whose `graceMs` can be shorter\nthan the default. Left at the default in that case a save is killed\nmid-flight: the promise never settles, nothing is logged, and the player\nloses progress silently. Set it to the budget you actually have and a save\nthat will not make it rejects as `save_timeout` while there is still time\nto do something about it.\n\nIt does not make a save faster. Three round trips plus the payload is what\na save costs; this only decides when to stop waiting.",
|
|
3014
|
+
"summary": "How long this whole save may take, every hop together. Overrides the 30\nsecond default.\n\nSET THIS WHEN YOU ARE RACING A CLOCK YOU DO NOT CONTROL — above all when\nsaving from [GemTerminationNotice](api-reference-game.md#gemterminationnotice), whose `graceMs` can be shorter\nthan the default. Left at the default in that case a save is killed\nmid-flight: the promise never settles, nothing is logged, and the player\nloses progress silently. Set it to the budget you actually have and a save\nthat will not make it rejects as `save_timeout` while there is still time\nto do something about it.\n\nIt does not make a save faster. Three round trips plus the payload is what\na save costs; this only decides when to stop waiting.\n\nIt counts from the call, so a write waiting for the one before it on the\nsame slot spends it waiting. A rate limit whose wait it will not cover\nrejects at once as `GemApiError` reason `rate_limited`, not as\n`save_timeout`.\n\nIt stays this call's when a later write replaces this one: running out\nrejects only this call, and the later write goes on. The write that is\nsent runs on the newest call's `timeoutMs`, and running out of that rejects\nevery call it carries.",
|
|
3015
|
+
"deprecated": null,
|
|
3016
|
+
"params": [],
|
|
3017
|
+
"returns": null,
|
|
3018
|
+
"throws": null,
|
|
3019
|
+
"example": null,
|
|
3020
|
+
"defaultValue": null,
|
|
3021
|
+
"guides": []
|
|
3022
|
+
},
|
|
3023
|
+
{
|
|
3024
|
+
"id": "PutSaveOptions.teardown",
|
|
3025
|
+
"name": "teardown",
|
|
3026
|
+
"anchor": "putsaveoptions-teardown",
|
|
3027
|
+
"group": "saves",
|
|
3028
|
+
"signature": "readonly teardown?: boolean",
|
|
3029
|
+
"documented": true,
|
|
3030
|
+
"summary": "This is the last write before the page goes away: send it without waiting\nfor the spacing between writes to one slot.\n\nWrites to one slot go out a few seconds apart, and a write made sooner\nwaits its turn. Set this on the write you make from\n[GemTerminationNotice](api-reference-game.md#gemterminationnotice) or `pagehide`, with a `timeoutMs` inside the\ntime you have.\n\nIT STILL WAITS FOR A WRITE ALREADY IN FLIGHT to the same slot, and it\nstill honours a rate-limit hold: when the hold outlasts `timeoutMs` the\nwrite rejects at once as `rate_limited`, and nothing is sent. Not for\nordinary saves — the spacing is what keeps a save loop from spending the\nrate limit.\n\nA later write that replaces this one while it waits keeps it: the write\nthat goes out skips the spacing when any call it carries set `teardown`.\nNot across a player change: a call replaced after the signed-in player\nchanged is refused as `save_conflict`, and its `teardown` goes with it.",
|
|
3031
|
+
"deprecated": null,
|
|
3032
|
+
"params": [],
|
|
3033
|
+
"returns": null,
|
|
3034
|
+
"throws": null,
|
|
3035
|
+
"example": null,
|
|
3036
|
+
"defaultValue": null,
|
|
3037
|
+
"guides": []
|
|
3038
|
+
},
|
|
3039
|
+
{
|
|
3040
|
+
"id": "PutSaveOptions.overwrite",
|
|
3041
|
+
"name": "overwrite",
|
|
3042
|
+
"anchor": "putsaveoptions-overwrite",
|
|
3043
|
+
"group": "saves",
|
|
3044
|
+
"signature": "readonly overwrite?: boolean",
|
|
3045
|
+
"documented": true,
|
|
3046
|
+
"summary": "Write even if it replaces a save this game has not loaded.\n\nWithout it, a write to a slot whose last load FAILED is refused as\n`load_failed`, and a write is refused as `save_conflict` when the stored\nsave changed since you last loaded or wrote it. Both refusals protect the\nplayer's real progress from a game that started from defaults.\n\nSet it only when replacing whatever is stored is what you mean — a \"new\ngame\" the player confirmed, or the player choosing this device's progress\nafter a conflict. Never set it to get past a failed load.\n\nA later write that replaces this one while it waits keeps it: the write\nthat goes out overwrites when any call it carries set `overwrite`. A call\nthat gives up first (its `signal` or `timeoutMs`) takes it back, and so\ndoes one replaced after the signed-in player changed: it is refused as\n`save_conflict`, so one player's \"new game\" never overwrites the next's.",
|
|
3011
3047
|
"deprecated": null,
|
|
3012
3048
|
"params": [],
|
|
3013
3049
|
"returns": null,
|
|
@@ -3060,7 +3096,7 @@
|
|
|
3060
3096
|
"group": "saves",
|
|
3061
3097
|
"signature": "readonly signal?: AbortSignal",
|
|
3062
3098
|
"documented": true,
|
|
3063
|
-
"summary": "Cancel the write.\n\nA save is several hops, so a cancelled write can land after the platform\nhas already agreed to it. Re-read rather than assuming nothing was stored.",
|
|
3099
|
+
"summary": "Cancel the write.\n\nA save is several hops, so a cancelled write can land after the platform\nhas already agreed to it. Re-read rather than assuming nothing was stored.\n\nA write that replaced earlier ones still waiting on its slot carries them,\nso cancelling it before it goes out cancels them too. Cancelling a write\nthat a later one replaced rejects only this call; the later write goes on.",
|
|
3064
3100
|
"deprecated": null,
|
|
3065
3101
|
"params": [],
|
|
3066
3102
|
"returns": null,
|
|
@@ -3076,7 +3112,39 @@
|
|
|
3076
3112
|
"group": "saves",
|
|
3077
3113
|
"signature": "readonly timeoutMs?: number",
|
|
3078
3114
|
"documented": true,
|
|
3079
|
-
"summary": "How long this whole save may take, every hop together. Overrides the 30\nsecond default.\n\nSET THIS WHEN YOU ARE RACING A CLOCK YOU DO NOT CONTROL — above all when\nsaving from [GemTerminationNotice](api-reference-game.md#gemterminationnotice), whose `graceMs` can be shorter\nthan the default. Left at the default in that case a save is killed\nmid-flight: the promise never settles, nothing is logged, and the player\nloses progress silently. Set it to the budget you actually have and a save\nthat will not make it rejects as `save_timeout` while there is still time\nto do something about it.\n\nIt does not make a save faster. Three round trips plus the payload is what\na save costs; this only decides when to stop waiting.",
|
|
3115
|
+
"summary": "How long this whole save may take, every hop together. Overrides the 30\nsecond default.\n\nSET THIS WHEN YOU ARE RACING A CLOCK YOU DO NOT CONTROL — above all when\nsaving from [GemTerminationNotice](api-reference-game.md#gemterminationnotice), whose `graceMs` can be shorter\nthan the default. Left at the default in that case a save is killed\nmid-flight: the promise never settles, nothing is logged, and the player\nloses progress silently. Set it to the budget you actually have and a save\nthat will not make it rejects as `save_timeout` while there is still time\nto do something about it.\n\nIt does not make a save faster. Three round trips plus the payload is what\na save costs; this only decides when to stop waiting.\n\nIt counts from the call, so a write waiting for the one before it on the\nsame slot spends it waiting. A rate limit whose wait it will not cover\nrejects at once as `GemApiError` reason `rate_limited`, not as\n`save_timeout`.\n\nIt stays this call's when a later write replaces this one: running out\nrejects only this call, and the later write goes on. The write that is\nsent runs on the newest call's `timeoutMs`, and running out of that rejects\nevery call it carries.",
|
|
3116
|
+
"deprecated": null,
|
|
3117
|
+
"params": [],
|
|
3118
|
+
"returns": null,
|
|
3119
|
+
"throws": null,
|
|
3120
|
+
"example": null,
|
|
3121
|
+
"defaultValue": null,
|
|
3122
|
+
"guides": []
|
|
3123
|
+
},
|
|
3124
|
+
{
|
|
3125
|
+
"id": "PutBytesOptions.teardown",
|
|
3126
|
+
"name": "teardown",
|
|
3127
|
+
"anchor": "putbytesoptions-teardown",
|
|
3128
|
+
"group": "saves",
|
|
3129
|
+
"signature": "readonly teardown?: boolean",
|
|
3130
|
+
"documented": true,
|
|
3131
|
+
"summary": "This is the last write before the page goes away: send it without waiting\nfor the spacing between writes to one slot.\n\nWrites to one slot go out a few seconds apart, and a write made sooner\nwaits its turn. Set this on the write you make from\n[GemTerminationNotice](api-reference-game.md#gemterminationnotice) or `pagehide`, with a `timeoutMs` inside the\ntime you have.\n\nIT STILL WAITS FOR A WRITE ALREADY IN FLIGHT to the same slot, and it\nstill honours a rate-limit hold: when the hold outlasts `timeoutMs` the\nwrite rejects at once as `rate_limited`, and nothing is sent. Not for\nordinary saves — the spacing is what keeps a save loop from spending the\nrate limit.\n\nA later write that replaces this one while it waits keeps it: the write\nthat goes out skips the spacing when any call it carries set `teardown`.\nNot across a player change: a call replaced after the signed-in player\nchanged is refused as `save_conflict`, and its `teardown` goes with it.",
|
|
3132
|
+
"deprecated": null,
|
|
3133
|
+
"params": [],
|
|
3134
|
+
"returns": null,
|
|
3135
|
+
"throws": null,
|
|
3136
|
+
"example": null,
|
|
3137
|
+
"defaultValue": null,
|
|
3138
|
+
"guides": []
|
|
3139
|
+
},
|
|
3140
|
+
{
|
|
3141
|
+
"id": "PutBytesOptions.overwrite",
|
|
3142
|
+
"name": "overwrite",
|
|
3143
|
+
"anchor": "putbytesoptions-overwrite",
|
|
3144
|
+
"group": "saves",
|
|
3145
|
+
"signature": "readonly overwrite?: boolean",
|
|
3146
|
+
"documented": true,
|
|
3147
|
+
"summary": "Write even if it replaces a save this game has not loaded.\n\nWithout it, a write to a slot whose last load FAILED is refused as\n`load_failed`, and a write is refused as `save_conflict` when the stored\nsave changed since you last loaded or wrote it. Both refusals protect the\nplayer's real progress from a game that started from defaults.\n\nSet it only when replacing whatever is stored is what you mean — a \"new\ngame\" the player confirmed, or the player choosing this device's progress\nafter a conflict. Never set it to get past a failed load.\n\nA later write that replaces this one while it waits keeps it: the write\nthat goes out overwrites when any call it carries set `overwrite`. A call\nthat gives up first (its `signal` or `timeoutMs`) takes it back, and so\ndoes one replaced after the signed-in player changed: it is refused as\n`save_conflict`, so one player's \"new game\" never overwrites the next's.",
|
|
3080
3148
|
"deprecated": null,
|
|
3081
3149
|
"params": [],
|
|
3082
3150
|
"returns": null,
|
|
@@ -3108,7 +3176,7 @@
|
|
|
3108
3176
|
"group": "saves",
|
|
3109
3177
|
"signature": "class SavesApi",
|
|
3110
3178
|
"documented": true,
|
|
3111
|
-
"summary": "A player's saved progress — write it, read it, list it, delete it.\n\nReached as `gem.me.saves`, and on a character as\n`gem.characters.get(id).saves`.\n\nA SAVE GOES IN A SLOT YOU DECLARED. Slots live in your game config, published\nwith `gemctl`, next to your room templates. Writing to a slot that was never\ndeclared fails as `not_found` naming the key, on the first call and every\nretry — that is the wall almost everyone hits first, and it is a config\nproblem rather than a code one.\n\n```js\nawait gem.me.saves.put('slot1', { level: 7, checkpoint: 'bridge' });\nconst state = await gem.me.saves.get('slot1');\n```\n\nWHAT IS DELIBERATELY NOT HERE: no autosave timer, no save format, no\nmigration. Those are your game's, and a platform that guessed at them would\nguess wrong.",
|
|
3179
|
+
"summary": "A player's saved progress — write it, read it, list it, delete it.\n\nReached as `gem.me.saves`, and on a character as\n`gem.characters.get(id).saves`.\n\nA SAVE GOES IN A SLOT YOU DECLARED. Slots live in your game config, published\nwith `gemctl`, next to your room templates. Writing to a slot that was never\ndeclared fails as `not_found` naming the key, on the first call and every\nretry — that is the wall almost everyone hits first, and it is a config\nproblem rather than a code one.\n\n```js\nawait gem.me.saves.put('slot1', { level: 7, checkpoint: 'bridge' });\nconst state = await gem.me.saves.get('slot1');\n```\n\nLOAD BEFORE YOU SAVE. Each write carries the version of the slot your last\nload or write found, so a write that would replace a save this game has not\nseen — another device's, or the player's real progress after a load that\nfailed — is refused as `save_conflict` or `load_failed` rather than stored.\nAfter a failed load, play on without saving and load again later; pass\n`overwrite: true` only when the player chose to start over.\n\nONE WRITE PER SLOT AT A TIME. A write made while another to the same slot is\nin flight waits for it, and a later one replaces it: the newest value is the\none sent, and every caller it replaced resolves with it, keeping its own\n`signal`, `timeoutMs`, `teardown` and `overwrite`. Writes to one slot\ngo out a few seconds apart (`teardown: true` skips that), and after a\n`rate_limited` answer none goes out until the wait it named is over.\n\nWHAT IS DELIBERATELY NOT HERE: no autosave timer, no save format, no\nmigration. Those are your game's, and a platform that guessed at them would\nguess wrong.",
|
|
3112
3180
|
"deprecated": null,
|
|
3113
3181
|
"params": [],
|
|
3114
3182
|
"returns": null,
|
|
@@ -6562,6 +6630,597 @@
|
|
|
6562
6630
|
"defaultValue": null,
|
|
6563
6631
|
"guides": []
|
|
6564
6632
|
},
|
|
6633
|
+
{
|
|
6634
|
+
"id": "BrandingTheme",
|
|
6635
|
+
"name": "BrandingTheme",
|
|
6636
|
+
"anchor": "brandingtheme",
|
|
6637
|
+
"group": "branding",
|
|
6638
|
+
"signature": "type BrandingTheme = \"light\" | \"dark\"",
|
|
6639
|
+
"documented": true,
|
|
6640
|
+
"summary": "A theme a variant is drawn for.",
|
|
6641
|
+
"deprecated": null,
|
|
6642
|
+
"params": [],
|
|
6643
|
+
"returns": null,
|
|
6644
|
+
"throws": null,
|
|
6645
|
+
"example": null,
|
|
6646
|
+
"defaultValue": null,
|
|
6647
|
+
"guides": []
|
|
6648
|
+
},
|
|
6649
|
+
{
|
|
6650
|
+
"id": "BrandingVariant",
|
|
6651
|
+
"name": "BrandingVariant",
|
|
6652
|
+
"anchor": "brandingvariant",
|
|
6653
|
+
"group": "branding",
|
|
6654
|
+
"signature": "interface BrandingVariant",
|
|
6655
|
+
"documented": true,
|
|
6656
|
+
"summary": "One file of a [BrandingAsset](api-reference-game.md#brandingasset): a render at one size and density, a\nscalable image, or the one file of a sound or a font.",
|
|
6657
|
+
"deprecated": null,
|
|
6658
|
+
"params": [],
|
|
6659
|
+
"returns": null,
|
|
6660
|
+
"throws": null,
|
|
6661
|
+
"example": null,
|
|
6662
|
+
"defaultValue": null,
|
|
6663
|
+
"guides": []
|
|
6664
|
+
},
|
|
6665
|
+
{
|
|
6666
|
+
"id": "BrandingVariant.url",
|
|
6667
|
+
"name": "url",
|
|
6668
|
+
"anchor": "brandingvariant-url",
|
|
6669
|
+
"group": "branding",
|
|
6670
|
+
"signature": "readonly url: string",
|
|
6671
|
+
"documented": true,
|
|
6672
|
+
"summary": "The file's URL, absolute and on the platform's own host. Content-hashed,\nso a re-render is a new URL: look it up each session rather than storing\none in a save or your build.",
|
|
6673
|
+
"deprecated": null,
|
|
6674
|
+
"params": [],
|
|
6675
|
+
"returns": null,
|
|
6676
|
+
"throws": null,
|
|
6677
|
+
"example": null,
|
|
6678
|
+
"defaultValue": null,
|
|
6679
|
+
"guides": []
|
|
6680
|
+
},
|
|
6681
|
+
{
|
|
6682
|
+
"id": "BrandingVariant.type",
|
|
6683
|
+
"name": "type",
|
|
6684
|
+
"anchor": "brandingvariant-type",
|
|
6685
|
+
"group": "branding",
|
|
6686
|
+
"signature": "readonly type: string",
|
|
6687
|
+
"documented": true,
|
|
6688
|
+
"summary": "Its MIME type, such as `image/png` or `image/svg+xml`.",
|
|
6689
|
+
"deprecated": null,
|
|
6690
|
+
"params": [],
|
|
6691
|
+
"returns": null,
|
|
6692
|
+
"throws": null,
|
|
6693
|
+
"example": null,
|
|
6694
|
+
"defaultValue": null,
|
|
6695
|
+
"guides": []
|
|
6696
|
+
},
|
|
6697
|
+
{
|
|
6698
|
+
"id": "BrandingVariant.bytes",
|
|
6699
|
+
"name": "bytes",
|
|
6700
|
+
"anchor": "brandingvariant-bytes",
|
|
6701
|
+
"group": "branding",
|
|
6702
|
+
"signature": "readonly bytes: number",
|
|
6703
|
+
"documented": true,
|
|
6704
|
+
"summary": "Its size in bytes.",
|
|
6705
|
+
"deprecated": null,
|
|
6706
|
+
"params": [],
|
|
6707
|
+
"returns": null,
|
|
6708
|
+
"throws": null,
|
|
6709
|
+
"example": null,
|
|
6710
|
+
"defaultValue": null,
|
|
6711
|
+
"guides": []
|
|
6712
|
+
},
|
|
6713
|
+
{
|
|
6714
|
+
"id": "BrandingVariant.width",
|
|
6715
|
+
"name": "width",
|
|
6716
|
+
"anchor": "brandingvariant-width",
|
|
6717
|
+
"group": "branding",
|
|
6718
|
+
"signature": "readonly width?: number",
|
|
6719
|
+
"documented": true,
|
|
6720
|
+
"summary": "An image's width in pixels (an SVG's in its viewBox units).",
|
|
6721
|
+
"deprecated": null,
|
|
6722
|
+
"params": [],
|
|
6723
|
+
"returns": null,
|
|
6724
|
+
"throws": null,
|
|
6725
|
+
"example": null,
|
|
6726
|
+
"defaultValue": null,
|
|
6727
|
+
"guides": []
|
|
6728
|
+
},
|
|
6729
|
+
{
|
|
6730
|
+
"id": "BrandingVariant.height",
|
|
6731
|
+
"name": "height",
|
|
6732
|
+
"anchor": "brandingvariant-height",
|
|
6733
|
+
"group": "branding",
|
|
6734
|
+
"signature": "readonly height?: number",
|
|
6735
|
+
"documented": true,
|
|
6736
|
+
"summary": "An image's height in pixels (an SVG's in its viewBox units).",
|
|
6737
|
+
"deprecated": null,
|
|
6738
|
+
"params": [],
|
|
6739
|
+
"returns": null,
|
|
6740
|
+
"throws": null,
|
|
6741
|
+
"example": null,
|
|
6742
|
+
"defaultValue": null,
|
|
6743
|
+
"guides": []
|
|
6744
|
+
},
|
|
6745
|
+
{
|
|
6746
|
+
"id": "BrandingVariant.size",
|
|
6747
|
+
"name": "size",
|
|
6748
|
+
"anchor": "brandingvariant-size",
|
|
6749
|
+
"group": "branding",
|
|
6750
|
+
"signature": "readonly size?: number",
|
|
6751
|
+
"documented": true,
|
|
6752
|
+
"summary": "The CSS px box this render was made for, with [BrandingVariant.density](api-reference-game.md#brandingvariant-density).\nAbsent on a render meant for any box up to its width.",
|
|
6753
|
+
"deprecated": null,
|
|
6754
|
+
"params": [],
|
|
6755
|
+
"returns": null,
|
|
6756
|
+
"throws": null,
|
|
6757
|
+
"example": null,
|
|
6758
|
+
"defaultValue": null,
|
|
6759
|
+
"guides": []
|
|
6760
|
+
},
|
|
6761
|
+
{
|
|
6762
|
+
"id": "BrandingVariant.density",
|
|
6763
|
+
"name": "density",
|
|
6764
|
+
"anchor": "brandingvariant-density",
|
|
6765
|
+
"group": "branding",
|
|
6766
|
+
"signature": "readonly density?: number",
|
|
6767
|
+
"documented": true,
|
|
6768
|
+
"summary": "Device pixels per CSS px of a render made for [BrandingVariant.size](api-reference-game.md#brandingvariant-size).",
|
|
6769
|
+
"deprecated": null,
|
|
6770
|
+
"params": [],
|
|
6771
|
+
"returns": null,
|
|
6772
|
+
"throws": null,
|
|
6773
|
+
"example": null,
|
|
6774
|
+
"defaultValue": null,
|
|
6775
|
+
"guides": []
|
|
6776
|
+
},
|
|
6777
|
+
{
|
|
6778
|
+
"id": "BrandingVariant.vector",
|
|
6779
|
+
"name": "vector",
|
|
6780
|
+
"anchor": "brandingvariant-vector",
|
|
6781
|
+
"group": "branding",
|
|
6782
|
+
"signature": "readonly vector?: true",
|
|
6783
|
+
"documented": true,
|
|
6784
|
+
"summary": "`true` on a scalable image: it draws crisply at any size.",
|
|
6785
|
+
"deprecated": null,
|
|
6786
|
+
"params": [],
|
|
6787
|
+
"returns": null,
|
|
6788
|
+
"throws": null,
|
|
6789
|
+
"example": null,
|
|
6790
|
+
"defaultValue": null,
|
|
6791
|
+
"guides": []
|
|
6792
|
+
},
|
|
6793
|
+
{
|
|
6794
|
+
"id": "BrandingVariant.theme",
|
|
6795
|
+
"name": "theme",
|
|
6796
|
+
"anchor": "brandingvariant-theme",
|
|
6797
|
+
"group": "branding",
|
|
6798
|
+
"signature": "readonly theme?: BrandingTheme",
|
|
6799
|
+
"documented": true,
|
|
6800
|
+
"summary": "The one theme the file is for. Absent: either theme.",
|
|
6801
|
+
"deprecated": null,
|
|
6802
|
+
"params": [],
|
|
6803
|
+
"returns": null,
|
|
6804
|
+
"throws": null,
|
|
6805
|
+
"example": null,
|
|
6806
|
+
"defaultValue": null,
|
|
6807
|
+
"guides": []
|
|
6808
|
+
},
|
|
6809
|
+
{
|
|
6810
|
+
"id": "BrandingAsset",
|
|
6811
|
+
"name": "BrandingAsset",
|
|
6812
|
+
"anchor": "brandingasset",
|
|
6813
|
+
"group": "branding",
|
|
6814
|
+
"signature": "interface BrandingAsset",
|
|
6815
|
+
"documented": true,
|
|
6816
|
+
"summary": "One asset in the platform's branding manifest.",
|
|
6817
|
+
"deprecated": null,
|
|
6818
|
+
"params": [],
|
|
6819
|
+
"returns": null,
|
|
6820
|
+
"throws": null,
|
|
6821
|
+
"example": null,
|
|
6822
|
+
"defaultValue": null,
|
|
6823
|
+
"guides": []
|
|
6824
|
+
},
|
|
6825
|
+
{
|
|
6826
|
+
"id": "BrandingAsset.id",
|
|
6827
|
+
"name": "id",
|
|
6828
|
+
"anchor": "brandingasset-id",
|
|
6829
|
+
"group": "branding",
|
|
6830
|
+
"signature": "readonly id: string",
|
|
6831
|
+
"documented": true,
|
|
6832
|
+
"summary": "What a game asks for: `'gem-logo'`, `'gems-mark'`. Never renamed.",
|
|
6833
|
+
"deprecated": null,
|
|
6834
|
+
"params": [],
|
|
6835
|
+
"returns": null,
|
|
6836
|
+
"throws": null,
|
|
6837
|
+
"example": null,
|
|
6838
|
+
"defaultValue": null,
|
|
6839
|
+
"guides": []
|
|
6840
|
+
},
|
|
6841
|
+
{
|
|
6842
|
+
"id": "BrandingAsset.kind",
|
|
6843
|
+
"name": "kind",
|
|
6844
|
+
"anchor": "brandingasset-kind",
|
|
6845
|
+
"group": "branding",
|
|
6846
|
+
"signature": "readonly kind: string",
|
|
6847
|
+
"documented": true,
|
|
6848
|
+
"summary": "`'image'`, `'audio'` or `'font'` today. The platform may add more, so\ncompare it rather than switching on it exhaustively.",
|
|
6849
|
+
"deprecated": null,
|
|
6850
|
+
"params": [],
|
|
6851
|
+
"returns": null,
|
|
6852
|
+
"throws": null,
|
|
6853
|
+
"example": null,
|
|
6854
|
+
"defaultValue": null,
|
|
6855
|
+
"guides": []
|
|
6856
|
+
},
|
|
6857
|
+
{
|
|
6858
|
+
"id": "BrandingAsset.variants",
|
|
6859
|
+
"name": "variants",
|
|
6860
|
+
"anchor": "brandingasset-variants",
|
|
6861
|
+
"group": "branding",
|
|
6862
|
+
"signature": "readonly variants: readonly BrandingVariant[]",
|
|
6863
|
+
"documented": true,
|
|
6864
|
+
"summary": "Every file of it, smallest first. Never empty.",
|
|
6865
|
+
"deprecated": null,
|
|
6866
|
+
"params": [],
|
|
6867
|
+
"returns": null,
|
|
6868
|
+
"throws": null,
|
|
6869
|
+
"example": null,
|
|
6870
|
+
"defaultValue": null,
|
|
6871
|
+
"guides": []
|
|
6872
|
+
},
|
|
6873
|
+
{
|
|
6874
|
+
"id": "BrandingLookup",
|
|
6875
|
+
"name": "BrandingLookup",
|
|
6876
|
+
"anchor": "brandinglookup",
|
|
6877
|
+
"group": "branding",
|
|
6878
|
+
"signature": "type BrandingLookup = { outcome: \"ok\"; url: string; variant: BrandingVariant; asset: BrandingAsset } | { outcome: \"not_found\" | \"unavailable\" }",
|
|
6879
|
+
"documented": true,
|
|
6880
|
+
"summary": "What a branding lookup resolves with. Only `ok` carries a URL.\n\n- `ok`: the platform has it, and `url` is the file picked for what you asked.\n- `not_found`: the manifest was read and has no asset with that id and kind,\n or none of its files fits the theme you asked for. Draw nothing for it.\n- `unavailable`: the manifest could not be read — offline, a network error,\n a Content-Security-Policy that leaves out `https://gemarcade.com`. Draw the\n copy you bundled from the package's `brand/` folder, if there is one.",
|
|
6881
|
+
"deprecated": null,
|
|
6882
|
+
"params": [],
|
|
6883
|
+
"returns": null,
|
|
6884
|
+
"throws": null,
|
|
6885
|
+
"example": null,
|
|
6886
|
+
"defaultValue": null,
|
|
6887
|
+
"guides": []
|
|
6888
|
+
},
|
|
6889
|
+
{
|
|
6890
|
+
"id": "BrandingList",
|
|
6891
|
+
"name": "BrandingList",
|
|
6892
|
+
"anchor": "brandinglist",
|
|
6893
|
+
"group": "branding",
|
|
6894
|
+
"signature": "type BrandingList = { outcome: \"ok\"; assets: readonly BrandingAsset[] } | { outcome: \"unavailable\" }",
|
|
6895
|
+
"documented": true,
|
|
6896
|
+
"summary": "What [BrandingApi.list](api-reference-game.md#brandingapi-list) resolves with.",
|
|
6897
|
+
"deprecated": null,
|
|
6898
|
+
"params": [],
|
|
6899
|
+
"returns": null,
|
|
6900
|
+
"throws": null,
|
|
6901
|
+
"example": null,
|
|
6902
|
+
"defaultValue": null,
|
|
6903
|
+
"guides": []
|
|
6904
|
+
},
|
|
6905
|
+
{
|
|
6906
|
+
"id": "BrandingImageOptions",
|
|
6907
|
+
"name": "BrandingImageOptions",
|
|
6908
|
+
"anchor": "brandingimageoptions",
|
|
6909
|
+
"group": "branding",
|
|
6910
|
+
"signature": "interface BrandingImageOptions",
|
|
6911
|
+
"documented": true,
|
|
6912
|
+
"summary": "How to pick one image from an asset's variants.",
|
|
6913
|
+
"deprecated": null,
|
|
6914
|
+
"params": [],
|
|
6915
|
+
"returns": null,
|
|
6916
|
+
"throws": null,
|
|
6917
|
+
"example": null,
|
|
6918
|
+
"defaultValue": null,
|
|
6919
|
+
"guides": []
|
|
6920
|
+
},
|
|
6921
|
+
{
|
|
6922
|
+
"id": "BrandingImageOptions.size",
|
|
6923
|
+
"name": "size",
|
|
6924
|
+
"anchor": "brandingimageoptions-size",
|
|
6925
|
+
"group": "branding",
|
|
6926
|
+
"signature": "readonly size?: number",
|
|
6927
|
+
"documented": true,
|
|
6928
|
+
"summary": "The CSS px box you draw it in. A render made for exactly that box wins;\nthen a scalable image; then the narrowest render wide enough for\n`size × density`. Leave it out for the largest: the scalable image, or\nelse the widest render.",
|
|
6929
|
+
"deprecated": null,
|
|
6930
|
+
"params": [],
|
|
6931
|
+
"returns": null,
|
|
6932
|
+
"throws": null,
|
|
6933
|
+
"example": null,
|
|
6934
|
+
"defaultValue": null,
|
|
6935
|
+
"guides": []
|
|
6936
|
+
},
|
|
6937
|
+
{
|
|
6938
|
+
"id": "BrandingImageOptions.density",
|
|
6939
|
+
"name": "density",
|
|
6940
|
+
"anchor": "brandingimageoptions-density",
|
|
6941
|
+
"group": "branding",
|
|
6942
|
+
"signature": "readonly density?: number",
|
|
6943
|
+
"documented": true,
|
|
6944
|
+
"summary": "Device pixels per CSS px. Defaults to the screen's `devicePixelRatio`;\npass `3` for a canvas or texture you scale down yourself.",
|
|
6945
|
+
"deprecated": null,
|
|
6946
|
+
"params": [],
|
|
6947
|
+
"returns": null,
|
|
6948
|
+
"throws": null,
|
|
6949
|
+
"example": null,
|
|
6950
|
+
"defaultValue": null,
|
|
6951
|
+
"guides": []
|
|
6952
|
+
},
|
|
6953
|
+
{
|
|
6954
|
+
"id": "BrandingImageOptions.theme",
|
|
6955
|
+
"name": "theme",
|
|
6956
|
+
"anchor": "brandingimageoptions-theme",
|
|
6957
|
+
"group": "branding",
|
|
6958
|
+
"signature": "readonly theme?: BrandingTheme",
|
|
6959
|
+
"documented": true,
|
|
6960
|
+
"summary": "Prefer a file drawn for this theme. Files for the other theme are never picked.",
|
|
6961
|
+
"deprecated": null,
|
|
6962
|
+
"params": [],
|
|
6963
|
+
"returns": null,
|
|
6964
|
+
"throws": null,
|
|
6965
|
+
"example": null,
|
|
6966
|
+
"defaultValue": null,
|
|
6967
|
+
"guides": []
|
|
6968
|
+
},
|
|
6969
|
+
{
|
|
6970
|
+
"id": "BrandingAssetOptions",
|
|
6971
|
+
"name": "BrandingAssetOptions",
|
|
6972
|
+
"anchor": "brandingassetoptions",
|
|
6973
|
+
"group": "branding",
|
|
6974
|
+
"signature": "interface BrandingAssetOptions",
|
|
6975
|
+
"documented": true,
|
|
6976
|
+
"summary": "What [BrandingApi.get](api-reference-game.md#brandingapi-get) takes: the asset's kind, and how to pick a file.",
|
|
6977
|
+
"deprecated": null,
|
|
6978
|
+
"params": [],
|
|
6979
|
+
"returns": null,
|
|
6980
|
+
"throws": null,
|
|
6981
|
+
"example": null,
|
|
6982
|
+
"defaultValue": null,
|
|
6983
|
+
"guides": []
|
|
6984
|
+
},
|
|
6985
|
+
{
|
|
6986
|
+
"id": "BrandingAssetOptions.size",
|
|
6987
|
+
"name": "size",
|
|
6988
|
+
"anchor": "brandingassetoptions-size",
|
|
6989
|
+
"group": "branding",
|
|
6990
|
+
"signature": "readonly size?: number",
|
|
6991
|
+
"documented": true,
|
|
6992
|
+
"summary": "The CSS px box you draw it in. A render made for exactly that box wins;\nthen a scalable image; then the narrowest render wide enough for\n`size × density`. Leave it out for the largest: the scalable image, or\nelse the widest render.",
|
|
6993
|
+
"deprecated": null,
|
|
6994
|
+
"params": [],
|
|
6995
|
+
"returns": null,
|
|
6996
|
+
"throws": null,
|
|
6997
|
+
"example": null,
|
|
6998
|
+
"defaultValue": null,
|
|
6999
|
+
"guides": []
|
|
7000
|
+
},
|
|
7001
|
+
{
|
|
7002
|
+
"id": "BrandingAssetOptions.density",
|
|
7003
|
+
"name": "density",
|
|
7004
|
+
"anchor": "brandingassetoptions-density",
|
|
7005
|
+
"group": "branding",
|
|
7006
|
+
"signature": "readonly density?: number",
|
|
7007
|
+
"documented": true,
|
|
7008
|
+
"summary": "Device pixels per CSS px. Defaults to the screen's `devicePixelRatio`;\npass `3` for a canvas or texture you scale down yourself.",
|
|
7009
|
+
"deprecated": null,
|
|
7010
|
+
"params": [],
|
|
7011
|
+
"returns": null,
|
|
7012
|
+
"throws": null,
|
|
7013
|
+
"example": null,
|
|
7014
|
+
"defaultValue": null,
|
|
7015
|
+
"guides": []
|
|
7016
|
+
},
|
|
7017
|
+
{
|
|
7018
|
+
"id": "BrandingAssetOptions.theme",
|
|
7019
|
+
"name": "theme",
|
|
7020
|
+
"anchor": "brandingassetoptions-theme",
|
|
7021
|
+
"group": "branding",
|
|
7022
|
+
"signature": "readonly theme?: BrandingTheme",
|
|
7023
|
+
"documented": true,
|
|
7024
|
+
"summary": "Prefer a file drawn for this theme. Files for the other theme are never picked.",
|
|
7025
|
+
"deprecated": null,
|
|
7026
|
+
"params": [],
|
|
7027
|
+
"returns": null,
|
|
7028
|
+
"throws": null,
|
|
7029
|
+
"example": null,
|
|
7030
|
+
"defaultValue": null,
|
|
7031
|
+
"guides": []
|
|
7032
|
+
},
|
|
7033
|
+
{
|
|
7034
|
+
"id": "BrandingAssetOptions.kind",
|
|
7035
|
+
"name": "kind",
|
|
7036
|
+
"anchor": "brandingassetoptions-kind",
|
|
7037
|
+
"group": "branding",
|
|
7038
|
+
"signature": "readonly kind: string",
|
|
7039
|
+
"documented": true,
|
|
7040
|
+
"summary": "The kind you expect: `'image'`, `'audio'` or `'font'`. An asset of another\nkind answers `not_found`. `size` and `density` apply to images only; for\nany other kind the first file wins.",
|
|
7041
|
+
"deprecated": null,
|
|
7042
|
+
"params": [],
|
|
7043
|
+
"returns": null,
|
|
7044
|
+
"throws": null,
|
|
7045
|
+
"example": null,
|
|
7046
|
+
"defaultValue": null,
|
|
7047
|
+
"guides": []
|
|
7048
|
+
},
|
|
7049
|
+
{
|
|
7050
|
+
"id": "BrandingCurrency",
|
|
7051
|
+
"name": "BrandingCurrency",
|
|
7052
|
+
"anchor": "brandingcurrency",
|
|
7053
|
+
"group": "branding",
|
|
7054
|
+
"signature": "type BrandingCurrency = \"GEMS\" | \"ARCADE_TICKETS\"",
|
|
7055
|
+
"documented": true,
|
|
7056
|
+
"summary": "The platform currencies with a mark: Gems and Coins.",
|
|
7057
|
+
"deprecated": null,
|
|
7058
|
+
"params": [],
|
|
7059
|
+
"returns": null,
|
|
7060
|
+
"throws": null,
|
|
7061
|
+
"example": null,
|
|
7062
|
+
"defaultValue": null,
|
|
7063
|
+
"guides": []
|
|
7064
|
+
},
|
|
7065
|
+
{
|
|
7066
|
+
"id": "BrandingApi",
|
|
7067
|
+
"name": "BrandingApi",
|
|
7068
|
+
"anchor": "brandingapi",
|
|
7069
|
+
"group": "branding",
|
|
7070
|
+
"signature": "interface BrandingApi",
|
|
7071
|
+
"documented": true,
|
|
7072
|
+
"summary": "The platform's branding, as the platform serves it now. `gem.branding` is\none of these. Nothing here rejects but a bad argument.",
|
|
7073
|
+
"deprecated": null,
|
|
7074
|
+
"params": [],
|
|
7075
|
+
"returns": null,
|
|
7076
|
+
"throws": null,
|
|
7077
|
+
"example": null,
|
|
7078
|
+
"defaultValue": null,
|
|
7079
|
+
"guides": []
|
|
7080
|
+
},
|
|
7081
|
+
{
|
|
7082
|
+
"id": "BrandingApi.get",
|
|
7083
|
+
"name": "get",
|
|
7084
|
+
"anchor": "brandingapi-get",
|
|
7085
|
+
"group": "branding",
|
|
7086
|
+
"signature": "get(id: string, options: BrandingAssetOptions): Promise<BrandingLookup>",
|
|
7087
|
+
"documented": true,
|
|
7088
|
+
"summary": "Any asset in the platform's branding manifest, by id and kind — including\nones added after this SDK was released.\n\n```js\nconst logo = await gem.branding.get('gem-logo', { kind: 'image', size: 64 });\nif (logo.outcome === 'ok') img.src = logo.url;\n```",
|
|
7089
|
+
"deprecated": null,
|
|
7090
|
+
"params": [
|
|
7091
|
+
{
|
|
7092
|
+
"name": "id",
|
|
7093
|
+
"type": "string",
|
|
7094
|
+
"optional": false,
|
|
7095
|
+
"summary": null
|
|
7096
|
+
},
|
|
7097
|
+
{
|
|
7098
|
+
"name": "options",
|
|
7099
|
+
"type": "BrandingAssetOptions",
|
|
7100
|
+
"optional": false,
|
|
7101
|
+
"summary": null
|
|
7102
|
+
}
|
|
7103
|
+
],
|
|
7104
|
+
"returns": "Resolves `ok`, `not_found` or `unavailable`. Rejects only for an\n argument that is not one (an empty id, a size that is not a positive\n number).",
|
|
7105
|
+
"throws": null,
|
|
7106
|
+
"example": null,
|
|
7107
|
+
"defaultValue": null,
|
|
7108
|
+
"guides": []
|
|
7109
|
+
},
|
|
7110
|
+
{
|
|
7111
|
+
"id": "BrandingApi.logo",
|
|
7112
|
+
"name": "logo",
|
|
7113
|
+
"anchor": "brandingapi-logo",
|
|
7114
|
+
"group": "branding",
|
|
7115
|
+
"signature": "logo(options?: BrandingImageOptions): Promise<BrandingLookup>",
|
|
7116
|
+
"documented": true,
|
|
7117
|
+
"summary": "The Indie Gems logo, the brand gem. Scalable: draw it at 32 CSS px or more,\nas served (`docs/branding.md` has the usage rules).",
|
|
7118
|
+
"deprecated": null,
|
|
7119
|
+
"params": [
|
|
7120
|
+
{
|
|
7121
|
+
"name": "options",
|
|
7122
|
+
"type": "BrandingImageOptions",
|
|
7123
|
+
"optional": true,
|
|
7124
|
+
"summary": null
|
|
7125
|
+
}
|
|
7126
|
+
],
|
|
7127
|
+
"returns": null,
|
|
7128
|
+
"throws": null,
|
|
7129
|
+
"example": null,
|
|
7130
|
+
"defaultValue": null,
|
|
7131
|
+
"guides": []
|
|
7132
|
+
},
|
|
7133
|
+
{
|
|
7134
|
+
"id": "BrandingApi.wordmark",
|
|
7135
|
+
"name": "wordmark",
|
|
7136
|
+
"anchor": "brandingapi-wordmark",
|
|
7137
|
+
"group": "branding",
|
|
7138
|
+
"signature": "wordmark(options?: BrandingImageOptions): Promise<BrandingLookup>",
|
|
7139
|
+
"documented": true,
|
|
7140
|
+
"summary": "The Gem Arcade wordmark. Draw it at 60 CSS px wide or more, as served.",
|
|
7141
|
+
"deprecated": null,
|
|
7142
|
+
"params": [
|
|
7143
|
+
{
|
|
7144
|
+
"name": "options",
|
|
7145
|
+
"type": "BrandingImageOptions",
|
|
7146
|
+
"optional": true,
|
|
7147
|
+
"summary": null
|
|
7148
|
+
}
|
|
7149
|
+
],
|
|
7150
|
+
"returns": null,
|
|
7151
|
+
"throws": null,
|
|
7152
|
+
"example": null,
|
|
7153
|
+
"defaultValue": null,
|
|
7154
|
+
"guides": []
|
|
7155
|
+
},
|
|
7156
|
+
{
|
|
7157
|
+
"id": "BrandingApi.currencyMark",
|
|
7158
|
+
"name": "currencyMark",
|
|
7159
|
+
"anchor": "brandingapi-currencymark",
|
|
7160
|
+
"group": "branding",
|
|
7161
|
+
"signature": "currencyMark(currency: BrandingCurrency, options?: BrandingImageOptions): Promise<BrandingLookup>",
|
|
7162
|
+
"documented": true,
|
|
7163
|
+
"summary": "The mark of a platform currency, by its slug: `'GEMS'` or\n`'ARCADE_TICKETS'` (Coins). Pass `size: 20` or `32` for the inline icon\nbeside an amount, or leave it out for the hero art of a reward screen.\n`docs/brand-art.md` says where each may be drawn.",
|
|
7164
|
+
"deprecated": null,
|
|
7165
|
+
"params": [
|
|
7166
|
+
{
|
|
7167
|
+
"name": "currency",
|
|
7168
|
+
"type": "BrandingCurrency",
|
|
7169
|
+
"optional": false,
|
|
7170
|
+
"summary": null
|
|
7171
|
+
},
|
|
7172
|
+
{
|
|
7173
|
+
"name": "options",
|
|
7174
|
+
"type": "BrandingImageOptions",
|
|
7175
|
+
"optional": true,
|
|
7176
|
+
"summary": null
|
|
7177
|
+
}
|
|
7178
|
+
],
|
|
7179
|
+
"returns": null,
|
|
7180
|
+
"throws": null,
|
|
7181
|
+
"example": null,
|
|
7182
|
+
"defaultValue": null,
|
|
7183
|
+
"guides": []
|
|
7184
|
+
},
|
|
7185
|
+
{
|
|
7186
|
+
"id": "BrandingApi.trophy",
|
|
7187
|
+
"name": "trophy",
|
|
7188
|
+
"anchor": "brandingapi-trophy",
|
|
7189
|
+
"group": "branding",
|
|
7190
|
+
"signature": "trophy(options?: BrandingImageOptions): Promise<BrandingLookup>",
|
|
7191
|
+
"documented": true,
|
|
7192
|
+
"summary": "The trophy, for where your game shows what a player has achieved.",
|
|
7193
|
+
"deprecated": null,
|
|
7194
|
+
"params": [
|
|
7195
|
+
{
|
|
7196
|
+
"name": "options",
|
|
7197
|
+
"type": "BrandingImageOptions",
|
|
7198
|
+
"optional": true,
|
|
7199
|
+
"summary": null
|
|
7200
|
+
}
|
|
7201
|
+
],
|
|
7202
|
+
"returns": null,
|
|
7203
|
+
"throws": null,
|
|
7204
|
+
"example": null,
|
|
7205
|
+
"defaultValue": null,
|
|
7206
|
+
"guides": []
|
|
7207
|
+
},
|
|
7208
|
+
{
|
|
7209
|
+
"id": "BrandingApi.list",
|
|
7210
|
+
"name": "list",
|
|
7211
|
+
"anchor": "brandingapi-list",
|
|
7212
|
+
"group": "branding",
|
|
7213
|
+
"signature": "list(): Promise<BrandingList>",
|
|
7214
|
+
"documented": true,
|
|
7215
|
+
"summary": "Every asset the platform serves, or `unavailable` when the manifest could\nnot be read.",
|
|
7216
|
+
"deprecated": null,
|
|
7217
|
+
"params": [],
|
|
7218
|
+
"returns": null,
|
|
7219
|
+
"throws": null,
|
|
7220
|
+
"example": null,
|
|
7221
|
+
"defaultValue": null,
|
|
7222
|
+
"guides": []
|
|
7223
|
+
},
|
|
6565
7224
|
{
|
|
6566
7225
|
"id": "ListChallengesOptions",
|
|
6567
7226
|
"name": "ListChallengesOptions",
|
|
@@ -12145,6 +12804,27 @@
|
|
|
12145
12804
|
}
|
|
12146
12805
|
]
|
|
12147
12806
|
},
|
|
12807
|
+
{
|
|
12808
|
+
"id": "Gem.branding",
|
|
12809
|
+
"name": "branding",
|
|
12810
|
+
"anchor": "gem-branding",
|
|
12811
|
+
"group": "start",
|
|
12812
|
+
"signature": "readonly branding: BrandingApi",
|
|
12813
|
+
"documented": true,
|
|
12814
|
+
"summary": "The platform's branding — the Indie Gems logo, the Gem Arcade wordmark,\nthe Gems and Coins marks and the trophy — as the platform serves it now,\nso a changed mark reaches your game with no republish.\n\nLook up any asset by id and kind with `get`, or use `logo`, `wordmark`,\n`currencyMark` and `trophy`. Every URL is on the platform's own host.\nNothing rejects but a bad argument: an asset the platform does not list is\n`not_found`, and a manifest that could not be read is `unavailable`, when\nyou draw the copy you bundled from `brand/` instead.\n\n```js\nconst logo = await gem.branding.logo();\nif (logo.outcome === 'ok') menuLogo.src = logo.url;\n```",
|
|
12815
|
+
"deprecated": null,
|
|
12816
|
+
"params": [],
|
|
12817
|
+
"returns": null,
|
|
12818
|
+
"throws": null,
|
|
12819
|
+
"example": null,
|
|
12820
|
+
"defaultValue": null,
|
|
12821
|
+
"guides": [
|
|
12822
|
+
{
|
|
12823
|
+
"slug": "branding",
|
|
12824
|
+
"anchor": null
|
|
12825
|
+
}
|
|
12826
|
+
]
|
|
12827
|
+
},
|
|
12148
12828
|
{
|
|
12149
12829
|
"id": "Gem.avatarPickerAvailable",
|
|
12150
12830
|
"name": "avatarPickerAvailable",
|
|
@@ -32521,7 +33201,7 @@
|
|
|
32521
33201
|
"group": "player",
|
|
32522
33202
|
"signature": "readonly etag: string",
|
|
32523
33203
|
"documented": true,
|
|
32524
|
-
"summary": "This save's version, which changes whenever the save does.\n\nNOT something to pass back on a write —
|
|
33204
|
+
"summary": "This save's version, which changes whenever the save does.\n\nNOT something to pass back on a write — the SDK remembers the version of\neach slot you last loaded or wrote and sends it for you, so a write that\nwould replace a save you never saw is refused as `save_conflict`. This is\nhow a game holding a copy tells whether the stored save is still the one\nit has.",
|
|
32525
33205
|
"deprecated": null,
|
|
32526
33206
|
"params": [],
|
|
32527
33207
|
"returns": null,
|
|
@@ -32652,9 +33332,9 @@
|
|
|
32652
33332
|
"name": "reason",
|
|
32653
33333
|
"anchor": "gemsaveerror-reason",
|
|
32654
33334
|
"group": "errors",
|
|
32655
|
-
"signature": "readonly reason: \"upload_failed\" | \"download_failed\" | \"save_timeout\" | \"save_malformed\"",
|
|
33335
|
+
"signature": "readonly reason: \"upload_failed\" | \"download_failed\" | \"save_timeout\" | \"save_malformed\" | \"save_conflict\" | \"load_failed\"",
|
|
32656
33336
|
"documented": true,
|
|
32657
|
-
"summary": "Which part failed.\n\n- `upload_failed` — the bytes could not be written to storage.\n- `download_failed` — the stored bytes could not be fetched.\n- `save_timeout` — a hop did not finish in the time the call allows.\n- `save_malformed` — the answer, or the stored payload, was not what it\n claims to be.\n\n`save_timeout`, and a one-off `upload_failed` or `download_failed`, are\nworth one retry. `save_malformed` is not: the same bytes will fail the\nsame way.\n\nAn `upload_failed` that repeats on EVERY save, for every player, is not\ntransient either — it is a platform-side misconfiguration, and retrying\nis a loop rather than a recovery. See the saves guide.",
|
|
33337
|
+
"summary": "Which part failed.\n\n- `upload_failed` — the bytes could not be written to storage.\n- `download_failed` — the stored bytes could not be fetched.\n- `save_timeout` — a hop did not finish in the time the call allows.\n- `save_malformed` — the answer, or the stored payload, was not what it\n claims to be.\n- `save_conflict` — a write was refused because the stored save changed\n since this game last loaded or wrote it: another device or tab saved\n in between. Nothing was written.\n- `load_failed` — a write was refused before anything was sent, because\n the last load of this slot failed, so what the write would replace is\n unknown — it could be the player's real progress.\n\n`save_timeout`, and a one-off `upload_failed` or `download_failed`, are\nworth one retry. `save_malformed` is not: the same bytes will fail the\nsame way.\n\nNeither is `save_conflict` or `load_failed`: resending the same write\nfails the same way. Load the slot again and decide what to write from\nwhat is stored — merge, or ask the player. Pass `overwrite: true` only to\nreplace whatever is stored on purpose.\n\nAn `upload_failed` that repeats on EVERY save, for every player, is not\ntransient either — it is a platform-side misconfiguration, and retrying\nis a loop rather than a recovery. See the saves guide.\n\nA RATE LIMIT IS NOT ONE OF THESE. Refused for the rate on any leg — the\nplatform, the upload, the download — a save or load rejects as\n`GemApiError` reason `rate_limited`, with `retryAfterSeconds` when a wait\nwas named.",
|
|
32658
33338
|
"deprecated": null,
|
|
32659
33339
|
"params": [],
|
|
32660
33340
|
"returns": null,
|
|
@@ -32707,7 +33387,7 @@
|
|
|
32707
33387
|
"group": "player",
|
|
32708
33388
|
"signature": "readonly signal?: AbortSignal",
|
|
32709
33389
|
"documented": true,
|
|
32710
|
-
"summary": "Cancel the write.\n\nA save is several hops, so a cancelled write can land after the platform\nhas already agreed to it. Re-read rather than assuming nothing was stored.",
|
|
33390
|
+
"summary": "Cancel the write.\n\nA save is several hops, so a cancelled write can land after the platform\nhas already agreed to it. Re-read rather than assuming nothing was stored.\n\nA write that replaced earlier ones still waiting on its slot carries them,\nso cancelling it before it goes out cancels them too. Cancelling a write\nthat a later one replaced rejects only this call; the later write goes on.",
|
|
32711
33391
|
"deprecated": null,
|
|
32712
33392
|
"params": [],
|
|
32713
33393
|
"returns": null,
|
|
@@ -32723,7 +33403,39 @@
|
|
|
32723
33403
|
"group": "player",
|
|
32724
33404
|
"signature": "readonly timeoutMs?: number",
|
|
32725
33405
|
"documented": true,
|
|
32726
|
-
"summary": "How long this whole save may take, every hop together. Overrides the 30\nsecond default.\n\nSET THIS WHEN YOU ARE RACING A CLOCK YOU DO NOT CONTROL — above all when\nsaving from `GemTerminationNotice`, whose `graceMs` can be shorter\nthan the default. Left at the default in that case a save is killed\nmid-flight: the promise never settles, nothing is logged, and the player\nloses progress silently. Set it to the budget you actually have and a save\nthat will not make it rejects as `save_timeout` while there is still time\nto do something about it.\n\nIt does not make a save faster. Three round trips plus the payload is what\na save costs; this only decides when to stop waiting.",
|
|
33406
|
+
"summary": "How long this whole save may take, every hop together. Overrides the 30\nsecond default.\n\nSET THIS WHEN YOU ARE RACING A CLOCK YOU DO NOT CONTROL — above all when\nsaving from `GemTerminationNotice`, whose `graceMs` can be shorter\nthan the default. Left at the default in that case a save is killed\nmid-flight: the promise never settles, nothing is logged, and the player\nloses progress silently. Set it to the budget you actually have and a save\nthat will not make it rejects as `save_timeout` while there is still time\nto do something about it.\n\nIt does not make a save faster. Three round trips plus the payload is what\na save costs; this only decides when to stop waiting.\n\nIt counts from the call, so a write waiting for the one before it on the\nsame slot spends it waiting. A rate limit whose wait it will not cover\nrejects at once as `GemApiError` reason `rate_limited`, not as\n`save_timeout`.\n\nIt stays this call's when a later write replaces this one: running out\nrejects only this call, and the later write goes on. The write that is\nsent runs on the newest call's `timeoutMs`, and running out of that rejects\nevery call it carries.",
|
|
33407
|
+
"deprecated": null,
|
|
33408
|
+
"params": [],
|
|
33409
|
+
"returns": null,
|
|
33410
|
+
"throws": null,
|
|
33411
|
+
"example": null,
|
|
33412
|
+
"defaultValue": null,
|
|
33413
|
+
"guides": []
|
|
33414
|
+
},
|
|
33415
|
+
{
|
|
33416
|
+
"id": "PutSaveOptions.teardown",
|
|
33417
|
+
"name": "teardown",
|
|
33418
|
+
"anchor": "putsaveoptions-teardown",
|
|
33419
|
+
"group": "player",
|
|
33420
|
+
"signature": "readonly teardown?: boolean",
|
|
33421
|
+
"documented": true,
|
|
33422
|
+
"summary": "This is the last write before the page goes away: send it without waiting\nfor the spacing between writes to one slot.\n\nWrites to one slot go out a few seconds apart, and a write made sooner\nwaits its turn. Set this on the write you make from\n`GemTerminationNotice` or `pagehide`, with a `timeoutMs` inside the\ntime you have.\n\nIT STILL WAITS FOR A WRITE ALREADY IN FLIGHT to the same slot, and it\nstill honours a rate-limit hold: when the hold outlasts `timeoutMs` the\nwrite rejects at once as `rate_limited`, and nothing is sent. Not for\nordinary saves — the spacing is what keeps a save loop from spending the\nrate limit.\n\nA later write that replaces this one while it waits keeps it: the write\nthat goes out skips the spacing when any call it carries set `teardown`.\nNot across a player change: a call replaced after the signed-in player\nchanged is refused as `save_conflict`, and its `teardown` goes with it.",
|
|
33423
|
+
"deprecated": null,
|
|
33424
|
+
"params": [],
|
|
33425
|
+
"returns": null,
|
|
33426
|
+
"throws": null,
|
|
33427
|
+
"example": null,
|
|
33428
|
+
"defaultValue": null,
|
|
33429
|
+
"guides": []
|
|
33430
|
+
},
|
|
33431
|
+
{
|
|
33432
|
+
"id": "PutSaveOptions.overwrite",
|
|
33433
|
+
"name": "overwrite",
|
|
33434
|
+
"anchor": "putsaveoptions-overwrite",
|
|
33435
|
+
"group": "player",
|
|
33436
|
+
"signature": "readonly overwrite?: boolean",
|
|
33437
|
+
"documented": true,
|
|
33438
|
+
"summary": "Write even if it replaces a save this game has not loaded.\n\nWithout it, a write to a slot whose last load FAILED is refused as\n`load_failed`, and a write is refused as `save_conflict` when the stored\nsave changed since you last loaded or wrote it. Both refusals protect the\nplayer's real progress from a game that started from defaults.\n\nSet it only when replacing whatever is stored is what you mean — a \"new\ngame\" the player confirmed, or the player choosing this device's progress\nafter a conflict. Never set it to get past a failed load.\n\nA later write that replaces this one while it waits keeps it: the write\nthat goes out overwrites when any call it carries set `overwrite`. A call\nthat gives up first (its `signal` or `timeoutMs`) takes it back, and so\ndoes one replaced after the signed-in player changed: it is refused as\n`save_conflict`, so one player's \"new game\" never overwrites the next's.",
|
|
32727
33439
|
"deprecated": null,
|
|
32728
33440
|
"params": [],
|
|
32729
33441
|
"returns": null,
|
|
@@ -32776,7 +33488,7 @@
|
|
|
32776
33488
|
"group": "player",
|
|
32777
33489
|
"signature": "readonly signal?: AbortSignal",
|
|
32778
33490
|
"documented": true,
|
|
32779
|
-
"summary": "Cancel the write.\n\nA save is several hops, so a cancelled write can land after the platform\nhas already agreed to it. Re-read rather than assuming nothing was stored.",
|
|
33491
|
+
"summary": "Cancel the write.\n\nA save is several hops, so a cancelled write can land after the platform\nhas already agreed to it. Re-read rather than assuming nothing was stored.\n\nA write that replaced earlier ones still waiting on its slot carries them,\nso cancelling it before it goes out cancels them too. Cancelling a write\nthat a later one replaced rejects only this call; the later write goes on.",
|
|
32780
33492
|
"deprecated": null,
|
|
32781
33493
|
"params": [],
|
|
32782
33494
|
"returns": null,
|
|
@@ -32792,7 +33504,39 @@
|
|
|
32792
33504
|
"group": "player",
|
|
32793
33505
|
"signature": "readonly timeoutMs?: number",
|
|
32794
33506
|
"documented": true,
|
|
32795
|
-
"summary": "How long this whole save may take, every hop together. Overrides the 30\nsecond default.\n\nSET THIS WHEN YOU ARE RACING A CLOCK YOU DO NOT CONTROL — above all when\nsaving from `GemTerminationNotice`, whose `graceMs` can be shorter\nthan the default. Left at the default in that case a save is killed\nmid-flight: the promise never settles, nothing is logged, and the player\nloses progress silently. Set it to the budget you actually have and a save\nthat will not make it rejects as `save_timeout` while there is still time\nto do something about it.\n\nIt does not make a save faster. Three round trips plus the payload is what\na save costs; this only decides when to stop waiting.",
|
|
33507
|
+
"summary": "How long this whole save may take, every hop together. Overrides the 30\nsecond default.\n\nSET THIS WHEN YOU ARE RACING A CLOCK YOU DO NOT CONTROL — above all when\nsaving from `GemTerminationNotice`, whose `graceMs` can be shorter\nthan the default. Left at the default in that case a save is killed\nmid-flight: the promise never settles, nothing is logged, and the player\nloses progress silently. Set it to the budget you actually have and a save\nthat will not make it rejects as `save_timeout` while there is still time\nto do something about it.\n\nIt does not make a save faster. Three round trips plus the payload is what\na save costs; this only decides when to stop waiting.\n\nIt counts from the call, so a write waiting for the one before it on the\nsame slot spends it waiting. A rate limit whose wait it will not cover\nrejects at once as `GemApiError` reason `rate_limited`, not as\n`save_timeout`.\n\nIt stays this call's when a later write replaces this one: running out\nrejects only this call, and the later write goes on. The write that is\nsent runs on the newest call's `timeoutMs`, and running out of that rejects\nevery call it carries.",
|
|
33508
|
+
"deprecated": null,
|
|
33509
|
+
"params": [],
|
|
33510
|
+
"returns": null,
|
|
33511
|
+
"throws": null,
|
|
33512
|
+
"example": null,
|
|
33513
|
+
"defaultValue": null,
|
|
33514
|
+
"guides": []
|
|
33515
|
+
},
|
|
33516
|
+
{
|
|
33517
|
+
"id": "PutBytesOptions.teardown",
|
|
33518
|
+
"name": "teardown",
|
|
33519
|
+
"anchor": "putbytesoptions-teardown",
|
|
33520
|
+
"group": "player",
|
|
33521
|
+
"signature": "readonly teardown?: boolean",
|
|
33522
|
+
"documented": true,
|
|
33523
|
+
"summary": "This is the last write before the page goes away: send it without waiting\nfor the spacing between writes to one slot.\n\nWrites to one slot go out a few seconds apart, and a write made sooner\nwaits its turn. Set this on the write you make from\n`GemTerminationNotice` or `pagehide`, with a `timeoutMs` inside the\ntime you have.\n\nIT STILL WAITS FOR A WRITE ALREADY IN FLIGHT to the same slot, and it\nstill honours a rate-limit hold: when the hold outlasts `timeoutMs` the\nwrite rejects at once as `rate_limited`, and nothing is sent. Not for\nordinary saves — the spacing is what keeps a save loop from spending the\nrate limit.\n\nA later write that replaces this one while it waits keeps it: the write\nthat goes out skips the spacing when any call it carries set `teardown`.\nNot across a player change: a call replaced after the signed-in player\nchanged is refused as `save_conflict`, and its `teardown` goes with it.",
|
|
33524
|
+
"deprecated": null,
|
|
33525
|
+
"params": [],
|
|
33526
|
+
"returns": null,
|
|
33527
|
+
"throws": null,
|
|
33528
|
+
"example": null,
|
|
33529
|
+
"defaultValue": null,
|
|
33530
|
+
"guides": []
|
|
33531
|
+
},
|
|
33532
|
+
{
|
|
33533
|
+
"id": "PutBytesOptions.overwrite",
|
|
33534
|
+
"name": "overwrite",
|
|
33535
|
+
"anchor": "putbytesoptions-overwrite",
|
|
33536
|
+
"group": "player",
|
|
33537
|
+
"signature": "readonly overwrite?: boolean",
|
|
33538
|
+
"documented": true,
|
|
33539
|
+
"summary": "Write even if it replaces a save this game has not loaded.\n\nWithout it, a write to a slot whose last load FAILED is refused as\n`load_failed`, and a write is refused as `save_conflict` when the stored\nsave changed since you last loaded or wrote it. Both refusals protect the\nplayer's real progress from a game that started from defaults.\n\nSet it only when replacing whatever is stored is what you mean — a \"new\ngame\" the player confirmed, or the player choosing this device's progress\nafter a conflict. Never set it to get past a failed load.\n\nA later write that replaces this one while it waits keeps it: the write\nthat goes out overwrites when any call it carries set `overwrite`. A call\nthat gives up first (its `signal` or `timeoutMs`) takes it back, and so\ndoes one replaced after the signed-in player changed: it is refused as\n`save_conflict`, so one player's \"new game\" never overwrites the next's.",
|
|
32796
33540
|
"deprecated": null,
|
|
32797
33541
|
"params": [],
|
|
32798
33542
|
"returns": null,
|
|
@@ -32824,7 +33568,7 @@
|
|
|
32824
33568
|
"group": "player",
|
|
32825
33569
|
"signature": "class SavesApi",
|
|
32826
33570
|
"documented": true,
|
|
32827
|
-
"summary": "A player's saved progress — write it, read it, list it, delete it.\n\nReached as `gem.me.saves`, and on a character as\n`gem.characters.get(id).saves`.\n\nA SAVE GOES IN A SLOT YOU DECLARED. Slots live in your game config, published\nwith `gemctl`, next to your room templates. Writing to a slot that was never\ndeclared fails as `not_found` naming the key, on the first call and every\nretry — that is the wall almost everyone hits first, and it is a config\nproblem rather than a code one.\n\n```js\nawait gem.me.saves.put('slot1', { level: 7, checkpoint: 'bridge' });\nconst state = await gem.me.saves.get('slot1');\n```\n\nWHAT IS DELIBERATELY NOT HERE: no autosave timer, no save format, no\nmigration. Those are your game's, and a platform that guessed at them would\nguess wrong.",
|
|
33571
|
+
"summary": "A player's saved progress — write it, read it, list it, delete it.\n\nReached as `gem.me.saves`, and on a character as\n`gem.characters.get(id).saves`.\n\nA SAVE GOES IN A SLOT YOU DECLARED. Slots live in your game config, published\nwith `gemctl`, next to your room templates. Writing to a slot that was never\ndeclared fails as `not_found` naming the key, on the first call and every\nretry — that is the wall almost everyone hits first, and it is a config\nproblem rather than a code one.\n\n```js\nawait gem.me.saves.put('slot1', { level: 7, checkpoint: 'bridge' });\nconst state = await gem.me.saves.get('slot1');\n```\n\nLOAD BEFORE YOU SAVE. Each write carries the version of the slot your last\nload or write found, so a write that would replace a save this game has not\nseen — another device's, or the player's real progress after a load that\nfailed — is refused as `save_conflict` or `load_failed` rather than stored.\nAfter a failed load, play on without saving and load again later; pass\n`overwrite: true` only when the player chose to start over.\n\nONE WRITE PER SLOT AT A TIME. A write made while another to the same slot is\nin flight waits for it, and a later one replaces it: the newest value is the\none sent, and every caller it replaced resolves with it, keeping its own\n`signal`, `timeoutMs`, `teardown` and `overwrite`. Writes to one slot\ngo out a few seconds apart (`teardown: true` skips that), and after a\n`rate_limited` answer none goes out until the wait it named is over.\n\nWHAT IS DELIBERATELY NOT HERE: no autosave timer, no save format, no\nmigration. Those are your game's, and a platform that guessed at them would\nguess wrong.",
|
|
32828
33572
|
"deprecated": null,
|
|
32829
33573
|
"params": [],
|
|
32830
33574
|
"returns": null,
|