@omujs/omu 0.9.40 → 0.9.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/dts/api/asset/extension.d.ts +1 -1
  3. package/dist/dts/api/dashboard/extension.d.ts +13 -31
  4. package/dist/dts/api/http/index.d.ts +2 -1
  5. package/dist/dts/api/registry/registry.d.ts +1 -1
  6. package/dist/dts/api/server/extension.d.ts +7 -1
  7. package/dist/dts/api/session/extension.d.ts +6 -5
  8. package/dist/dts/identifier.d.ts +1 -0
  9. package/dist/dts/index.d.ts +2 -1
  10. package/dist/dts/network/network.d.ts +2 -2
  11. package/dist/dts/omu.d.ts +3 -3
  12. package/dist/dts/result.d.ts +41 -0
  13. package/dist/dts/token.d.ts +4 -5
  14. package/dist/dts/version.d.ts +1 -1
  15. package/dist/esm/api/asset/extension.js +10 -7
  16. package/dist/esm/api/asset/index.js +10 -7
  17. package/dist/esm/api/dashboard/extension.js +140 -76
  18. package/dist/esm/api/dashboard/index.js +140 -75
  19. package/dist/esm/api/endpoint/endpoint.js +5 -2
  20. package/dist/esm/api/endpoint/extension.js +5 -2
  21. package/dist/esm/api/endpoint/index.js +5 -2
  22. package/dist/esm/api/endpoint/packets.js +5 -2
  23. package/dist/esm/api/extension.js +5 -2
  24. package/dist/esm/api/http/extension.js +5 -2
  25. package/dist/esm/api/http/index.js +6 -2
  26. package/dist/esm/api/i18n/extension.js +10 -7
  27. package/dist/esm/api/i18n/index.js +10 -7
  28. package/dist/esm/api/index.js +5 -2
  29. package/dist/esm/api/logger/extension.js +5 -2
  30. package/dist/esm/api/logger/index.js +5 -2
  31. package/dist/esm/api/logger/packets.js +5 -2
  32. package/dist/esm/api/permission/extension.js +5 -2
  33. package/dist/esm/api/permission/index.js +5 -2
  34. package/dist/esm/api/permission/permission.js +5 -2
  35. package/dist/esm/api/plugin/extension.js +5 -2
  36. package/dist/esm/api/plugin/index.js +5 -2
  37. package/dist/esm/api/registry/extension.js +10 -7
  38. package/dist/esm/api/registry/index.js +10 -7
  39. package/dist/esm/api/registry/packets.js +5 -2
  40. package/dist/esm/api/registry/registry.js +5 -2
  41. package/dist/esm/api/server/extension.js +25 -9
  42. package/dist/esm/api/server/index.js +25 -9
  43. package/dist/esm/api/session/extension.js +28 -17
  44. package/dist/esm/api/session/index.js +28 -17
  45. package/dist/esm/api/signal/extension.js +7 -4
  46. package/dist/esm/api/signal/index.js +5 -2
  47. package/dist/esm/api/signal/packets.js +5 -2
  48. package/dist/esm/api/signal/signal.js +5 -2
  49. package/dist/esm/api/table/extension.js +7 -4
  50. package/dist/esm/api/table/index.js +7 -4
  51. package/dist/esm/api/table/packets.js +5 -2
  52. package/dist/esm/api/table/table.js +5 -2
  53. package/dist/esm/app.js +5 -2
  54. package/dist/esm/errors.js +5 -2
  55. package/dist/esm/identifier.js +5 -2
  56. package/dist/esm/index.js +3441 -3333
  57. package/dist/esm/network/connection.js +5 -2
  58. package/dist/esm/network/encryption.js +5 -2
  59. package/dist/esm/network/index.js +6 -3
  60. package/dist/esm/network/network.js +6 -3
  61. package/dist/esm/network/packet/index.js +5 -2
  62. package/dist/esm/network/packet/packet-types.js +5 -2
  63. package/dist/esm/omu.js +176 -106
  64. package/dist/esm/result.js +68 -0
  65. package/dist/esm/token.js +7 -10
  66. package/dist/esm/version.js +3 -3
  67. package/package.json +1 -1
  68. package/src/api/asset/extension.ts +6 -6
  69. package/src/api/dashboard/extension.ts +105 -94
  70. package/src/api/http/index.ts +2 -1
  71. package/src/api/registry/extension.ts +6 -6
  72. package/src/api/registry/registry.ts +1 -1
  73. package/src/api/server/extension.ts +20 -1
  74. package/src/api/session/extension.ts +21 -12
  75. package/src/api/signal/extension.ts +2 -2
  76. package/src/api/table/extension.ts +2 -2
  77. package/src/identifier.ts +4 -0
  78. package/src/index.ts +2 -1
  79. package/src/network/network.ts +2 -2
  80. package/src/omu.ts +4 -4
  81. package/src/result.ts +78 -0
  82. package/src/token.ts +5 -9
  83. package/src/version.ts +1 -1
  84. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,68 @@
1
+ // @bun
2
+ // src/result.ts
3
+ async function tryCatch(promise) {
4
+ try {
5
+ const data = await promise;
6
+ return { data, error: null };
7
+ } catch (error) {
8
+ return { data: null, error };
9
+ }
10
+ }
11
+ function success(data) {
12
+ return { data, error: null };
13
+ }
14
+ function failure(error) {
15
+ return { data: null, error };
16
+ }
17
+
18
+ class PromiseResult {
19
+ promise;
20
+ constructor(promise) {
21
+ this.promise = promise;
22
+ }
23
+ static create() {
24
+ let resolve = () => {};
25
+ let reject = () => {};
26
+ const promise = new Promise((res, rej) => {
27
+ resolve = res;
28
+ reject = rej;
29
+ });
30
+ return {
31
+ promise: new PromiseResult(promise),
32
+ resolve,
33
+ reject
34
+ };
35
+ }
36
+ then(onfulfilled, onrejected) {
37
+ return this.promise.then(onfulfilled, onrejected);
38
+ }
39
+ catch(onrejected) {
40
+ return this.promise.catch(onrejected);
41
+ }
42
+ finally(onfinally) {
43
+ return this.promise.finally(onfinally);
44
+ }
45
+ [Symbol.toStringTag] = "ResultPromise";
46
+ async toResult() {
47
+ try {
48
+ return {
49
+ data: await this.promise,
50
+ error: null
51
+ };
52
+ } catch (err) {
53
+ return {
54
+ data: null,
55
+ error: err
56
+ };
57
+ }
58
+ }
59
+ }
60
+ export {
61
+ tryCatch,
62
+ success,
63
+ failure,
64
+ PromiseResult
65
+ };
66
+
67
+ //# debugId=5468463432485D3964756E2164756E21
68
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3Jlc3VsdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJleHBvcnQgdHlwZSBTdWNjZXNzPFQ+ID0ge1xuICAgIGRhdGE6IFQ7XG4gICAgZXJyb3I6IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBGYWlsdXJlPEU+ID0ge1xuICAgIGRhdGE6IG51bGw7XG4gICAgZXJyb3I6IEU7XG59O1xuXG5leHBvcnQgdHlwZSBSZXN1bHQ8VCwgRSA9IEVycm9yPiA9IFN1Y2Nlc3M8VD4gfCBGYWlsdXJlPEU+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCwgRSA9IEVycm9yPihcbiAgICBwcm9taXNlOiBQcm9taXNlPFQ+LFxuKTogUHJvbWlzZTxSZXN1bHQ8VCwgRT4+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIHsgZGF0YSwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvcjogZXJyb3IgYXMgRSB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1Y2Nlc3M8VD4oZGF0YTogVCk6IFJlc3VsdDxUPiB7XG4gICAgcmV0dXJuIHsgZGF0YSwgZXJyb3I6IG51bGwgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmU8RT4oZXJyb3I6IEUpOiBSZXN1bHQ8bnVsbCwgRT4ge1xuICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9taXNlUmVzdWx0PFQsIEUgPSBFcnJvcj4gaW1wbGVtZW50cyBQcm9taXNlPFQ+IHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8VD4sXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGU8VCwgRSA9IEVycm9yPigpOiB7IHByb21pc2U6IFByb21pc2VSZXN1bHQ8VCwgRT47IHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZDsgcmVqZWN0OiAoZXJyb3I6IEUpID0+IHZvaWQgfSB7XG4gICAgICAgIGxldCByZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICAgICAgbGV0IHJlamVjdDogKGVycm9yOiBFKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUgPSByZXM7XG4gICAgICAgICAgICByZWplY3QgPSByZWo7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2VSZXN1bHQ8VCwgRT4ocHJvbWlzZSksXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwgfCB1bmRlZmluZWQsIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogRSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4ob25yZWplY3RlZD86ICgocmVhc29uOiBFKSA9PiBUUmVzdWx0IHwgUHJvbWlzZUxpa2U8VFJlc3VsdD4pIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8VCB8IFRSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZS5jYXRjaChvbnJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IG51bGwgfCB1bmRlZmluZWQpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZS5maW5hbGx5KG9uZmluYWxseSk7XG4gICAgfVxuXG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZyA9ICdSZXN1bHRQcm9taXNlJztcblxuICAgIGFzeW5jIHRvUmVzdWx0KCk6IFByb21pc2U8UmVzdWx0PFQsIEU+PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRoaXMucHJvbWlzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgYXMgRSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOztBQVlBLGVBQXNCLFFBQXNCLENBQ3hDLFNBQ3FCO0FBQUEsRUFDckIsSUFBSTtBQUFBLElBQ0EsTUFBTSxPQUFPLE1BQU07QUFBQSxJQUNuQixPQUFPLEVBQUUsTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUM3QixPQUFPLE9BQU87QUFBQSxJQUNaLE9BQU8sRUFBRSxNQUFNLE1BQU0sTUFBa0I7QUFBQTtBQUFBO0FBSXhDLFNBQVMsT0FBVSxDQUFDLE1BQW9CO0FBQUEsRUFDM0MsT0FBTyxFQUFFLE1BQU0sT0FBTyxLQUFLO0FBQUE7QUFHeEIsU0FBUyxPQUFVLENBQUMsT0FBMkI7QUFBQSxFQUNsRCxPQUFPLEVBQUUsTUFBTSxNQUFNLE1BQU07QUFBQTtBQUFBO0FBR3hCLE1BQU0sY0FBa0Q7QUFBQSxFQUV0QztBQUFBLEVBRGIsV0FBVyxDQUNFLFNBQ25CO0FBQUEsSUFEbUI7QUFBQTtBQUFBLFNBR1AsTUFBb0IsR0FBOEY7QUFBQSxJQUM1SCxJQUFJLFVBQThCLE1BQU07QUFBQSxJQUN4QyxJQUFJLFNBQTZCLE1BQU07QUFBQSxJQUN2QyxNQUFNLFVBQVUsSUFBSSxRQUFXLENBQUMsS0FBSyxRQUFRO0FBQUEsTUFDekMsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLEtBQ1o7QUFBQSxJQUNELE9BQU87QUFBQSxNQUNILFNBQVMsSUFBSSxjQUFvQixPQUFPO0FBQUEsTUFDeEM7QUFBQSxNQUNBO0FBQUEsSUFDSjtBQUFBO0FBQUEsRUFHSixJQUFvQyxDQUFDLGFBQW1GLFlBQWlIO0FBQUEsSUFDck8sT0FBTyxLQUFLLFFBQVEsS0FBSyxhQUFhLFVBQVU7QUFBQTtBQUFBLEVBR3BELEtBQXNCLENBQUMsWUFBdUc7QUFBQSxJQUMxSCxPQUFPLEtBQUssUUFBUSxNQUFNLFVBQVU7QUFBQTtBQUFBLEVBR3hDLE9BQU8sQ0FBQyxXQUF5RDtBQUFBLElBQzdELE9BQU8sS0FBSyxRQUFRLFFBQVEsU0FBUztBQUFBO0FBQUEsR0FHeEMsT0FBTyxlQUF1QjtBQUFBLE9BRXpCLFNBQVEsR0FBMEI7QUFBQSxJQUNwQyxJQUFJO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDSCxNQUFNLE1BQU0sS0FBSztBQUFBLFFBQ2pCLE9BQU87QUFBQSxNQUNYO0FBQUEsTUFDRixPQUFPLEtBQUs7QUFBQSxNQUNWLE9BQU87QUFBQSxRQUNILE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxNQUNYO0FBQUE7QUFBQTtBQUdaOyIsCiAgImRlYnVnSWQiOiAiNTQ2ODQ2MzQzMjQ4NUQzOTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/dist/esm/token.js CHANGED
@@ -9,12 +9,9 @@ function tryCatch(func) {
9
9
  }
10
10
 
11
11
  // src/token.ts
12
- class BrowserTokenProvider {
13
- static TOKEN_PARAM_KEY = "_omu_session";
14
- getKey(address, app) {
15
- return JSON.stringify([address.host, address.port, address.hash ?? "", app.id.key()]);
16
- }
17
- async get(address, app) {
12
+ class BrowserSession {
13
+ static PARAM_NAME = "_omu_session";
14
+ async get(address) {
18
15
  const foundToken = this.parseParamSession(address);
19
16
  if (foundToken)
20
17
  return foundToken;
@@ -22,7 +19,7 @@ class BrowserTokenProvider {
22
19
  }
23
20
  parseParamSession(address) {
24
21
  const searchParams = new URLSearchParams(location.search);
25
- const param = searchParams.get(BrowserTokenProvider.TOKEN_PARAM_KEY);
22
+ const param = searchParams.get(BrowserSession.PARAM_NAME);
26
23
  if (!param)
27
24
  return;
28
25
  const { ok, data: session } = tryCatch(() => JSON.parse(param));
@@ -38,8 +35,8 @@ class BrowserTokenProvider {
38
35
  }
39
36
  }
40
37
  export {
41
- BrowserTokenProvider
38
+ BrowserSession
42
39
  };
43
40
 
44
- //# debugId=D80F3ACCD7BEF08A64756E2164756E21
45
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2hlbHBlci50cyIsICIuLi8uLi9zcmMvdG9rZW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAidHlwZSBPazxUPiA9IHtcbiAgICBvazogdHJ1ZTtcbiAgICBkYXRhOiBUO1xufTtcbnR5cGUgRXJyPEU+ID0ge1xuICAgIG9rOiBmYWxzZTtcbiAgICBkYXRhOiBFO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUNhdGNoPFQsIEUgPSBFcnJvcj4oZnVuYzogKCkgPT4gVCk6IE9rPFQ+IHwgRXJyPEU+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogZnVuYygpIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGRhdGE6IGUgYXMgRSB9O1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBZGRyZXNzIH0gZnJvbSAnLi9hZGRyZXNzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICcuL2FwcC5qcyc7XG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJy4vaGVscGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblByb3ZpZGVyIHtcbiAgICBnZXQoc2VydmVyQWRkcmVzczogQWRkcmVzcywgYXBwOiBBcHApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCB0eXBlIFNlc3Npb25QYXJhbSA9IHtcbiAgICBhZGRyZXNzOiBBZGRyZXNzO1xuICAgIHRva2VuOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgQnJvd3NlclRva2VuUHJvdmlkZXIgaW1wbGVtZW50cyBUb2tlblByb3ZpZGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRPS0VOX1BBUkFNX0tFWSA9ICdfb211X3Nlc3Npb24nO1xuXG4gICAgcHJpdmF0ZSBnZXRLZXkoYWRkcmVzczogQWRkcmVzcywgYXBwOiBBcHApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW2FkZHJlc3MuaG9zdCwgYWRkcmVzcy5wb3J0LCBhZGRyZXNzLmhhc2ggPz8gJycsIGFwcC5pZC5rZXkoKV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoYWRkcmVzczogQWRkcmVzcywgYXBwOiBBcHApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCBmb3VuZFRva2VuID0gdGhpcy5wYXJzZVBhcmFtU2Vzc2lvbihhZGRyZXNzKTtcbiAgICAgICAgaWYgKGZvdW5kVG9rZW4pIHJldHVybiBmb3VuZFRva2VuO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZVBhcmFtU2Vzc2lvbihhZGRyZXNzOiBBZGRyZXNzKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICBjb25zdCBwYXJhbSA9IHNlYXJjaFBhcmFtcy5nZXQoQnJvd3NlclRva2VuUHJvdmlkZXIuVE9LRU5fUEFSQU1fS0VZKTtcbiAgICAgICAgaWYgKCFwYXJhbSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB7IG9rLCBkYXRhOiBzZXNzaW9uIH0gPSB0cnlDYXRjaDxTZXNzaW9uUGFyYW0+KCgpID0+IEpTT04ucGFyc2UocGFyYW0pKTtcbiAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcGFyc2Ugc2Vzc2lvbiBmcm9tIFVSTCBwYXJhbWV0ZXI6ICR7c2Vzc2lvbn1gKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlc3Npb24uYWRkcmVzcy5oYXNoICE9PSBhZGRyZXNzLmhhc2gpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU2Vzc2lvbiBhZGRyZXNzIGhhc2ggZG9lcyBub3QgbWF0Y2g6IGV4cGVjdGVkICR7YWRkcmVzcy5oYXNofSwgZ290ICR7c2Vzc2lvbi5hZGRyZXNzLmhhc2h9YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXNzaW9uLnRva2VuO1xuICAgIH1cbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7O0FBU08sU0FBUyxRQUFzQixDQUFDLE1BQStCO0FBQUEsRUFDbEUsSUFBSTtBQUFBLElBQ0EsT0FBTyxFQUFFLElBQUksTUFBTSxNQUFNLEtBQUssRUFBRTtBQUFBLElBQ2xDLE9BQU8sR0FBRztBQUFBLElBQ1IsT0FBTyxFQUFFLElBQUksT0FBTyxNQUFNLEVBQU87QUFBQTtBQUFBOzs7QUNDbEMsTUFBTSxxQkFBOEM7QUFBQSxTQUNoQyxrQkFBa0I7QUFBQSxFQUVqQyxNQUFNLENBQUMsU0FBa0IsS0FBa0I7QUFBQSxJQUMvQyxPQUFPLEtBQUssVUFBVSxDQUFDLFFBQVEsTUFBTSxRQUFRLE1BQU0sUUFBUSxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQUE7QUFBQSxPQUczRSxJQUFHLENBQUMsU0FBa0IsS0FBdUM7QUFBQSxJQUN0RSxNQUFNLGFBQWEsS0FBSyxrQkFBa0IsT0FBTztBQUFBLElBQ2pELElBQUk7QUFBQSxNQUFZLE9BQU87QUFBQSxJQUN2QjtBQUFBO0FBQUEsRUFHSSxpQkFBaUIsQ0FBQyxTQUFzQztBQUFBLElBQzVELE1BQU0sZUFBZSxJQUFJLGdCQUFnQixTQUFTLE1BQU07QUFBQSxJQUN4RCxNQUFNLFFBQVEsYUFBYSxJQUFJLHFCQUFxQixlQUFlO0FBQUEsSUFDbkUsSUFBSSxDQUFDO0FBQUEsTUFBTztBQUFBLElBQ1osUUFBUSxJQUFJLE1BQU0sWUFBWSxTQUF1QixNQUFNLEtBQUssTUFBTSxLQUFLLENBQUM7QUFBQSxJQUM1RSxJQUFJLENBQUMsSUFBSTtBQUFBLE1BQ0wsUUFBUSxLQUFLLCtDQUErQyxTQUFTO0FBQUEsTUFDckU7QUFBQSxJQUNKO0FBQUEsSUFDQSxJQUFJLFFBQVEsUUFBUSxTQUFTLFFBQVEsTUFBTTtBQUFBLE1BQ3ZDLFFBQVEsS0FBSyxpREFBaUQsUUFBUSxhQUFhLFFBQVEsUUFBUSxNQUFNO0FBQUEsTUFDekc7QUFBQSxJQUNKO0FBQUEsSUFDQSxPQUFPLFFBQVE7QUFBQTtBQUV2QjsiLAogICJkZWJ1Z0lkIjogIkQ4MEYzQUNDRDdCRUYwOEE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
41
+ //# debugId=5F429A2ECACDD4F464756E2164756E21
42
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2hlbHBlci50cyIsICIuLi8uLi9zcmMvdG9rZW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAidHlwZSBPazxUPiA9IHtcbiAgICBvazogdHJ1ZTtcbiAgICBkYXRhOiBUO1xufTtcbnR5cGUgRXJyPEU+ID0ge1xuICAgIG9rOiBmYWxzZTtcbiAgICBkYXRhOiBFO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUNhdGNoPFQsIEUgPSBFcnJvcj4oZnVuYzogKCkgPT4gVCk6IE9rPFQ+IHwgRXJyPEU+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogZnVuYygpIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGRhdGE6IGUgYXMgRSB9O1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBZGRyZXNzIH0gZnJvbSAnLi9hZGRyZXNzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICcuL2FwcC5qcyc7XG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJy4vaGVscGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9Ub2tlblByb3ZpZGVyIHtcbiAgICBnZXQoc2VydmVyQWRkcmVzczogQWRkcmVzcywgYXBwOiBBcHApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCB0eXBlIFNlc3Npb25QYXJhbSA9IHtcbiAgICBhZGRyZXNzOiBBZGRyZXNzO1xuICAgIHRva2VuOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgQnJvd3NlclNlc3Npb24gaW1wbGVtZW50cyBTZXNzaW9Ub2tlblByb3ZpZGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBBUkFNX05BTUUgPSAnX29tdV9zZXNzaW9uJztcblxuICAgIHB1YmxpYyBhc3luYyBnZXQoYWRkcmVzczogQWRkcmVzcyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IGZvdW5kVG9rZW4gPSB0aGlzLnBhcnNlUGFyYW1TZXNzaW9uKGFkZHJlc3MpO1xuICAgICAgICBpZiAoZm91bmRUb2tlbikgcmV0dXJuIGZvdW5kVG9rZW47XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlUGFyYW1TZXNzaW9uKGFkZHJlc3M6IEFkZHJlc3MpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gc2VhcmNoUGFyYW1zLmdldChCcm93c2VyU2Vzc2lvbi5QQVJBTV9OQU1FKTtcbiAgICAgICAgaWYgKCFwYXJhbSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB7IG9rLCBkYXRhOiBzZXNzaW9uIH0gPSB0cnlDYXRjaDxTZXNzaW9uUGFyYW0+KCgpID0+IEpTT04ucGFyc2UocGFyYW0pKTtcbiAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcGFyc2Ugc2Vzc2lvbiBmcm9tIFVSTCBwYXJhbWV0ZXI6ICR7c2Vzc2lvbn1gKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlc3Npb24uYWRkcmVzcy5oYXNoICE9PSBhZGRyZXNzLmhhc2gpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU2Vzc2lvbiBhZGRyZXNzIGhhc2ggZG9lcyBub3QgbWF0Y2g6IGV4cGVjdGVkICR7YWRkcmVzcy5oYXNofSwgZ290ICR7c2Vzc2lvbi5hZGRyZXNzLmhhc2h9YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXNzaW9uLnRva2VuO1xuICAgIH1cbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7O0FBU08sU0FBUyxRQUFzQixDQUFDLE1BQStCO0FBQUEsRUFDbEUsSUFBSTtBQUFBLElBQ0EsT0FBTyxFQUFFLElBQUksTUFBTSxNQUFNLEtBQUssRUFBRTtBQUFBLElBQ2xDLE9BQU8sR0FBRztBQUFBLElBQ1IsT0FBTyxFQUFFLElBQUksT0FBTyxNQUFNLEVBQU87QUFBQTtBQUFBOzs7QUNDbEMsTUFBTSxlQUE4QztBQUFBLFNBQ2hDLGFBQWE7QUFBQSxPQUV2QixJQUFHLENBQUMsU0FBK0M7QUFBQSxJQUM1RCxNQUFNLGFBQWEsS0FBSyxrQkFBa0IsT0FBTztBQUFBLElBQ2pELElBQUk7QUFBQSxNQUFZLE9BQU87QUFBQSxJQUN2QjtBQUFBO0FBQUEsRUFHSSxpQkFBaUIsQ0FBQyxTQUFzQztBQUFBLElBQzVELE1BQU0sZUFBZSxJQUFJLGdCQUFnQixTQUFTLE1BQU07QUFBQSxJQUN4RCxNQUFNLFFBQVEsYUFBYSxJQUFJLGVBQWUsVUFBVTtBQUFBLElBQ3hELElBQUksQ0FBQztBQUFBLE1BQU87QUFBQSxJQUNaLFFBQVEsSUFBSSxNQUFNLFlBQVksU0FBdUIsTUFBTSxLQUFLLE1BQU0sS0FBSyxDQUFDO0FBQUEsSUFDNUUsSUFBSSxDQUFDLElBQUk7QUFBQSxNQUNMLFFBQVEsS0FBSywrQ0FBK0MsU0FBUztBQUFBLE1BQ3JFO0FBQUEsSUFDSjtBQUFBLElBQ0EsSUFBSSxRQUFRLFFBQVEsU0FBUyxRQUFRLE1BQU07QUFBQSxNQUN2QyxRQUFRLEtBQUssaURBQWlELFFBQVEsYUFBYSxRQUFRLFFBQVEsTUFBTTtBQUFBLE1BQ3pHO0FBQUEsSUFDSjtBQUFBLElBQ0EsT0FBTyxRQUFRO0FBQUE7QUFFdkI7IiwKICAiZGVidWdJZCI6ICI1RjQyOUEyRUNBQ0RENEY0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
@@ -1,11 +1,11 @@
1
1
  // @bun
2
2
  // src/version.ts
3
- var VERSION = "0.9.40";
3
+ var VERSION = "0.9.42";
4
4
  var VERSION_MINOR = "0.9.0";
5
5
  export {
6
6
  VERSION_MINOR,
7
7
  VERSION
8
8
  };
9
9
 
10
- //# debugId=46389A0784D09A0864756E2164756E21
11
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3ZlcnNpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC45LjQwJztcbmV4cG9ydCBjb25zdCBWRVJTSU9OX01JTk9SID0gJzAuOS4wJztcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7O0FBQU8sSUFBTSxVQUFVO0FBQ2hCLElBQU0sZ0JBQWdCOyIsCiAgImRlYnVnSWQiOiAiNDYzODlBMDc4NEQwOUEwODY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
10
+ //# debugId=03BC92E1B0A4505964756E2164756E21
11
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3ZlcnNpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC45LjQyJztcbmV4cG9ydCBjb25zdCBWRVJTSU9OX01JTk9SID0gJzAuOS4wJztcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7O0FBQU8sSUFBTSxVQUFVO0FBQ2hCLElBQU0sZ0JBQWdCOyIsCiAgImRlYnVnSWQiOiAiMDNCQzkyRTFCMEE0NTA1OTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@omujs/omu",
4
- "version": "0.9.40",
4
+ "version": "0.9.42",
5
5
  "main": "./dist/esm/index.js",
6
6
  "types": "./dist/dts/index.d.ts",
7
7
  "exports": {
@@ -10,14 +10,14 @@ export const ASSET_EXTENSION_TYPE: ExtensionType<AssetExtension> = new Extension
10
10
  );
11
11
 
12
12
  export type Asset = {
13
- identifier: Identifier;
13
+ id: Identifier;
14
14
  buffer: Uint8Array;
15
15
  };
16
16
 
17
17
  const FILE_SERIALIZER = new Serializer<Asset, Uint8Array>(
18
18
  (file) => {
19
19
  const writer = new ByteWriter();
20
- writer.writeString(file.identifier.key());
20
+ writer.writeString(file.id.key());
21
21
  writer.writeUint8Array(file.buffer);
22
22
  return writer.finish();
23
23
  },
@@ -26,7 +26,7 @@ const FILE_SERIALIZER = new Serializer<Asset, Uint8Array>(
26
26
  const identifier = Identifier.fromKey(reader.readString());
27
27
  const buffer = reader.readUint8Array();
28
28
  reader.finish();
29
- return { identifier, buffer };
29
+ return { id: identifier, buffer };
30
30
  },
31
31
  );
32
32
  const FILE_ARRAY_SERIALIZER = new Serializer<Asset[], Uint8Array>(
@@ -34,7 +34,7 @@ const FILE_ARRAY_SERIALIZER = new Serializer<Asset[], Uint8Array>(
34
34
  const writer = new ByteWriter();
35
35
  writer.writeULEB128(files.length);
36
36
  for (const file of files) {
37
- writer.writeString(file.identifier.key());
37
+ writer.writeString(file.id.key());
38
38
  writer.writeUint8Array(file.buffer);
39
39
  }
40
40
  return writer.finish();
@@ -46,7 +46,7 @@ const FILE_ARRAY_SERIALIZER = new Serializer<Asset[], Uint8Array>(
46
46
  for (let i = 0; i < length; i++) {
47
47
  const identifier = Identifier.fromKey(reader.readString());
48
48
  const buffer = reader.readUint8Array();
49
- files.push({ identifier, buffer });
49
+ files.push({ id: identifier, buffer });
50
50
  }
51
51
  reader.finish();
52
52
  return files;
@@ -125,7 +125,7 @@ export class AssetExtension {
125
125
 
126
126
  public async upload(identifier: IntoId, buffer: Uint8Array): Promise<Identifier> {
127
127
  const assetIdentifier = await this.omu.endpoints.call(ASSET_UPLOAD_ENDPOINT, {
128
- identifier: Identifier.from(identifier),
128
+ id: Identifier.from(identifier),
129
129
  buffer,
130
130
  });
131
131
  return assetIdentifier;
@@ -2,6 +2,7 @@ import { App, AppJson } from '../../app.js';
2
2
  import { Identifier, IdentifierMap } from '../../identifier';
3
3
  import { PacketType } from '../../network/packet/packet.js';
4
4
  import { Omu } from '../../omu.js';
5
+ import { PromiseResult } from '../../result.js';
5
6
  import { Serializer } from '../../serialize';
6
7
  import { EndpointType } from '../endpoint/endpoint.js';
7
8
  import { ExtensionType } from '../extension.js';
@@ -94,11 +95,11 @@ export type Cookie = {
94
95
 
95
96
  export type WebviewRequest = {
96
97
  url: string;
97
- script: string;
98
+ script?: string;
98
99
  };
99
100
 
100
101
  export type WebviewPacket = {
101
- id: Identifier;
102
+ id: string;
102
103
  };
103
104
 
104
105
  export type UserResponse<T = undefined> = {
@@ -109,25 +110,10 @@ export type UserResponse<T = undefined> = {
109
110
  } | {
110
111
  type: 'cancelled';
111
112
  };
112
- export class UserResult<T> {
113
- constructor(
114
- public result: {
115
- type: 'ok';
116
- value: T;
117
- } | {
118
- type: 'blocked';
119
- } | {
120
- type: 'cancelled';
121
- },
122
- ) {}
123
-
124
- public unwrap(): T {
125
- if (this.result.type === 'ok') return this.result.value;
126
- throw new Error(`Tried to unwrap a ${this.result.type} result`);
127
- }
128
- }
129
113
 
130
- export type WebviewResponse = UserResponse & WebviewPacket;
114
+ export type UserError = Exclude<UserResponse, { type: 'ok' }>;
115
+
116
+ export type WebviewResponse = UserResponse<WebviewPacket>;
131
117
 
132
118
  export const DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('webview');
133
119
 
@@ -146,17 +132,11 @@ const DASHBOARD_COOKIES_GET = EndpointType.createJson<GetCookiesRequest, UserRes
146
132
 
147
133
  const DASHBOARD_WEBVIEW_REQUEST = EndpointType.createJson<WebviewRequest, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {
148
134
  name: 'webview_request',
149
- responseSerializer: Serializer.noop<WebviewResponse>()
150
- .field('id', Identifier),
151
135
  permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,
152
136
  });
153
137
 
154
138
  const DASHBOARD_WEBVIEW_CLOSE = EndpointType.createJson<WebviewPacket, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {
155
139
  name: 'webview_close',
156
- requestSerializer: Serializer.noop<WebviewPacket>()
157
- .field('id', Identifier),
158
- responseSerializer: Serializer.noop<WebviewResponse>()
159
- .field('id', Identifier),
160
140
  permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,
161
141
  });
162
142
 
@@ -186,9 +166,9 @@ export type WebviewEventPacket = {
186
166
  export type WebviewHandle = {
187
167
  readonly id: Identifier;
188
168
  readonly url: string;
189
- getCookies(): Promise<Cookie[]>;
190
- close(): void;
169
+ getCookies(): PromiseResult<Cookie[], UserError>;
191
170
  on<T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void;
171
+ close(): Promise<void>;
192
172
  join(): Promise<void>;
193
173
  };
194
174
 
@@ -464,10 +444,10 @@ export class DashboardExtension {
464
444
  this.dashboard = dashboard;
465
445
  this.omu.endpoints.bind(DASHBOARD_COOKIES_GET, async (request, params): Promise<UserResponse<Cookie[]>> => {
466
446
  const { url } = request;
467
- const { hostname } = new URL(url);
447
+ const { host } = new URL(url);
468
448
  const id = params.caller.key();
469
449
  const allowedHost: AllowedHost = await this.allowedHosts.get(id) ?? { id, hosts: [] };
470
- const allowed = allowedHost.hosts.includes(hostname);
450
+ const allowed = allowedHost.hosts.includes(host);
471
451
  if (!allowed) {
472
452
  return {
473
453
  type: 'cancelled',
@@ -494,6 +474,24 @@ export class DashboardExtension {
494
474
  return result;
495
475
  });
496
476
  this.omu.endpoints.bind(DASHBOARD_WEBVIEW_REQUEST, async (request, params): Promise<WebviewResponse> => {
477
+ const url = new URL(request.url);
478
+ const { host } = url;
479
+ {
480
+ const id = params.caller.key();
481
+ const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id, hosts: [] };
482
+ const allowed = hostEntry.hosts.includes(host);
483
+ if (!allowed) {
484
+ const result = await dashboard.hostRequested({
485
+ host,
486
+ }, params);
487
+ if (result.type === 'ok') {
488
+ hostEntry.hosts.push();
489
+ await this.allowedHosts.update(hostEntry);
490
+ } else {
491
+ return { type: 'cancelled' };
492
+ }
493
+ }
494
+ }
497
495
  const emit = async (event: WebviewEvent) => {
498
496
  this.omu.send(DASHBOARD_WEBVIEW_EVENT_PACKET, {
499
497
  id,
@@ -504,8 +502,9 @@ export class DashboardExtension {
504
502
  const id = await dashboard.createWebview(request, params, emit);
505
503
  return {
506
504
  type: 'ok',
507
- id,
508
- value: undefined,
505
+ value: {
506
+ id: id.key(),
507
+ },
509
508
  };
510
509
  });
511
510
  this.omu.endpoints.bind(DASHBOARD_WEBVIEW_CLOSE, async (request, params): Promise<WebviewResponse> => {
@@ -513,14 +512,14 @@ export class DashboardExtension {
513
512
  if (!id) {
514
513
  return {
515
514
  type: 'cancelled',
516
- id: request.id,
517
515
  };
518
516
  }
519
517
  await dashboard.closeWebview(request, params);
520
518
  return {
521
519
  type: 'ok',
522
- id,
523
- value: undefined,
520
+ value: {
521
+ id: id.key(),
522
+ },
524
523
  };
525
524
  });
526
525
  this.omu.endpoints.bind(DASHBOARD_SPEECH_RECOGNITION_START, async (request, params): Promise<UserResponse<undefined>> => {
@@ -538,70 +537,74 @@ export class DashboardExtension {
538
537
  });
539
538
  }
540
539
 
541
- public async requestHost(options: { host: string }): Promise<UserResponse> {
542
- return this.omu.endpoints.call(
543
- DASHBOARD_HOST_REQUEST,
544
- options,
545
- );
546
- }
547
-
548
- public async requestWebview(options: WebviewRequest): Promise<UserResult<WebviewHandle>> {
549
- const result = await this.omu.endpoints.call(
540
+ public requestWebview(options: WebviewRequest): PromiseResult<WebviewHandle, UserError> {
541
+ const { promise, resolve, reject } = PromiseResult.create<WebviewHandle, UserError>();
542
+ this.omu.endpoints.call(
550
543
  DASHBOARD_WEBVIEW_REQUEST,
551
544
  options,
552
- );
553
- if (result.type !== 'ok') return new UserResult(result);
554
- const { id } = result;
555
- const eventListeners: WebviewEventListeners = {};
556
- const handle: WebviewHandle = {
557
- id,
558
- url: options.url,
559
- close: async () => {
560
- await this.omu.endpoints.call(
561
- DASHBOARD_WEBVIEW_CLOSE,
562
- { id },
563
- );
564
- },
565
- getCookies: async () => {
566
- const cookies = (await this.getCookies({
545
+ ).then((result) => {
546
+ if (result.type !== 'ok') {
547
+ reject(result);
548
+ return;
549
+ }
550
+ const { value } = result;
551
+ const id = Identifier.fromKey(value.id);
552
+ const eventListeners: WebviewEventListeners = {};
553
+ const handle: WebviewHandle = {
554
+ id,
555
+ url: options.url,
556
+ close: async () => {
557
+ await this.omu.endpoints.call(
558
+ DASHBOARD_WEBVIEW_CLOSE,
559
+ { id: id.key() },
560
+ );
561
+ },
562
+ getCookies: () => this.getCookies({
567
563
  url: options.url,
568
- })).unwrap();
569
- return cookies;
570
- },
571
- on: function <T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void {
572
- if (!eventListeners[key]) {
573
- eventListeners[key] = [];
574
- }
575
- const listeners = eventListeners[key]!;
576
- listeners.push(callback);
577
- },
578
- join: async () => {
579
- await new Promise<void>((resolve) => {
580
- handle.on('closed', () => resolve());
581
- });
582
- },
583
- };
584
- this.webviewHandles.set(id, {
585
- handle,
586
- emit: function <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>): void {
587
- const listeners = eventListeners[event.type];
588
- if (!listeners) return;
589
- for (const listener of listeners) {
590
- listener(event);
591
- }
592
- },
593
- });
594
- return new UserResult({
595
- type: 'ok',
596
- value: handle,
564
+ }),
565
+ on: function <T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void {
566
+ if (!eventListeners[key]) {
567
+ eventListeners[key] = [];
568
+ }
569
+ const listeners = eventListeners[key]!;
570
+ listeners.push(callback);
571
+ },
572
+ join: async () => {
573
+ await new Promise<void>((resolve) => {
574
+ handle.on('closed', () => resolve());
575
+ });
576
+ },
577
+ };
578
+ this.webviewHandles.set(id, {
579
+ handle,
580
+ emit: function <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>): void {
581
+ const listeners = eventListeners[event.type];
582
+ if (!listeners) return;
583
+ for (const listener of listeners) {
584
+ listener(event);
585
+ }
586
+ },
587
+ });
588
+
589
+ resolve(handle);
597
590
  });
591
+ return promise;
598
592
  }
599
593
 
600
- public async getCookies(options: GetCookiesRequest): Promise<UserResult<Cookie[]>> {
601
- return new UserResult(await this.omu.endpoints.call(
594
+ public getCookies(options: GetCookiesRequest): PromiseResult<Cookie[], UserError> {
595
+ const { promise, resolve, reject } = PromiseResult.create<Cookie[], UserError>();
596
+ this.omu.endpoints.call(
602
597
  DASHBOARD_COOKIES_GET,
603
598
  options,
604
- ));
599
+ ).then((response) => {
600
+ if (response.type === 'ok') {
601
+ resolve(response.value);
602
+ return;
603
+ } else {
604
+ reject(response);
605
+ }
606
+ });
607
+ return promise;
605
608
  }
606
609
 
607
610
  public async openApp(app: App): Promise<void> {
@@ -616,7 +619,7 @@ export class DashboardExtension {
616
619
  return await this.omu.endpoints.call(DASHBOARD_PROMPT_CLEAR_BLOCKED, null);
617
620
  }
618
621
 
619
- public async requireDragDrop(): Promise<DragDropHandler> {
622
+ public async requestDragDrop(): Promise<DragDropHandler> {
620
623
  await this.omu.endpoints.call(DASHBOARD_DRAG_DROP_REQUEST_ENDPOINT, {});
621
624
  const listeners = this.dragDropListeners;
622
625
  const client = this.omu;
@@ -634,7 +637,15 @@ export class DashboardExtension {
634
637
  this.omu.send(DASHBOARD_DRAG_DROP_STATE_PACKET, packet);
635
638
  }
636
639
 
637
- public async speechRecognitionStart(): Promise<void> {
638
- await this.omu.endpoints.call(DASHBOARD_SPEECH_RECOGNITION_START, { type: 'start' });
640
+ public requestSpeechRecognition(): PromiseResult<Registry<TranscriptStatus>, UserError> {
641
+ const { promise, resolve, reject } = PromiseResult.create<Registry<TranscriptStatus>, UserError>();
642
+ this.omu.endpoints.call(DASHBOARD_SPEECH_RECOGNITION_START, { type: 'start' }).then((result) => {
643
+ if (result.type === 'ok') {
644
+ resolve(this.speechRecognition);
645
+ } else {
646
+ reject(result);
647
+ }
648
+ });
649
+ return promise;
639
650
  }
640
651
  }
@@ -1,2 +1,3 @@
1
- export { HTTP_REQUEST_PERMISSION_ID, OmuWS, type WSMsg } from './extension';
1
+ export { HTTP_REQUEST_PERMISSION_ID } from './extension';
2
+ export { OmuWS, type WSMsg } from './websocket';
2
3
 
@@ -41,7 +41,7 @@ export class RegistryExtension implements Extension {
41
41
  }
42
42
 
43
43
  public json<T, D extends JsonType = JsonType>(name: string, options: { default: T; serializer?: Serializer<T, D> }): Registry<T> {
44
- const identifier = this.omu.app.id.join(name);
44
+ const identifier = this.omu.app.id.base.join(name);
45
45
  if (this.registries.has(identifier)) {
46
46
  throw new Error(`Registry with name '${name}' already exists`);
47
47
  }
@@ -54,7 +54,7 @@ export class RegistryExtension implements Extension {
54
54
  }
55
55
 
56
56
  public serialized<T>(name: string, options: { default: T; serializer: Serializer<T, Uint8Array> }): Registry<T> {
57
- const identifier = this.omu.app.id.join(name);
57
+ const identifier = this.omu.app.id.base.join(name);
58
58
  if (this.registries.has(identifier)) {
59
59
  throw new Error(`Registry with name '${name}' already exists`);
60
60
  }
@@ -121,12 +121,12 @@ class RegistryImpl<T> implements Registry<T> {
121
121
  return value;
122
122
  }
123
123
 
124
- public async modify(fn: (value: T) => PromiseLike<T> | T): Promise<T> {
124
+ public async modify(fn: (value: T) => PromiseLike<void> | void): Promise<T> {
125
125
  const value = await this.lock.use(async () => {
126
126
  const value = await this.#get();
127
- const newValue = await fn(value);
128
- await this.#set(newValue);
129
- return newValue;
127
+ await fn(value);
128
+ await this.#set(value);
129
+ return value;
130
130
  });
131
131
  this.eventEmitter.emit(value);
132
132
  return value;
@@ -68,7 +68,7 @@ export interface Registry<T> {
68
68
  get(): Promise<T>;
69
69
  set(value: T): Promise<void>;
70
70
  update(fn: (value: T) => PromiseLike<T> | T): Promise<T>;
71
- modify(fn: (value: T) => PromiseLike<T> | T): Promise<T>;
71
+ modify(fn: (value: T) => PromiseLike<void> | void): Promise<T>;
72
72
  listen(fn: (value: T) => void): Unlisten;
73
73
 
74
74
  compatSvelte(): Writable<T>;
@@ -1,5 +1,5 @@
1
1
  import { App, AppJson } from '../../app.js';
2
- import { Identifier, IdentifierMap } from '../../identifier';
2
+ import { Identifier, IdentifierMap, IntoId } from '../../identifier';
3
3
  import { LocalizedText } from '../../localization/localization.js';
4
4
  import { Omu } from '../../omu.js';
5
5
  import { EndpointType } from '../endpoint/endpoint.js';
@@ -116,6 +116,14 @@ export class AppIndexRegistry {
116
116
  public meta: AppIndexRegistryMeta | undefined,
117
117
  ) { }
118
118
 
119
+ public static build(options: { id: IntoId; meta: AppIndexRegistryMeta; apps: App[] }): AppIndexRegistry {
120
+ return new AppIndexRegistry(
121
+ Identifier.from(options.id),
122
+ new IdentifierMap(options.apps.map((app) => [app.id, app])),
123
+ options.meta,
124
+ );
125
+ }
126
+
119
127
  public static fromJSON(json: AppIndexRegistryJSON): AppIndexRegistry {
120
128
  const id = Identifier.fromKey(json['id']);
121
129
  const apps = new IdentifierMap<App>();
@@ -133,4 +141,15 @@ export class AppIndexRegistry {
133
141
  json.meta,
134
142
  );
135
143
  }
144
+
145
+ public toJSON(): AppIndexRegistryJSON {
146
+ return {
147
+ id: this.id.key(),
148
+ meta: this.meta,
149
+ apps: Object.fromEntries([...this.apps.entries()].map(([id, app]) => [
150
+ id.key(),
151
+ App.serialize(app),
152
+ ])),
153
+ };
154
+ }
136
155
  }
@@ -3,6 +3,7 @@ import { Identifier, IdentifierMap, IdentifierSet, IntoId } from '../../identifi
3
3
  import { PacketType } from '../../network/packet';
4
4
  import { Omu } from '../../omu';
5
5
  import { Serializer } from '../../serialize';
6
+ import { SessionParam } from '../../token';
6
7
  import { EndpointType } from '../endpoint';
7
8
  import { Extension, ExtensionType } from '../extension';
8
9
  import { SessionObserver } from '../server/extension';
@@ -105,20 +106,21 @@ export class SessionExtension implements Extension {
105
106
  return await this.sessions.has(Identifier.from(id).key());
106
107
  }
107
108
 
108
- public observe(appId: IntoId, {
109
- onConnect,
110
- onDisconnect,
111
- }: {
112
- onConnect(app: App): void;
113
- onDisconnect(app: App): void;
109
+ public observe(appId: IntoId, options?: {
110
+ onConnect?(app: App): void;
111
+ onDisconnect?(app: App): void;
114
112
  }): SessionObserver {
115
113
  const id = Identifier.from(appId);
116
114
  if (this.omu.running) {
117
115
  this.omu.send(SESSION_OBSERVE_PACKET_TYPE, [id]);
118
116
  }
119
117
  const observer = this.sessionObservers.get(id) ?? new SessionObserver([], []);
120
- observer.onConnect(onConnect);
121
- observer.onDisconnect(onDisconnect);
118
+ if (options?.onConnect) {
119
+ observer.onConnect(options.onConnect);
120
+ }
121
+ if (options?.onDisconnect) {
122
+ observer.onDisconnect(options.onDisconnect);
123
+ }
122
124
  this.sessionObservers.set(id, observer);
123
125
  return observer;
124
126
  }
@@ -186,11 +188,18 @@ export class SessionExtension implements Extension {
186
188
 
187
189
  public async generateToken(options: {
188
190
  app: App;
189
- permissions: IntoId[];
190
- }): Promise<GenerateTokenResponse> {
191
- return this.omu.endpoints.call(GENERATE_TOKEN_ENDPOINT_TYPE, {
191
+ permissions?: IntoId[];
192
+ }): Promise<SessionParam> {
193
+ const result = await this.omu.endpoints.call(GENERATE_TOKEN_ENDPOINT_TYPE, {
192
194
  app: App.serialize(options.app),
193
- permissions: options.permissions.map(id => Identifier.from(id).key()),
195
+ permissions: options.permissions?.map(id => Identifier.from(id).key()),
194
196
  });
197
+ if (result.type === 'error') {
198
+ throw new Error(result.message);
199
+ }
200
+ return {
201
+ token: result.token,
202
+ address: this.omu.address,
203
+ };
195
204
  }
196
205
  }