@omujs/omu 0.9.41 → 0.9.43

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 (47) 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/session/extension.d.ts +5 -4
  7. package/dist/dts/index.d.ts +1 -1
  8. package/dist/dts/network/network.d.ts +2 -2
  9. package/dist/dts/omu.d.ts +3 -3
  10. package/dist/dts/result.d.ts +41 -0
  11. package/dist/dts/token.d.ts +4 -5
  12. package/dist/dts/version.d.ts +1 -1
  13. package/dist/esm/api/asset/extension.js +7 -7
  14. package/dist/esm/api/asset/index.js +7 -7
  15. package/dist/esm/api/dashboard/extension.js +145 -96
  16. package/dist/esm/api/dashboard/index.js +145 -95
  17. package/dist/esm/api/http/index.js +3 -2
  18. package/dist/esm/api/i18n/extension.js +5 -5
  19. package/dist/esm/api/i18n/index.js +5 -5
  20. package/dist/esm/api/registry/extension.js +5 -5
  21. package/dist/esm/api/registry/index.js +5 -5
  22. package/dist/esm/api/registry/registry.js +1 -1
  23. package/dist/esm/api/server/extension.js +5 -5
  24. package/dist/esm/api/server/index.js +5 -5
  25. package/dist/esm/api/session/extension.js +16 -12
  26. package/dist/esm/api/session/index.js +16 -12
  27. package/dist/esm/index.js +171 -120
  28. package/dist/esm/network/index.js +3 -3
  29. package/dist/esm/network/network.js +3 -3
  30. package/dist/esm/omu.js +170 -119
  31. package/dist/esm/result.js +68 -0
  32. package/dist/esm/token.js +7 -10
  33. package/dist/esm/version.js +3 -3
  34. package/package.json +1 -1
  35. package/src/api/asset/extension.ts +6 -6
  36. package/src/api/dashboard/extension.ts +116 -114
  37. package/src/api/http/index.ts +2 -1
  38. package/src/api/registry/extension.ts +4 -4
  39. package/src/api/registry/registry.ts +1 -1
  40. package/src/api/session/extension.ts +15 -10
  41. package/src/index.ts +1 -1
  42. package/src/network/network.ts +2 -2
  43. package/src/omu.ts +4 -4
  44. package/src/result.ts +78 -0
  45. package/src/token.ts +5 -9
  46. package/src/version.ts +1 -1
  47. 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.41";
3
+ var VERSION = "0.9.43";
4
4
  var VERSION_MINOR = "0.9.0";
5
5
  export {
6
6
  VERSION_MINOR,
7
7
  VERSION
8
8
  };
9
9
 
10
- //# debugId=3ACA251B129C8C8164756E2164756E21
11
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3ZlcnNpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC45LjQxJztcbmV4cG9ydCBjb25zdCBWRVJTSU9OX01JTk9SID0gJzAuOS4wJztcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7O0FBQU8sSUFBTSxVQUFVO0FBQ2hCLElBQU0sZ0JBQWdCOyIsCiAgImRlYnVnSWQiOiAiM0FDQTI1MUIxMjlDOEM4MTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
10
+ //# debugId=FF0725BD19B7DDEC64756E2164756E21
11
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3ZlcnNpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC45LjQzJztcbmV4cG9ydCBjb25zdCBWRVJTSU9OX01JTk9SID0gJzAuOS4wJztcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7O0FBQU8sSUFBTSxVQUFVO0FBQ2hCLElBQU0sZ0JBQWdCOyIsCiAgImRlYnVnSWQiOiAiRkYwNzI1QkQxOUI3RERFQzY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@omujs/omu",
4
- "version": "0.9.41",
4
+ "version": "0.9.43",
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,8 +2,10 @@ 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';
8
+ import { InvokedParams } from '../endpoint/packets.js';
7
9
  import { ExtensionType } from '../extension.js';
8
10
  import { PermissionTypeJson } from '../permission/permission.js';
9
11
  import { PackageInfo } from '../plugin/package-info.js';
@@ -94,11 +96,11 @@ export type Cookie = {
94
96
 
95
97
  export type WebviewRequest = {
96
98
  url: string;
97
- script: string;
99
+ script?: string;
98
100
  };
99
101
 
100
102
  export type WebviewPacket = {
101
- id: Identifier;
103
+ id: string;
102
104
  };
103
105
 
104
106
  export type UserResponse<T = undefined> = {
@@ -109,25 +111,10 @@ export type UserResponse<T = undefined> = {
109
111
  } | {
110
112
  type: 'cancelled';
111
113
  };
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
114
 
130
- export type WebviewResponse = UserResponse & WebviewPacket;
115
+ export type UserError = Exclude<UserResponse, { type: 'ok' }>;
116
+
117
+ export type WebviewResponse = UserResponse<WebviewPacket>;
131
118
 
132
119
  export const DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('webview');
133
120
 
@@ -146,17 +133,11 @@ const DASHBOARD_COOKIES_GET = EndpointType.createJson<GetCookiesRequest, UserRes
146
133
 
147
134
  const DASHBOARD_WEBVIEW_REQUEST = EndpointType.createJson<WebviewRequest, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {
148
135
  name: 'webview_request',
149
- responseSerializer: Serializer.noop<WebviewResponse>()
150
- .field('id', Identifier),
151
136
  permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,
152
137
  });
153
138
 
154
139
  const DASHBOARD_WEBVIEW_CLOSE = EndpointType.createJson<WebviewPacket, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {
155
140
  name: 'webview_close',
156
- requestSerializer: Serializer.noop<WebviewPacket>()
157
- .field('id', Identifier),
158
- responseSerializer: Serializer.noop<WebviewResponse>()
159
- .field('id', Identifier),
160
141
  permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,
161
142
  });
162
143
 
@@ -186,9 +167,9 @@ export type WebviewEventPacket = {
186
167
  export type WebviewHandle = {
187
168
  readonly id: Identifier;
188
169
  readonly url: string;
189
- getCookies(): Promise<Cookie[]>;
190
- close(): void;
170
+ getCookies(): PromiseResult<Cookie[], UserError>;
191
171
  on<T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void;
172
+ close(): Promise<void>;
192
173
  join(): Promise<void>;
193
174
  };
194
175
 
@@ -462,38 +443,46 @@ export class DashboardExtension {
462
443
  throw new Error('Dashboard already set');
463
444
  }
464
445
  this.dashboard = dashboard;
465
- this.omu.endpoints.bind(DASHBOARD_COOKIES_GET, async (request, params): Promise<UserResponse<Cookie[]>> => {
466
- const { url } = request;
467
- const { hostname } = new URL(url);
446
+
447
+ const requireHost = async (params: InvokedParams, host: string): Promise<UserResponse<undefined>> => {
468
448
  const id = params.caller.key();
469
- const allowedHost: AllowedHost = await this.allowedHosts.get(id) ?? { id, hosts: [] };
470
- const allowed = allowedHost.hosts.includes(hostname);
449
+ const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };
450
+ const allowed = hostEntry.hosts.includes(host);
471
451
  if (!allowed) {
472
- return {
473
- type: 'cancelled',
474
- };
452
+ const result = await dashboard.hostRequested({
453
+ host,
454
+ }, params);
455
+ if (result.type === 'ok') {
456
+ hostEntry.hosts.push(host);
457
+ await this.allowedHosts.update(hostEntry);
458
+ } else {
459
+ return { type: 'cancelled' };
460
+ }
461
+ }
462
+ return { type: 'ok', value: undefined };
463
+ };
464
+
465
+ this.omu.endpoints.bind(DASHBOARD_COOKIES_GET, async (request, params): Promise<UserResponse<Cookie[]>> => {
466
+ const { url } = request;
467
+ const { host } = new URL(url);
468
+ const hostAccessResult = await requireHost(params, host);
469
+ if (hostAccessResult.type !== 'ok') {
470
+ return hostAccessResult;
475
471
  }
476
472
  return await dashboard.getCookies(request);
477
473
  });
478
474
  this.omu.endpoints.bind(DASHBOARD_HOST_REQUEST, async (request, params): Promise<UserResponse> => {
479
475
  const { host } = request;
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
- return {
485
- type: 'ok',
486
- value: undefined,
487
- };
488
- }
489
- const result = await dashboard.hostRequested(request, params);
490
- if (result.type === 'ok') {
491
- hostEntry.hosts.push(host);
492
- await this.allowedHosts.update(hostEntry);
493
- }
476
+ const result = await requireHost(params, host);
494
477
  return result;
495
478
  });
496
479
  this.omu.endpoints.bind(DASHBOARD_WEBVIEW_REQUEST, async (request, params): Promise<WebviewResponse> => {
480
+ const url = new URL(request.url);
481
+ const { host } = url;
482
+ const hostAccessResult = await requireHost(params, host);
483
+ if (hostAccessResult.type !== 'ok') {
484
+ return hostAccessResult;
485
+ }
497
486
  const emit = async (event: WebviewEvent) => {
498
487
  this.omu.send(DASHBOARD_WEBVIEW_EVENT_PACKET, {
499
488
  id,
@@ -504,8 +493,9 @@ export class DashboardExtension {
504
493
  const id = await dashboard.createWebview(request, params, emit);
505
494
  return {
506
495
  type: 'ok',
507
- id,
508
- value: undefined,
496
+ value: {
497
+ id: id.key(),
498
+ },
509
499
  };
510
500
  });
511
501
  this.omu.endpoints.bind(DASHBOARD_WEBVIEW_CLOSE, async (request, params): Promise<WebviewResponse> => {
@@ -513,14 +503,14 @@ export class DashboardExtension {
513
503
  if (!id) {
514
504
  return {
515
505
  type: 'cancelled',
516
- id: request.id,
517
506
  };
518
507
  }
519
508
  await dashboard.closeWebview(request, params);
520
509
  return {
521
510
  type: 'ok',
522
- id,
523
- value: undefined,
511
+ value: {
512
+ id: id.key(),
513
+ },
524
514
  };
525
515
  });
526
516
  this.omu.endpoints.bind(DASHBOARD_SPEECH_RECOGNITION_START, async (request, params): Promise<UserResponse<undefined>> => {
@@ -538,70 +528,74 @@ export class DashboardExtension {
538
528
  });
539
529
  }
540
530
 
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(
531
+ public requestWebview(options: WebviewRequest): PromiseResult<WebviewHandle, UserError> {
532
+ const { promise, resolve, reject } = PromiseResult.create<WebviewHandle, UserError>();
533
+ this.omu.endpoints.call(
550
534
  DASHBOARD_WEBVIEW_REQUEST,
551
535
  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({
536
+ ).then((result) => {
537
+ if (result.type !== 'ok') {
538
+ reject(result);
539
+ return;
540
+ }
541
+ const { value } = result;
542
+ const id = Identifier.fromKey(value.id);
543
+ const eventListeners: WebviewEventListeners = {};
544
+ const handle: WebviewHandle = {
545
+ id,
546
+ url: options.url,
547
+ close: async () => {
548
+ await this.omu.endpoints.call(
549
+ DASHBOARD_WEBVIEW_CLOSE,
550
+ { id: id.key() },
551
+ );
552
+ },
553
+ getCookies: () => this.getCookies({
567
554
  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,
555
+ }),
556
+ on: function <T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void {
557
+ if (!eventListeners[key]) {
558
+ eventListeners[key] = [];
559
+ }
560
+ const listeners = eventListeners[key]!;
561
+ listeners.push(callback);
562
+ },
563
+ join: async () => {
564
+ await new Promise<void>((resolve) => {
565
+ handle.on('closed', () => resolve());
566
+ });
567
+ },
568
+ };
569
+ this.webviewHandles.set(id, {
570
+ handle,
571
+ emit: function <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>): void {
572
+ const listeners = eventListeners[event.type];
573
+ if (!listeners) return;
574
+ for (const listener of listeners) {
575
+ listener(event);
576
+ }
577
+ },
578
+ });
579
+
580
+ resolve(handle);
597
581
  });
582
+ return promise;
598
583
  }
599
584
 
600
- public async getCookies(options: GetCookiesRequest): Promise<UserResult<Cookie[]>> {
601
- return new UserResult(await this.omu.endpoints.call(
585
+ public getCookies(options: GetCookiesRequest): PromiseResult<Cookie[], UserError> {
586
+ const { promise, resolve, reject } = PromiseResult.create<Cookie[], UserError>();
587
+ this.omu.endpoints.call(
602
588
  DASHBOARD_COOKIES_GET,
603
589
  options,
604
- ));
590
+ ).then((response) => {
591
+ if (response.type === 'ok') {
592
+ resolve(response.value);
593
+ return;
594
+ } else {
595
+ reject(response);
596
+ }
597
+ });
598
+ return promise;
605
599
  }
606
600
 
607
601
  public async openApp(app: App): Promise<void> {
@@ -616,7 +610,7 @@ export class DashboardExtension {
616
610
  return await this.omu.endpoints.call(DASHBOARD_PROMPT_CLEAR_BLOCKED, null);
617
611
  }
618
612
 
619
- public async requireDragDrop(): Promise<DragDropHandler> {
613
+ public async requestDragDrop(): Promise<DragDropHandler> {
620
614
  await this.omu.endpoints.call(DASHBOARD_DRAG_DROP_REQUEST_ENDPOINT, {});
621
615
  const listeners = this.dragDropListeners;
622
616
  const client = this.omu;
@@ -634,7 +628,15 @@ export class DashboardExtension {
634
628
  this.omu.send(DASHBOARD_DRAG_DROP_STATE_PACKET, packet);
635
629
  }
636
630
 
637
- public async speechRecognitionStart(): Promise<void> {
638
- await this.omu.endpoints.call(DASHBOARD_SPEECH_RECOGNITION_START, { type: 'start' });
631
+ public requestSpeechRecognition(): PromiseResult<Registry<TranscriptStatus>, UserError> {
632
+ const { promise, resolve, reject } = PromiseResult.create<Registry<TranscriptStatus>, UserError>();
633
+ this.omu.endpoints.call(DASHBOARD_SPEECH_RECOGNITION_START, { type: 'start' }).then((result) => {
634
+ if (result.type === 'ok') {
635
+ resolve(this.speechRecognition);
636
+ } else {
637
+ reject(result);
638
+ }
639
+ });
640
+ return promise;
639
641
  }
640
642
  }
@@ -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
 
@@ -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>;
@@ -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
  }
@@ -187,7 +189,7 @@ export class SessionExtension implements Extension {
187
189
  public async generateToken(options: {
188
190
  app: App;
189
191
  permissions?: IntoId[];
190
- }): Promise<string> {
192
+ }): Promise<SessionParam> {
191
193
  const result = await this.omu.endpoints.call(GENERATE_TOKEN_ENDPOINT_TYPE, {
192
194
  app: App.serialize(options.app),
193
195
  permissions: options.permissions?.map(id => Identifier.from(id).key()),
@@ -195,6 +197,9 @@ export class SessionExtension implements Extension {
195
197
  if (result.type === 'error') {
196
198
  throw new Error(result.message);
197
199
  }
198
- return result.token;
200
+ return {
201
+ token: result.token,
202
+ address: this.omu.address,
203
+ };
199
204
  }
200
205
  }
package/src/index.ts CHANGED
@@ -6,7 +6,7 @@ export * as network from './network';
6
6
  export { Omu } from './omu.js';
7
7
  export { Serializer } from './serialize';
8
8
  export type { Serializable } from './serialize';
9
- export { BrowserTokenProvider, type SessionParam, type TokenProvider } from './token';
9
+ export { BrowserSession, type SessionParam, type SessioTokenProvider as TokenProvider } from './token';
10
10
  import { ASSET_PERMISSION_ID } from './api/asset';
11
11
  import {
12
12
  DASHBOARD_APP_INSTALL_PERMISSION_ID,