@tavora/sdk 0.0.0-stage → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,320 @@
1
+ // @tavora/sdk: thin typed client for modules running inside Tavora Desktop.
2
+ // The host enforces every check; this package only marshals typed calls.
3
+ // Protocol reference: apps/docs/reference/protocol.md.
4
+ import { BLOB_PATH, CLIPBOARD_PATH, PICTURES_PATH, HELLO_MESSAGE, LIMITS, PORT_MESSAGE, PROTOCOL_VERSION, } from "./protocol.js";
5
+ export { BLOB_ID, BLOB_TYPES, DISCORD_COMMANDS, DISCORD_EVENTS, LIMITS, PROTOCOL_VERSION, THEME_TOKENS } from "./protocol.js";
6
+ /** How long a menu may stay open; the host closes it itself when its panel goes. */
7
+ const MENU_TIMEOUT_MS = 60 * 60_000;
8
+ /** Version of this SDK package, sent to the host during the handshake. */
9
+ export const SDK_VERSION = "0.2.5";
10
+ /**
11
+ * The oldest Tavora that has everything this SDK version offers. Put it in your manifest as
12
+ * `minTavora`, so an older Tavora says it needs an update instead of loading a module it cannot run
13
+ * (the starter, `npm create @tavora/module`, does). The changelog names it for every version.
14
+ */
15
+ export const MIN_TAVORA = "0.17.19";
16
+ export class TavoraError extends Error {
17
+ code;
18
+ /** Set for PERMISSION_DENIED. */
19
+ capability;
20
+ /** Set for CONFLICT: the document's current revision. */
21
+ revision;
22
+ constructor(payload) {
23
+ super(payload.message);
24
+ this.name = "TavoraError";
25
+ this.code = payload.code;
26
+ this.capability = payload.capability;
27
+ this.revision = payload.revision;
28
+ }
29
+ }
30
+ let connection;
31
+ /**
32
+ * Connects to the Tavora host. Safe to call more than once: every call
33
+ * returns the same connection for this window. Rejects with a TavoraError
34
+ * (HOST_UNAVAILABLE, INCOMPATIBLE) if the module cannot run here.
35
+ */
36
+ export function connect(options = {}) {
37
+ connection ??= openPort(options.connectTimeoutMs ?? 5000)
38
+ .then((port) => createClient(port, options.requestTimeoutMs ?? 10_000))
39
+ .catch((error) => {
40
+ connection = undefined;
41
+ throw error;
42
+ });
43
+ return connection;
44
+ }
45
+ function openPort(timeoutMs) {
46
+ return new Promise((resolve, reject) => {
47
+ const timer = setTimeout(() => {
48
+ window.removeEventListener("message", onMessage);
49
+ reject(new TavoraError({
50
+ code: "HOST_UNAVAILABLE",
51
+ message: "Tavora host did not respond. Is this module running inside Tavora?",
52
+ }));
53
+ }, timeoutMs);
54
+ function onMessage(event) {
55
+ if (event.source !== window || event.data?.type !== PORT_MESSAGE || !event.ports[0])
56
+ return;
57
+ clearTimeout(timer);
58
+ window.removeEventListener("message", onMessage);
59
+ resolve(event.ports[0]);
60
+ }
61
+ window.addEventListener("message", onMessage);
62
+ window.postMessage({ type: HELLO_MESSAGE, v: PROTOCOL_VERSION }, window.location.origin);
63
+ });
64
+ }
65
+ async function createClient(port, requestTimeoutMs) {
66
+ let nextId = 1;
67
+ const pending = new Map();
68
+ const listeners = new Map();
69
+ let suspended = false;
70
+ port.onmessage = (event) => {
71
+ const message = event.data;
72
+ if (typeof message !== "object" || message === null || message.v !== PROTOCOL_VERSION)
73
+ return;
74
+ if ("event" in message) {
75
+ if (message.event === "lifecycle.suspend")
76
+ suspended = true;
77
+ if (message.event === "lifecycle.resume")
78
+ suspended = false;
79
+ for (const fn of listeners.get(message.event) ?? []) {
80
+ try {
81
+ fn(message.data);
82
+ }
83
+ catch (error) {
84
+ console.error(`[tavora] ${message.event} listener failed`, error);
85
+ }
86
+ }
87
+ return;
88
+ }
89
+ const entry = pending.get(message.id);
90
+ if (!entry)
91
+ return;
92
+ pending.delete(message.id);
93
+ clearTimeout(entry.timer);
94
+ if (message.ok)
95
+ entry.resolve(message.result);
96
+ else
97
+ entry.reject(new TavoraError(message.error));
98
+ };
99
+ port.start();
100
+ function call(method, params, timeoutMs = requestTimeoutMs) {
101
+ const id = nextId++;
102
+ return new Promise((resolve, reject) => {
103
+ const timer = setTimeout(() => {
104
+ pending.delete(id);
105
+ reject(new TavoraError({ code: "TIMEOUT", message: `${method} timed out` }));
106
+ }, Math.max(timeoutMs, requestTimeoutMs));
107
+ pending.set(id, { resolve: resolve, reject, timer });
108
+ port.postMessage({ v: PROTOCOL_VERSION, id, method, params });
109
+ });
110
+ }
111
+ function on(event, fn) {
112
+ let set = listeners.get(event);
113
+ if (!set)
114
+ listeners.set(event, (set = new Set()));
115
+ const listener = fn;
116
+ set.add(listener);
117
+ // Initial suspension can arrive before connect() callers register listeners.
118
+ if (event === "lifecycle.suspend" && suspended) {
119
+ try {
120
+ listener(null);
121
+ }
122
+ catch (error) {
123
+ console.error(`[tavora] ${event} listener failed`, error);
124
+ }
125
+ }
126
+ return () => set.delete(listener);
127
+ }
128
+ const host = await call("bridge.handshake", { protocol: PROTOCOL_VERSION, sdkVersion: SDK_VERSION });
129
+ // panel.onNavigate: Tavora asks, the handler saves and switches, and the answer says how it went.
130
+ let navigate = null;
131
+ on("panel.navigate", ({ requestId, content }) => {
132
+ const handler = navigate;
133
+ void (async () => {
134
+ let ok = false;
135
+ if (handler) {
136
+ try {
137
+ await handler(content);
138
+ ok = true;
139
+ }
140
+ catch (error) {
141
+ console.error("[tavora] panel.onNavigate handler failed", error);
142
+ }
143
+ }
144
+ await call("panel.navigated", { requestId, handled: handler !== null, ok }).catch(() => { });
145
+ })();
146
+ });
147
+ return {
148
+ host,
149
+ game: {
150
+ getCurrent: () => call("game.getCurrent"),
151
+ },
152
+ storage: {
153
+ get: (key) => call("storage.get", { key }),
154
+ set: async (key, value) => {
155
+ await call("storage.set", { key, value });
156
+ },
157
+ delete: async (key) => {
158
+ await call("storage.delete", { key });
159
+ },
160
+ keys: () => call("storage.keys"),
161
+ app: {
162
+ get: (key) => call("storage.app.get", { key }),
163
+ set: async (key, value) => {
164
+ await call("storage.app.set", { key, value });
165
+ },
166
+ delete: async (key) => {
167
+ await call("storage.app.delete", { key });
168
+ },
169
+ keys: () => call("storage.app.keys"),
170
+ },
171
+ },
172
+ documents: {
173
+ list: () => call("documents.list"),
174
+ get: (id) => call("documents.get", { id }),
175
+ put: (document) => call("documents.put", document),
176
+ delete: async (id, options = {}) => {
177
+ await call("documents.delete", { id, ...options });
178
+ },
179
+ onChange: (fn) => on("documents.changed", fn),
180
+ },
181
+ panel: {
182
+ type: host.panel?.type ?? null,
183
+ getState: () => call("panel.getState"),
184
+ setState: async (value) => {
185
+ await call("panel.setState", { value });
186
+ },
187
+ getLaunch: () => call("panel.getLaunch"),
188
+ setContent: async (content) => {
189
+ await call("panel.setContent", { content });
190
+ },
191
+ onNavigate: (fn) => {
192
+ navigate = fn;
193
+ return () => {
194
+ if (navigate === fn)
195
+ navigate = null;
196
+ };
197
+ },
198
+ },
199
+ panels: {
200
+ // Tavora may wait for another panel to save first.
201
+ open: (type, options = {}) => call("panels.open", { type, ...(options.content ? { content: options.content } : {}) }, LIMITS.navigateTimeoutMs + 5_000),
202
+ },
203
+ workspace: {
204
+ getViewport: () => call("workspace.getViewport"),
205
+ onResize: (fn) => on("workspace.resize", fn),
206
+ },
207
+ ui: {
208
+ getTheme: () => call("ui.getTheme"),
209
+ onThemeChange: (fn) => on("ui.theme", fn),
210
+ getLanguage: () => call("ui.getLanguage"),
211
+ onLanguageChange: (fn) => on("ui.language", fn),
212
+ // The player may take their time choosing.
213
+ showMenu: (request) => call("ui.showMenu", request, MENU_TIMEOUT_MS),
214
+ },
215
+ blobs: {
216
+ put: async (file) => {
217
+ let response;
218
+ try {
219
+ response = await fetch(new URL(BLOB_PATH, window.location.href), {
220
+ method: "POST",
221
+ body: file,
222
+ headers: { "Content-Type": file.type || "application/octet-stream" },
223
+ });
224
+ }
225
+ catch {
226
+ throw new TavoraError({ code: "INTERNAL", message: "could not store the file" });
227
+ }
228
+ const body = (await response.json().catch(() => null));
229
+ if (!response.ok || !body || body.error) {
230
+ throw new TavoraError(body?.error ?? { code: "INTERNAL", message: `could not store the file (${response.status})` });
231
+ }
232
+ return body;
233
+ },
234
+ url: (id) => new URL(`${BLOB_PATH}${encodeURIComponent(id)}`, window.location.href).href,
235
+ list: () => call("blobs.list"),
236
+ usage: () => call("blobs.usage"),
237
+ delete: async (id) => {
238
+ await call("blobs.delete", { id });
239
+ },
240
+ },
241
+ clipboard: {
242
+ writeImage: async (png) => {
243
+ if (png.type !== "image/png")
244
+ throw new TavoraError({ code: "INVALID_PARAMS", message: "only a PNG picture can be copied" });
245
+ let response;
246
+ try {
247
+ response = await fetch(new URL(CLIPBOARD_PATH, window.location.href), { method: "POST", body: png, headers: { "Content-Type": "image/png" } });
248
+ }
249
+ catch {
250
+ throw new TavoraError({ code: "INTERNAL", message: "could not copy the picture" });
251
+ }
252
+ if (response.ok)
253
+ return;
254
+ const body = (await response.json().catch(() => null));
255
+ throw new TavoraError(body?.error ?? { code: "INTERNAL", message: `could not copy the picture (${response.status})` });
256
+ },
257
+ },
258
+ pictures: {
259
+ save: async (png, name = "") => {
260
+ if (png.type !== "image/png")
261
+ throw new TavoraError({ code: "INVALID_PARAMS", message: "only a PNG picture can be saved" });
262
+ const address = new URL(PICTURES_PATH, window.location.href);
263
+ if (name)
264
+ address.searchParams.set("name", name);
265
+ let response;
266
+ try {
267
+ response = await fetch(address, { method: "POST", body: png, headers: { "Content-Type": "image/png" } });
268
+ }
269
+ catch {
270
+ throw new TavoraError({ code: "INTERNAL", message: "could not save the picture" });
271
+ }
272
+ const body = (await response.json().catch(() => null));
273
+ if (response.ok && typeof body?.fileName === "string")
274
+ return { fileName: body.fileName };
275
+ throw new TavoraError(body?.error ?? { code: "INTERNAL", message: `could not save the picture (${response.status})` });
276
+ },
277
+ },
278
+ links: {
279
+ open: async (url) => {
280
+ await call("links.open", { url });
281
+ },
282
+ },
283
+ network: {
284
+ // The host gives up after its own limit; this waits a little longer so its answer arrives first.
285
+ fetch: (url, init = {}) => call("network.fetch", { ...init, url }, LIMITS.networkTimeoutMs + 5000),
286
+ },
287
+ connectors: {
288
+ aiUsage: {
289
+ accounts: () => call("aiUsage.accounts"),
290
+ read: (accountId) => call("aiUsage.read", { accountId }, LIMITS.aiUsageTimeoutMs + 5000),
291
+ onAccountsChange: (fn) => on("aiUsage.accountsChanged", () => fn()),
292
+ },
293
+ discord: {
294
+ state: () => call("discord.state"),
295
+ onStateChange: (fn) => on("discord.state", fn),
296
+ connect: async () => {
297
+ await call("discord.connect");
298
+ },
299
+ allowControl: async () => {
300
+ await call("discord.allowControl");
301
+ },
302
+ command: (command, args) => call("discord.command", { command, args }, LIMITS.discordTimeoutMs + 5000),
303
+ subscribe: async (event, channelId) => {
304
+ await call("discord.subscribe", channelId === undefined ? { event } : { event, channelId });
305
+ },
306
+ unsubscribe: async (event, channelId) => {
307
+ await call("discord.unsubscribe", channelId === undefined ? { event } : { event, channelId });
308
+ },
309
+ onEvent: (fn) => on("discord.event", fn),
310
+ image: (url) => call("discord.image", { url }),
311
+ },
312
+ },
313
+ lifecycle: {
314
+ onSuspend: (fn) => on("lifecycle.suspend", fn),
315
+ onResume: (fn) => on("lifecycle.resume", fn),
316
+ onDispose: (fn) => on("lifecycle.dispose", fn),
317
+ },
318
+ };
319
+ }
320
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}