@omujs/omu 0.10.7 → 0.10.9

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 (52) hide show
  1. package/README.md +30 -0
  2. package/dist/api/asset/extension.js +1 -1
  3. package/dist/api/asset/extension.js.map +2 -2
  4. package/dist/api/dashboard/webview.js +1 -1
  5. package/dist/api/dashboard/webview.js.map +2 -2
  6. package/dist/api/endpoint/extension.d.ts +9 -1
  7. package/dist/api/endpoint/extension.js +1 -1
  8. package/dist/api/endpoint/extension.js.map +3 -3
  9. package/dist/api/endpoint/index.d.ts +1 -0
  10. package/dist/api/endpoint/index.js.map +1 -1
  11. package/dist/api/http/extension.js +1 -1
  12. package/dist/api/http/extension.js.map +2 -2
  13. package/dist/api/http/websocket.js +1 -1
  14. package/dist/api/http/websocket.js.map +2 -2
  15. package/dist/api/logger/extension.js +1 -1
  16. package/dist/api/logger/extension.js.map +3 -3
  17. package/dist/api/registry/extension.js +1 -1
  18. package/dist/api/registry/extension.js.map +3 -3
  19. package/dist/api/server/extension.js +1 -1
  20. package/dist/api/server/extension.js.map +2 -2
  21. package/dist/api/signal/extension.js +1 -1
  22. package/dist/api/signal/extension.js.map +3 -3
  23. package/dist/api/signal/signal.d.ts +2 -1
  24. package/dist/api/signal/signal.js +1 -1
  25. package/dist/api/signal/signal.js.map +1 -1
  26. package/dist/api/table/extension.js +1 -1
  27. package/dist/api/table/extension.js.map +3 -3
  28. package/dist/api/table/index.d.ts +1 -1
  29. package/dist/api/table/index.js +1 -1
  30. package/dist/api/table/index.js.map +2 -2
  31. package/dist/api/table/table.d.ts +8 -7
  32. package/dist/api/table/table.js +1 -1
  33. package/dist/api/table/table.js.map +2 -2
  34. package/dist/event/index.d.ts +7 -0
  35. package/dist/event/index.js +1 -1
  36. package/dist/event/index.js.map +3 -3
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.js +1 -1
  39. package/dist/index.js.map +2 -2
  40. package/dist/network/network.d.ts +11 -9
  41. package/dist/network/network.js +1 -1
  42. package/dist/network/network.js.map +3 -3
  43. package/dist/omu.d.ts +11 -9
  44. package/dist/omu.js +1 -1
  45. package/dist/omu.js.map +3 -3
  46. package/dist/token.d.ts +4 -2
  47. package/dist/token.js +1 -1
  48. package/dist/token.js.map +2 -2
  49. package/dist/version.d.ts +1 -1
  50. package/dist/version.js +1 -1
  51. package/dist/version.js.map +1 -1
  52. package/package.json +2 -2
@@ -1,2 +1,2 @@
1
- import{Identifier as a}from"../../identifier";import{Serializer as s}from"../../serialize";class o{constructor(e,i,r,t){this.id=e;this.serializer=i;this.keyFunction=r;this.permissions=t}static createJson(e,{name:i,key:r,permissions:t,serializer:n}){return new o(a.from(e).join(i),s.pipe(n??s.noop(),s.json()),r,t)}static createSerialized(e,{name:i,key:r,permissions:t,serializer:n}){return new o(a.from(e).join(i),n,r,t)}}export{o as TableType};
1
+ import{Identifier as a}from"../../identifier";import{Serializer as t}from"../../serialize";class o{constructor(e,i,r,s){this.id=e;this.serializer=i;this.keyFunction=r;this.permissions=s}static createJson(e,{name:i,key:r,permissions:s,serializer:n}){return new o(a.from(e).join(i),t.pipe(n??t.noop(),t.json()),r,s)}static createSerialized(e,{name:i,key:r,permissions:s,serializer:n}){return new o(a.from(e).join(i),n,r,s)}}export{o as TableType};
2
2
  //# sourceMappingURL=table.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/table/table.ts"],
4
- "sourcesContent": ["import type { EventEmitter, Unlisten } from '../../event';\nimport { Identifier, IntoId } from '../../identifier';\nimport type { JsonType, Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\n\nexport type TableConfig = {\n cache_size: number;\n};\n\nexport interface Table<T> {\n type: TableType<T>;\n readonly cache: ReadonlyMap<string, T>;\n readonly event: TableEvents<T>;\n get(key: string): Promise<T | undefined>;\n getMany(...keys: string[]): Promise<Map<string, T>>;\n add(...item: T[]): Promise<void>;\n update(...item: T[]): Promise<void>;\n remove(...items: T[]): Promise<void>;\n clear(): Promise<void>;\n has(key: string): Promise<boolean>;\n hasMany<T extends Record<string, unknown>>(...keys: (keyof T)[]): Promise<{ [key in keyof T]: boolean }>;\n hasAll(...keys: string[]): Promise<boolean>;\n hasAny(...keys: string[]): Promise<boolean>;\n\n fetchItems({\n limit,\n backward,\n cursor,\n }: {\n limit: number;\n backward?: boolean;\n cursor?: string;\n }): Promise<Map<string, T>>;\n fetchRange({ start, end }: { start: string; end: string }): Promise<Map<string, T>>;\n fetchAll(): Promise<Map<string, T>>;\n iterate({ backward, cursor }: { backward?: boolean; cursor?: string }): AsyncIterable<T>;\n size(): Promise<number>;\n\n proxy(proxy: (item: T) => T | undefined): Unlisten;\n setCacheSize(size: number): void;\n setConfig(config: TableConfig): void;\n setPermissions(permissions: TablePermissions): void;\n\n listen(listener?: (items: Map<string, T>) => void): Unlisten;\n}\n\nexport type TableEvents<T> = {\n add: EventEmitter<[Map<string, T>]>;\n update: EventEmitter<[Map<string, T>]>;\n remove: EventEmitter<[Map<string, T>]>;\n clear: EventEmitter<[]>;\n cacheUpdate: EventEmitter<[Map<string, T>]>;\n};\n\nexport type TablePermissions = {\n all?: Identifier;\n read?: Identifier;\n write?: Identifier;\n remove?: Identifier;\n proxy?: Identifier;\n};\n\nexport class TableType<T> {\n constructor(\n public id: Identifier,\n public serializer: Serializable<T, Uint8Array>,\n public keyFunction: (item: T) => string,\n public permissions?: TablePermissions | undefined,\n ) {}\n\n public static createJson<T, D extends JsonType = JsonType>(\n identifier: IntoId,\n {\n name,\n key,\n permissions,\n serializer,\n }: {\n name: string;\n key: (item: T) => string;\n permissions?: TablePermissions;\n serializer?: Serializable<T, D>;\n },\n ): TableType<T> {\n return new TableType<T>(\n Identifier.from(identifier).join(name),\n Serializer.pipe<T, D, Uint8Array>(serializer ?? Serializer.noop(), Serializer.json()),\n key,\n permissions,\n );\n }\n\n public static createSerialized<T>(\n identifier: IntoId,\n {\n name,\n key,\n permissions,\n serializer,\n }: {\n name: string;\n key: (item: T) => string;\n permissions?: TablePermissions;\n serializer: Serializable<T, Uint8Array>;\n },\n ): TableType<T> {\n return new TableType<T>(\n Identifier.from(identifier).join(name),\n serializer,\n key,\n permissions,\n );\n }\n}\n"],
5
- "mappings": "AACA,OAAS,cAAAA,MAA0B,mBAEnC,OAAS,cAAAC,MAAkB,kBA2DpB,MAAMC,CAAa,CACtB,YACWC,EACAC,EACAC,EACAC,EACT,CAJS,QAAAH,EACA,gBAAAC,EACA,iBAAAC,EACA,iBAAAC,CACR,CAEH,OAAc,WACVC,EACA,CACI,KAAAC,EACA,IAAAC,EACA,YAAAH,EACA,WAAAF,CACJ,EAMY,CACZ,OAAO,IAAIF,EACPF,EAAW,KAAKO,CAAU,EAAE,KAAKC,CAAI,EACrCP,EAAW,KAAuBG,GAAcH,EAAW,KAAK,EAAGA,EAAW,KAAK,CAAC,EACpFQ,EACAH,CACJ,CACJ,CAEA,OAAc,iBACVC,EACA,CACI,KAAAC,EACA,IAAAC,EACA,YAAAH,EACA,WAAAF,CACJ,EAMY,CACZ,OAAO,IAAIF,EACPF,EAAW,KAAKO,CAAU,EAAE,KAAKC,CAAI,EACrCJ,EACAK,EACAH,CACJ,CACJ,CACJ",
4
+ "sourcesContent": ["import type { Unlisten } from '../../event';\nimport { Identifier, IntoId } from '../../identifier';\nimport type { JsonType, Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\n\nexport type TableConfig = {\n cache_size: number;\n};\n\nexport interface Table<T> {\n type: TableType<T>;\n readonly cache: ReadonlyMap<string, T>;\n on<K extends keyof TableEvents<T>>(event: K, listener: (...args: TableEvents<T>[K]) => void): Unlisten;\n off<K extends keyof TableEvents<T>>(event: K, listener: (...args: TableEvents<T>[K]) => void): void;\n get(key: string): Promise<T | undefined>;\n getMany(...keys: string[]): Promise<Map<string, T>>;\n add(...item: T[]): Promise<void>;\n update(...item: T[]): Promise<void>;\n remove(...items: T[]): Promise<void>;\n clear(): Promise<void>;\n has(key: string): Promise<boolean>;\n hasMany<T extends Record<string, unknown>>(...keys: (keyof T)[]): Promise<{ [key in keyof T]: boolean }>;\n hasAll(...keys: string[]): Promise<boolean>;\n hasAny(...keys: string[]): Promise<boolean>;\n\n fetchItems({\n limit,\n backward,\n cursor,\n }: {\n limit: number;\n backward?: boolean;\n cursor?: string;\n }): Promise<Map<string, T>>;\n fetchRange({ start, end }: { start: string; end: string }): Promise<Map<string, T>>;\n fetchAll(): Promise<Map<string, T>>;\n iterate({ backward, cursor }: { backward?: boolean; cursor?: string }): AsyncIterable<T>;\n size(): Promise<number>;\n\n proxy(proxy: (item: T) => T | undefined): Unlisten;\n setCacheSize(size: number): void;\n setConfig(config: TableConfig): void;\n setPermissions(permissions: TablePermissions): void;\n\n listen(listener?: (items: Map<string, T>) => void): Unlisten;\n}\n\nexport type TableEvents<T> = {\n add: [Map<string, T>];\n update: [Map<string, T>];\n remove: [Map<string, T>];\n clear: [];\n cache: [Map<string, T>];\n};\n\nexport type TablePermissions = {\n all?: Identifier;\n read?: Identifier;\n write?: Identifier;\n remove?: Identifier;\n proxy?: Identifier;\n};\n\nexport class TableType<T> {\n constructor(\n public id: Identifier,\n public serializer: Serializable<T, Uint8Array>,\n public keyFunction: (item: T) => string,\n public permissions?: TablePermissions | undefined,\n ) {}\n\n public static createJson<T, D extends JsonType = JsonType>(\n identifier: IntoId,\n {\n name,\n key,\n permissions,\n serializer,\n }: {\n name: string;\n key: (item: T) => string;\n permissions?: TablePermissions;\n serializer?: Serializable<T, D>;\n },\n ): TableType<T> {\n return new TableType<T>(\n Identifier.from(identifier).join(name),\n Serializer.pipe<T, D, Uint8Array>(serializer ?? Serializer.noop(), Serializer.json()),\n key,\n permissions,\n );\n }\n\n public static createSerialized<T>(\n identifier: IntoId,\n {\n name,\n key,\n permissions,\n serializer,\n }: {\n name: string;\n key: (item: T) => string;\n permissions?: TablePermissions;\n serializer: Serializable<T, Uint8Array>;\n },\n ): TableType<T> {\n return new TableType<T>(\n Identifier.from(identifier).join(name),\n serializer,\n key,\n permissions,\n );\n }\n}\n"],
5
+ "mappings": "AACA,OAAS,cAAAA,MAA0B,mBAEnC,OAAS,cAAAC,MAAkB,kBA4DpB,MAAMC,CAAa,CACtB,YACWC,EACAC,EACAC,EACAC,EACT,CAJS,QAAAH,EACA,gBAAAC,EACA,iBAAAC,EACA,iBAAAC,CACR,CAEH,OAAc,WACVC,EACA,CACI,KAAAC,EACA,IAAAC,EACA,YAAAH,EACA,WAAAF,CACJ,EAMY,CACZ,OAAO,IAAIF,EACPF,EAAW,KAAKO,CAAU,EAAE,KAAKC,CAAI,EACrCP,EAAW,KAAuBG,GAAcH,EAAW,KAAK,EAAGA,EAAW,KAAK,CAAC,EACpFQ,EACAH,CACJ,CACJ,CAEA,OAAc,iBACVC,EACA,CACI,KAAAC,EACA,IAAAC,EACA,YAAAH,EACA,WAAAF,CACJ,EAMY,CACZ,OAAO,IAAIF,EACPF,EAAW,KAAKO,CAAU,EAAE,KAAKC,CAAI,EACrCJ,EACAK,EACAH,CACJ,CACJ,CACJ",
6
6
  "names": ["Identifier", "Serializer", "TableType", "id", "serializer", "keyFunction", "permissions", "identifier", "name", "key"]
7
7
  }
@@ -2,5 +2,12 @@ export type Unlisten = () => void;
2
2
  export declare class EventEmitter<P extends Array<any>> {
3
3
  private readonly listeners;
4
4
  listen(listener: (...args: P) => any): Unlisten;
5
+ off(listener: (...args: P) => Promise<void> | void): void;
5
6
  emit(...args: P): Promise<void>;
6
7
  }
8
+ export declare class EventHub<Events extends Record<string, Array<any>>> {
9
+ private readonly listeners;
10
+ on<K extends keyof Events>(event: K, listener: (...args: Events[K]) => Promise<void> | void): Unlisten;
11
+ off<K extends keyof Events>(event: K, listener: (...args: Events[K]) => Promise<void> | void): void;
12
+ emit<K extends keyof Events>(event: K, ...args: Events[K]): Promise<void>;
13
+ }
@@ -1,2 +1,2 @@
1
- class t{listeners=[];listen(e){return this.listeners.push(e),()=>{this.listeners.splice(this.listeners.indexOf(e),1)}}async emit(...e){for(const s of[...this.listeners])await s(...e)}}export{t as EventEmitter};
1
+ class n{listeners=[];listen(e){return this.listeners.push(e),()=>this.off(e)}off(e){const s=this.listeners.indexOf(e);s!==-1&&this.listeners.splice(s,1)}async emit(...e){for(const s of[...this.listeners])await s(...e)}}class r{listeners=new Map;on(e,s){return this.listeners.has(e)||this.listeners.set(e,new n),this.listeners.get(e).listen(s)}off(e,s){const t=this.listeners.get(e);t&&t.off(s)}async emit(e,...s){const t=this.listeners.get(e);t&&await t.emit(...s)}}export{n as EventEmitter,r as EventHub};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/event/index.ts"],
4
- "sourcesContent": ["export type Unlisten = () => void;\n\nexport class EventEmitter<P extends Array<any>> {\n private readonly listeners: Array<(...args: P) => Promise<void> | void> = [];\n\n public listen(listener: (...args: P) => any): Unlisten {\n this.listeners.push(listener);\n return () => {\n this.listeners.splice(this.listeners.indexOf(listener), 1);\n };\n }\n\n public async emit(...args: P): Promise<void> {\n for (const listener of [...this.listeners]) {\n await listener(...args);\n }\n }\n}\n"],
5
- "mappings": "AAEO,MAAMA,CAAmC,CAC3B,UAAyD,CAAC,EAEpE,OAAOC,EAAyC,CACnD,YAAK,UAAU,KAAKA,CAAQ,EACrB,IAAM,CACT,KAAK,UAAU,OAAO,KAAK,UAAU,QAAQA,CAAQ,EAAG,CAAC,CAC7D,CACJ,CAEA,MAAa,QAAQC,EAAwB,CACzC,UAAWD,IAAY,CAAC,GAAG,KAAK,SAAS,EACrC,MAAMA,EAAS,GAAGC,CAAI,CAE9B,CACJ",
6
- "names": ["EventEmitter", "listener", "args"]
4
+ "sourcesContent": ["export type Unlisten = () => void;\n\nexport class EventEmitter<P extends Array<any>> {\n private readonly listeners: Array<(...args: P) => Promise<void> | void> = [];\n\n public listen(listener: (...args: P) => any): Unlisten {\n this.listeners.push(listener);\n return () => this.off(listener);\n }\n\n public off(listener: (...args: P) => Promise<void> | void): void {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n }\n\n public async emit(...args: P): Promise<void> {\n for (const listener of [...this.listeners]) {\n await listener(...args);\n }\n }\n}\n\nexport class EventHub<Events extends Record<string, Array<any>>> {\n private readonly listeners: Map<keyof Events, EventEmitter<any>> = new Map();\n\n public on<K extends keyof Events>(event: K, listener: (...args: Events[K]) => Promise<void> | void): Unlisten {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new EventEmitter());\n }\n const emitter = this.listeners.get(event) as EventEmitter<Events[K]>;\n return emitter.listen(listener);\n }\n\n public off<K extends keyof Events>(event: K, listener: (...args: Events[K]) => Promise<void> | void): void {\n const emitter = this.listeners.get(event);\n if (emitter) {\n emitter.off(listener);\n }\n }\n\n public async emit<K extends keyof Events>(event: K, ...args: Events[K]): Promise<void> {\n const emitter = this.listeners.get(event);\n if (emitter) {\n await emitter.emit(...args);\n }\n }\n}\n"],
5
+ "mappings": "AAEO,MAAMA,CAAmC,CAC3B,UAAyD,CAAC,EAEpE,OAAOC,EAAyC,CACnD,YAAK,UAAU,KAAKA,CAAQ,EACrB,IAAM,KAAK,IAAIA,CAAQ,CAClC,CAEO,IAAIA,EAAsD,CAC7D,MAAMC,EAAQ,KAAK,UAAU,QAAQD,CAAQ,EACzCC,IAAU,IACV,KAAK,UAAU,OAAOA,EAAO,CAAC,CAEtC,CAEA,MAAa,QAAQC,EAAwB,CACzC,UAAWF,IAAY,CAAC,GAAG,KAAK,SAAS,EACrC,MAAMA,EAAS,GAAGE,CAAI,CAE9B,CACJ,CAEO,MAAMC,CAAoD,CAC5C,UAAkD,IAAI,IAEhE,GAA2BC,EAAUJ,EAAkE,CAC1G,OAAK,KAAK,UAAU,IAAII,CAAK,GACzB,KAAK,UAAU,IAAIA,EAAO,IAAIL,CAAc,EAEhC,KAAK,UAAU,IAAIK,CAAK,EACzB,OAAOJ,CAAQ,CAClC,CAEO,IAA4BI,EAAUJ,EAA8D,CACvG,MAAMK,EAAU,KAAK,UAAU,IAAID,CAAK,EACpCC,GACAA,EAAQ,IAAIL,CAAQ,CAE5B,CAEA,MAAa,KAA6BI,KAAaF,EAAgC,CACnF,MAAMG,EAAU,KAAK,UAAU,IAAID,CAAK,EACpCC,GACA,MAAMA,EAAQ,KAAK,GAAGH,CAAI,CAElC,CACJ",
6
+ "names": ["EventEmitter", "listener", "index", "args", "EventHub", "event", "emitter"]
7
7
  }
package/dist/index.d.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 { BrowserSession, type SessionParam, type SessioTokenProvider } from './token';
9
+ export { BrowserSession, type SessionParam, type SessionTokenProvider, type SessioTokenProvider, } from './token';
10
10
  import { Identifier } from './identifier';
11
11
  export declare const OmuPermissions: {
12
12
  readonly ASSET_PERMISSION_ID: Identifier;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{AppIndexRegistry as k}from"./api/server";import{App as w}from"./app.js";import{DisconnectReason as b}from"./errors.js";import{Identifier as J,IdentifierMap as h,IdentifierSet as j}from"./identifier";import*as q from"./network";import{Omu as X}from"./omu.js";import{Serializer as $}from"./serialize";import{BrowserSession as SI}from"./token";import{ASSET_PERMISSION_ID as I}from"./api/asset";import{DASHBOARD_APP_INSTALL_PERMISSION_ID as S,DASHBOARD_DRAG_DROP_PERMISSION_ID as _,DASHBOARD_OPEN_APP_PERMISSION_ID as E,DASHBOARD_SET_PERMISSION_ID as e,DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID as R,DASHBOARD_WEBVIEW_PERMISSION_ID as r}from"./api/dashboard";import{DASHBOARD_APP_CLOSE_PERMISSION_ID as D,DASHBOARD_APP_STARTUP_PERMISSION_ID as O}from"./api/dashboard/apps";import{HTTP_REQUEST_PERMISSION_ID as P}from"./api/http";import{I18N_GET_LOCALES_PERMISSION_ID as i,I18N_SET_LOCALES_PERMISSION_ID as A}from"./api/i18n";import{LOGGER_LOG_PERMISSION_ID as o}from"./api/logger";import{PLUGIN_MANAGE_PACKAGE_PERMISSION_ID as N,PLUGIN_READ_PACKAGE_PERMISSION_ID as t}from"./api/plugin";import{REGISTRY_PERMISSION_ID as n}from"./api/registry";import{SERVER_APPS_READ_PERMISSION_ID as d,SERVER_SHUTDOWN_PERMISSION_ID as M,TRUSTED_ORIGINS_GET_PERMISSION_ID as f,TRUSTED_ORIGINS_SET_PERMISSION_ID as T}from"./api/server";import{GENERATE_TOKEN_PERMISSION_ID as a,REMOTE_APP_REQUEST_PERMISSION_ID as m,SESSIONS_READ_PERMISSION_ID as p}from"./api/session";import{TABLE_PERMISSION_ID as y}from"./api/table";const Q={ASSET_PERMISSION_ID:I,DASHBOARD_APP_INSTALL_PERMISSION_ID:S,DASHBOARD_DRAG_DROP_PERMISSION_ID:_,DASHBOARD_OPEN_APP_PERMISSION_ID:E,DASHBOARD_SET_PERMISSION_ID:e,DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID:R,DASHBOARD_WEBVIEW_PERMISSION_ID:r,DASHBOARD_APP_STARTUP_PERMISSION_ID:O,DASHBOARD_APP_CLOSE_PERMISSION_ID:D,HTTP_REQUEST_PERMISSION_ID:P,I18N_GET_LOCALES_PERMISSION_ID:i,I18N_SET_LOCALES_PERMISSION_ID:A,LOGGER_LOG_PERMISSION_ID:o,PLUGIN_MANAGE_PACKAGE_PERMISSION_ID:N,PLUGIN_READ_PACKAGE_PERMISSION_ID:t,REGISTRY_PERMISSION_ID:n,SERVER_APPS_READ_PERMISSION_ID:d,SERVER_SHUTDOWN_PERMISSION_ID:M,TRUSTED_ORIGINS_GET_PERMISSION_ID:f,TRUSTED_ORIGINS_SET_PERMISSION_ID:T,GENERATE_TOKEN_PERMISSION_ID:a,REMOTE_APP_REQUEST_PERMISSION_ID:m,SESSIONS_READ_PERMISSION_ID:p,TABLE_PERMISSION_ID:y};export{w as App,k as AppIndexRegistry,SI as BrowserSession,b as DisconnectReason,J as Identifier,h as IdentifierMap,j as IdentifierSet,X as Omu,Q as OmuPermissions,$ as Serializer,q as network};
1
+ import{AppIndexRegistry as g}from"./api/server";import{App as v}from"./app.js";import{DisconnectReason as Y}from"./errors.js";import{Identifier as J,IdentifierMap as h,IdentifierSet as j}from"./identifier";import*as q from"./network";import{Omu as X}from"./omu.js";import{Serializer as $}from"./serialize";import{BrowserSession as SI}from"./token";import{ASSET_PERMISSION_ID as I}from"./api/asset";import{DASHBOARD_APP_INSTALL_PERMISSION_ID as S,DASHBOARD_DRAG_DROP_PERMISSION_ID as _,DASHBOARD_OPEN_APP_PERMISSION_ID as E,DASHBOARD_SET_PERMISSION_ID as e,DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID as R,DASHBOARD_WEBVIEW_PERMISSION_ID as r}from"./api/dashboard";import{DASHBOARD_APP_CLOSE_PERMISSION_ID as D,DASHBOARD_APP_STARTUP_PERMISSION_ID as O}from"./api/dashboard/apps";import{HTTP_REQUEST_PERMISSION_ID as P}from"./api/http";import{I18N_GET_LOCALES_PERMISSION_ID as i,I18N_SET_LOCALES_PERMISSION_ID as o}from"./api/i18n";import{LOGGER_LOG_PERMISSION_ID as A}from"./api/logger";import{PLUGIN_MANAGE_PACKAGE_PERMISSION_ID as N,PLUGIN_READ_PACKAGE_PERMISSION_ID as n}from"./api/plugin";import{REGISTRY_PERMISSION_ID as t}from"./api/registry";import{SERVER_APPS_READ_PERMISSION_ID as d,SERVER_SHUTDOWN_PERMISSION_ID as M,TRUSTED_ORIGINS_GET_PERMISSION_ID as T,TRUSTED_ORIGINS_SET_PERMISSION_ID as f}from"./api/server";import{GENERATE_TOKEN_PERMISSION_ID as p,REMOTE_APP_REQUEST_PERMISSION_ID as a,SESSIONS_READ_PERMISSION_ID as m}from"./api/session";import{TABLE_PERMISSION_ID as y}from"./api/table";const Q={ASSET_PERMISSION_ID:I,DASHBOARD_APP_INSTALL_PERMISSION_ID:S,DASHBOARD_DRAG_DROP_PERMISSION_ID:_,DASHBOARD_OPEN_APP_PERMISSION_ID:E,DASHBOARD_SET_PERMISSION_ID:e,DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID:R,DASHBOARD_WEBVIEW_PERMISSION_ID:r,DASHBOARD_APP_STARTUP_PERMISSION_ID:O,DASHBOARD_APP_CLOSE_PERMISSION_ID:D,HTTP_REQUEST_PERMISSION_ID:P,I18N_GET_LOCALES_PERMISSION_ID:i,I18N_SET_LOCALES_PERMISSION_ID:o,LOGGER_LOG_PERMISSION_ID:A,PLUGIN_MANAGE_PACKAGE_PERMISSION_ID:N,PLUGIN_READ_PACKAGE_PERMISSION_ID:n,REGISTRY_PERMISSION_ID:t,SERVER_APPS_READ_PERMISSION_ID:d,SERVER_SHUTDOWN_PERMISSION_ID:M,TRUSTED_ORIGINS_GET_PERMISSION_ID:T,TRUSTED_ORIGINS_SET_PERMISSION_ID:f,GENERATE_TOKEN_PERMISSION_ID:p,REMOTE_APP_REQUEST_PERMISSION_ID:a,SESSIONS_READ_PERMISSION_ID:m,TABLE_PERMISSION_ID:y};export{v as App,g as AppIndexRegistry,SI as BrowserSession,Y as DisconnectReason,J as Identifier,h as IdentifierMap,j as IdentifierSet,X as Omu,Q as OmuPermissions,$ as Serializer,q as network};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["export { AppIndexRegistry, type AppIndexRegistryJSON } from './api/server';\nexport { App, type AppMetadata } from './app.js';\nexport { DisconnectReason } from './errors.js';\nexport { Identifier, IdentifierMap, IdentifierSet, type IntoId } from './identifier';\nexport * as network from './network';\nexport { Omu } from './omu.js';\nexport { Serializer } from './serialize';\nexport type { Serializable } from './serialize';\nexport { BrowserSession, type SessionParam, type SessioTokenProvider } from './token';\n\nimport { ASSET_PERMISSION_ID } from './api/asset';\nimport {\n DASHBOARD_APP_INSTALL_PERMISSION_ID,\n DASHBOARD_DRAG_DROP_PERMISSION_ID,\n DASHBOARD_OPEN_APP_PERMISSION_ID,\n DASHBOARD_SET_PERMISSION_ID,\n DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n DASHBOARD_WEBVIEW_PERMISSION_ID,\n} from './api/dashboard';\nimport { DASHBOARD_APP_CLOSE_PERMISSION_ID, DASHBOARD_APP_STARTUP_PERMISSION_ID } from './api/dashboard/apps';\nimport { HTTP_REQUEST_PERMISSION_ID } from './api/http';\nimport { I18N_GET_LOCALES_PERMISSION_ID, I18N_SET_LOCALES_PERMISSION_ID } from './api/i18n';\nimport { LOGGER_LOG_PERMISSION_ID } from './api/logger';\nimport { PLUGIN_MANAGE_PACKAGE_PERMISSION_ID, PLUGIN_READ_PACKAGE_PERMISSION_ID } from './api/plugin';\nimport { REGISTRY_PERMISSION_ID } from './api/registry';\nimport { SERVER_APPS_READ_PERMISSION_ID, SERVER_SHUTDOWN_PERMISSION_ID, TRUSTED_ORIGINS_GET_PERMISSION_ID, TRUSTED_ORIGINS_SET_PERMISSION_ID } from './api/server';\nimport { GENERATE_TOKEN_PERMISSION_ID, REMOTE_APP_REQUEST_PERMISSION_ID, SESSIONS_READ_PERMISSION_ID } from './api/session';\nimport { TABLE_PERMISSION_ID } from './api/table';\nimport { Identifier } from './identifier';\n\nexport const OmuPermissions: {\n // Asset API\n readonly ASSET_PERMISSION_ID: Identifier;\n // Dashboard API\n readonly DASHBOARD_APP_INSTALL_PERMISSION_ID: Identifier; readonly DASHBOARD_DRAG_DROP_PERMISSION_ID: Identifier; readonly DASHBOARD_OPEN_APP_PERMISSION_ID: Identifier; readonly DASHBOARD_SET_PERMISSION_ID: Identifier; readonly DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID: Identifier; readonly DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier;\n readonly DASHBOARD_APP_STARTUP_PERMISSION_ID: Identifier;\n readonly DASHBOARD_APP_CLOSE_PERMISSION_ID: Identifier;\n // HTTP API\n readonly HTTP_REQUEST_PERMISSION_ID: Identifier;\n // I18n API\n readonly I18N_GET_LOCALES_PERMISSION_ID: Identifier; readonly I18N_SET_LOCALES_PERMISSION_ID: Identifier;\n // Logger API\n readonly LOGGER_LOG_PERMISSION_ID: Identifier;\n // Plugin API\n readonly PLUGIN_MANAGE_PACKAGE_PERMISSION_ID: Identifier; readonly PLUGIN_READ_PACKAGE_PERMISSION_ID: Identifier;\n // Registry API\n readonly REGISTRY_PERMISSION_ID: Identifier;\n // Server API\n readonly SERVER_APPS_READ_PERMISSION_ID: Identifier; readonly SERVER_SHUTDOWN_PERMISSION_ID: Identifier; readonly TRUSTED_ORIGINS_GET_PERMISSION_ID: Identifier; readonly TRUSTED_ORIGINS_SET_PERMISSION_ID: Identifier;\n // Session API\n readonly GENERATE_TOKEN_PERMISSION_ID: Identifier; readonly REMOTE_APP_REQUEST_PERMISSION_ID: Identifier; readonly SESSIONS_READ_PERMISSION_ID: Identifier;\n // Table API\n readonly TABLE_PERMISSION_ID: Identifier;\n} = {\n // Asset API\n ASSET_PERMISSION_ID,\n // Dashboard API\n DASHBOARD_APP_INSTALL_PERMISSION_ID,\n DASHBOARD_DRAG_DROP_PERMISSION_ID,\n DASHBOARD_OPEN_APP_PERMISSION_ID,\n DASHBOARD_SET_PERMISSION_ID,\n DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n DASHBOARD_WEBVIEW_PERMISSION_ID,\n DASHBOARD_APP_STARTUP_PERMISSION_ID,\n DASHBOARD_APP_CLOSE_PERMISSION_ID,\n // HTTP API\n HTTP_REQUEST_PERMISSION_ID,\n // I18n API\n I18N_GET_LOCALES_PERMISSION_ID,\n I18N_SET_LOCALES_PERMISSION_ID,\n // Logger API\n LOGGER_LOG_PERMISSION_ID,\n // Plugin API\n PLUGIN_MANAGE_PACKAGE_PERMISSION_ID,\n PLUGIN_READ_PACKAGE_PERMISSION_ID,\n // Registry API\n REGISTRY_PERMISSION_ID,\n // Server API\n SERVER_APPS_READ_PERMISSION_ID,\n SERVER_SHUTDOWN_PERMISSION_ID,\n TRUSTED_ORIGINS_GET_PERMISSION_ID,\n TRUSTED_ORIGINS_SET_PERMISSION_ID,\n // Session API\n GENERATE_TOKEN_PERMISSION_ID,\n REMOTE_APP_REQUEST_PERMISSION_ID,\n SESSIONS_READ_PERMISSION_ID,\n // Table API\n TABLE_PERMISSION_ID,\n} as const;\n"],
5
- "mappings": "AAAA,OAAS,oBAAAA,MAAmD,eAC5D,OAAS,OAAAC,MAA6B,WACtC,OAAS,oBAAAC,MAAwB,cACjC,OAAS,cAAAC,EAAY,iBAAAC,EAAe,iBAAAC,MAAkC,eACtE,UAAYC,MAAa,YACzB,OAAS,OAAAC,MAAW,WACpB,OAAS,cAAAC,MAAkB,cAE3B,OAAS,kBAAAC,OAAmE,UAE5E,OAAS,uBAAAC,MAA2B,cACpC,OACI,uCAAAC,EACA,qCAAAC,EACA,oCAAAC,EACA,+BAAAC,EACA,8CAAAC,EACA,mCAAAC,MACG,kBACP,OAAS,qCAAAC,EAAmC,uCAAAC,MAA2C,uBACvF,OAAS,8BAAAC,MAAkC,aAC3C,OAAS,kCAAAC,EAAgC,kCAAAC,MAAsC,aAC/E,OAAS,4BAAAC,MAAgC,eACzC,OAAS,uCAAAC,EAAqC,qCAAAC,MAAyC,eACvF,OAAS,0BAAAC,MAA8B,iBACvC,OAAS,kCAAAC,EAAgC,iCAAAC,EAA+B,qCAAAC,EAAmC,qCAAAC,MAAyC,eACpJ,OAAS,gCAAAC,EAA8B,oCAAAC,EAAkC,+BAAAC,MAAmC,gBAC5G,OAAS,uBAAAC,MAA2B,cAG7B,MAAMC,EAuBT,CAEA,oBAAAxB,EAEA,oCAAAC,EACA,kCAAAC,EACA,iCAAAC,EACA,4BAAAC,EACA,2CAAAC,EACA,gCAAAC,EACA,oCAAAE,EACA,kCAAAD,EAEA,2BAAAE,EAEA,+BAAAC,EACA,+BAAAC,EAEA,yBAAAC,EAEA,oCAAAC,EACA,kCAAAC,EAEA,uBAAAC,EAEA,+BAAAC,EACA,8BAAAC,EACA,kCAAAC,EACA,kCAAAC,EAEA,6BAAAC,EACA,iCAAAC,EACA,4BAAAC,EAEA,oBAAAC,CACJ",
4
+ "sourcesContent": ["export { AppIndexRegistry, type AppIndexRegistryJSON } from './api/server';\nexport { App, type AppMetadata } from './app.js';\nexport { DisconnectReason } from './errors.js';\nexport { Identifier, IdentifierMap, IdentifierSet, type IntoId } from './identifier';\nexport * as network from './network';\nexport { Omu } from './omu.js';\nexport { Serializer } from './serialize';\nexport type { Serializable } from './serialize';\nexport {\n BrowserSession,\n type SessionParam,\n type SessionTokenProvider,\n type SessioTokenProvider,\n} from './token';\n\nimport { ASSET_PERMISSION_ID } from './api/asset';\nimport {\n DASHBOARD_APP_INSTALL_PERMISSION_ID,\n DASHBOARD_DRAG_DROP_PERMISSION_ID,\n DASHBOARD_OPEN_APP_PERMISSION_ID,\n DASHBOARD_SET_PERMISSION_ID,\n DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n DASHBOARD_WEBVIEW_PERMISSION_ID,\n} from './api/dashboard';\nimport { DASHBOARD_APP_CLOSE_PERMISSION_ID, DASHBOARD_APP_STARTUP_PERMISSION_ID } from './api/dashboard/apps';\nimport { HTTP_REQUEST_PERMISSION_ID } from './api/http';\nimport { I18N_GET_LOCALES_PERMISSION_ID, I18N_SET_LOCALES_PERMISSION_ID } from './api/i18n';\nimport { LOGGER_LOG_PERMISSION_ID } from './api/logger';\nimport { PLUGIN_MANAGE_PACKAGE_PERMISSION_ID, PLUGIN_READ_PACKAGE_PERMISSION_ID } from './api/plugin';\nimport { REGISTRY_PERMISSION_ID } from './api/registry';\nimport { SERVER_APPS_READ_PERMISSION_ID, SERVER_SHUTDOWN_PERMISSION_ID, TRUSTED_ORIGINS_GET_PERMISSION_ID, TRUSTED_ORIGINS_SET_PERMISSION_ID } from './api/server';\nimport { GENERATE_TOKEN_PERMISSION_ID, REMOTE_APP_REQUEST_PERMISSION_ID, SESSIONS_READ_PERMISSION_ID } from './api/session';\nimport { TABLE_PERMISSION_ID } from './api/table';\nimport { Identifier } from './identifier';\n\nexport const OmuPermissions: {\n // Asset API\n readonly ASSET_PERMISSION_ID: Identifier;\n // Dashboard API\n readonly DASHBOARD_APP_INSTALL_PERMISSION_ID: Identifier; readonly DASHBOARD_DRAG_DROP_PERMISSION_ID: Identifier; readonly DASHBOARD_OPEN_APP_PERMISSION_ID: Identifier; readonly DASHBOARD_SET_PERMISSION_ID: Identifier; readonly DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID: Identifier; readonly DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier;\n readonly DASHBOARD_APP_STARTUP_PERMISSION_ID: Identifier;\n readonly DASHBOARD_APP_CLOSE_PERMISSION_ID: Identifier;\n // HTTP API\n readonly HTTP_REQUEST_PERMISSION_ID: Identifier;\n // I18n API\n readonly I18N_GET_LOCALES_PERMISSION_ID: Identifier; readonly I18N_SET_LOCALES_PERMISSION_ID: Identifier;\n // Logger API\n readonly LOGGER_LOG_PERMISSION_ID: Identifier;\n // Plugin API\n readonly PLUGIN_MANAGE_PACKAGE_PERMISSION_ID: Identifier; readonly PLUGIN_READ_PACKAGE_PERMISSION_ID: Identifier;\n // Registry API\n readonly REGISTRY_PERMISSION_ID: Identifier;\n // Server API\n readonly SERVER_APPS_READ_PERMISSION_ID: Identifier; readonly SERVER_SHUTDOWN_PERMISSION_ID: Identifier; readonly TRUSTED_ORIGINS_GET_PERMISSION_ID: Identifier; readonly TRUSTED_ORIGINS_SET_PERMISSION_ID: Identifier;\n // Session API\n readonly GENERATE_TOKEN_PERMISSION_ID: Identifier; readonly REMOTE_APP_REQUEST_PERMISSION_ID: Identifier; readonly SESSIONS_READ_PERMISSION_ID: Identifier;\n // Table API\n readonly TABLE_PERMISSION_ID: Identifier;\n} = {\n // Asset API\n ASSET_PERMISSION_ID,\n // Dashboard API\n DASHBOARD_APP_INSTALL_PERMISSION_ID,\n DASHBOARD_DRAG_DROP_PERMISSION_ID,\n DASHBOARD_OPEN_APP_PERMISSION_ID,\n DASHBOARD_SET_PERMISSION_ID,\n DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n DASHBOARD_WEBVIEW_PERMISSION_ID,\n DASHBOARD_APP_STARTUP_PERMISSION_ID,\n DASHBOARD_APP_CLOSE_PERMISSION_ID,\n // HTTP API\n HTTP_REQUEST_PERMISSION_ID,\n // I18n API\n I18N_GET_LOCALES_PERMISSION_ID,\n I18N_SET_LOCALES_PERMISSION_ID,\n // Logger API\n LOGGER_LOG_PERMISSION_ID,\n // Plugin API\n PLUGIN_MANAGE_PACKAGE_PERMISSION_ID,\n PLUGIN_READ_PACKAGE_PERMISSION_ID,\n // Registry API\n REGISTRY_PERMISSION_ID,\n // Server API\n SERVER_APPS_READ_PERMISSION_ID,\n SERVER_SHUTDOWN_PERMISSION_ID,\n TRUSTED_ORIGINS_GET_PERMISSION_ID,\n TRUSTED_ORIGINS_SET_PERMISSION_ID,\n // Session API\n GENERATE_TOKEN_PERMISSION_ID,\n REMOTE_APP_REQUEST_PERMISSION_ID,\n SESSIONS_READ_PERMISSION_ID,\n // Table API\n TABLE_PERMISSION_ID,\n} as const;\n"],
5
+ "mappings": "AAAA,OAAS,oBAAAA,MAAmD,eAC5D,OAAS,OAAAC,MAA6B,WACtC,OAAS,oBAAAC,MAAwB,cACjC,OAAS,cAAAC,EAAY,iBAAAC,EAAe,iBAAAC,MAAkC,eACtE,UAAYC,MAAa,YACzB,OAAS,OAAAC,MAAW,WACpB,OAAS,cAAAC,MAAkB,cAE3B,OACI,kBAAAC,OAIG,UAEP,OAAS,uBAAAC,MAA2B,cACpC,OACI,uCAAAC,EACA,qCAAAC,EACA,oCAAAC,EACA,+BAAAC,EACA,8CAAAC,EACA,mCAAAC,MACG,kBACP,OAAS,qCAAAC,EAAmC,uCAAAC,MAA2C,uBACvF,OAAS,8BAAAC,MAAkC,aAC3C,OAAS,kCAAAC,EAAgC,kCAAAC,MAAsC,aAC/E,OAAS,4BAAAC,MAAgC,eACzC,OAAS,uCAAAC,EAAqC,qCAAAC,MAAyC,eACvF,OAAS,0BAAAC,MAA8B,iBACvC,OAAS,kCAAAC,EAAgC,iCAAAC,EAA+B,qCAAAC,EAAmC,qCAAAC,MAAyC,eACpJ,OAAS,gCAAAC,EAA8B,oCAAAC,EAAkC,+BAAAC,MAAmC,gBAC5G,OAAS,uBAAAC,MAA2B,cAG7B,MAAMC,EAuBT,CAEA,oBAAAxB,EAEA,oCAAAC,EACA,kCAAAC,EACA,iCAAAC,EACA,4BAAAC,EACA,2CAAAC,EACA,gCAAAC,EACA,oCAAAE,EACA,kCAAAD,EAEA,2BAAAE,EAEA,+BAAAC,EACA,+BAAAC,EAEA,yBAAAC,EAEA,oCAAAC,EACA,kCAAAC,EAEA,uBAAAC,EAEA,+BAAAC,EACA,8BAAAC,EACA,kCAAAC,EACA,kCAAAC,EAEA,6BAAAC,EACA,iCAAAC,EACA,4BAAAC,EAEA,oBAAAC,CACJ",
6
6
  "names": ["AppIndexRegistry", "App", "DisconnectReason", "Identifier", "IdentifierMap", "IdentifierSet", "network", "Omu", "Serializer", "BrowserSession", "ASSET_PERMISSION_ID", "DASHBOARD_APP_INSTALL_PERMISSION_ID", "DASHBOARD_DRAG_DROP_PERMISSION_ID", "DASHBOARD_OPEN_APP_PERMISSION_ID", "DASHBOARD_SET_PERMISSION_ID", "DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID", "DASHBOARD_WEBVIEW_PERMISSION_ID", "DASHBOARD_APP_CLOSE_PERMISSION_ID", "DASHBOARD_APP_STARTUP_PERMISSION_ID", "HTTP_REQUEST_PERMISSION_ID", "I18N_GET_LOCALES_PERMISSION_ID", "I18N_SET_LOCALES_PERMISSION_ID", "LOGGER_LOG_PERMISSION_ID", "PLUGIN_MANAGE_PACKAGE_PERMISSION_ID", "PLUGIN_READ_PACKAGE_PERMISSION_ID", "REGISTRY_PERMISSION_ID", "SERVER_APPS_READ_PERMISSION_ID", "SERVER_SHUTDOWN_PERMISSION_ID", "TRUSTED_ORIGINS_GET_PERMISSION_ID", "TRUSTED_ORIGINS_SET_PERMISSION_ID", "GENERATE_TOKEN_PERMISSION_ID", "REMOTE_APP_REQUEST_PERMISSION_ID", "SESSIONS_READ_PERMISSION_ID", "TABLE_PERMISSION_ID", "OmuPermissions"]
7
7
  }
@@ -1,8 +1,7 @@
1
1
  import type { Address } from '../address.js';
2
2
  import { DisconnectReason } from '../errors.js';
3
- import { EventEmitter } from '../event';
4
3
  import { Omu } from '../omu.js';
5
- import type { SessioTokenProvider } from '../token.js';
4
+ import type { SessionTokenProvider } from '../token.js';
6
5
  import type { Connection, Transport } from './connection.js';
7
6
  import { AES } from './encryption.js';
8
7
  import type { Packet, PacketType } from './packet/packet.js';
@@ -20,6 +19,12 @@ export type NetworkStatus = StatusType<'connecting'> | StatusType<'connected'> |
20
19
  date: Date;
21
20
  cancel: () => void;
22
21
  };
22
+ type NetworkEvents = {
23
+ connected: [];
24
+ disconnected: [DisconnectReason | undefined];
25
+ packet: [Packet<unknown>];
26
+ status: [NetworkStatus];
27
+ };
23
28
  export declare class Network {
24
29
  private readonly omu;
25
30
  address: Address;
@@ -28,19 +33,16 @@ export declare class Network {
28
33
  private connection?;
29
34
  private aes?;
30
35
  status: NetworkStatus;
31
- readonly event: {
32
- connected: EventEmitter<[]>;
33
- disconnected: EventEmitter<[DisconnectReason | undefined]>;
34
- packet: EventEmitter<[Packet<unknown>]>;
35
- status: EventEmitter<[NetworkStatus]>;
36
- };
36
+ private readonly events;
37
37
  private readonly tasks;
38
38
  private readonly packetMapper;
39
39
  private readonly packetHandlers;
40
40
  private listenTask;
41
41
  reason: DisconnectReason | undefined;
42
42
  private attempt;
43
- constructor(omu: Omu, address: Address, tokenProvider: SessioTokenProvider, transport: Transport, connection?: Connection | undefined, aes?: AES | undefined);
43
+ constructor(omu: Omu, address: Address, tokenProvider: SessionTokenProvider, transport: Transport, connection?: Connection | undefined, aes?: AES | undefined);
44
+ on<K extends keyof NetworkEvents>(event: K, listener: (...args: NetworkEvents[K]) => Promise<void> | void): () => void;
45
+ off<K extends keyof NetworkEvents>(event: K, listener: (...args: NetworkEvents[K]) => Promise<void> | void): void;
44
46
  setConnection(connection: Connection): void;
45
47
  registerPacket(...packetTypes: PacketType<unknown>[]): void;
46
48
  addPacketHandler<T>(type: PacketType<T>, handler: (packet: T) => void): void;
@@ -1,2 +1,2 @@
1
- import{AnotherConnection as l,AppRemoved as m,DisconnectReason as w,InternalError as k,InvalidOrigin as E,InvalidPacket as h,InvalidToken as y,InvalidVersion as v,PermissionDenied as f,ServerRestart as T}from"../errors.js";import{EventEmitter as d}from"../event";import{IdentifierMap as P}from"../identifier";import{VERSION as R}from"../version.js";import{PacketMapper as S}from"./connection.js";import{AES as N,Decryptor as A,ENCRYPTION_AVAILABLE as C,Encryptor as D}from"./encryption.js";import{ConnectPacket as I,DisconnectType as t,PACKET_TYPES as s}from"./packet/packet-types.js";class j{constructor(e,i,n,r,a,c){this.omu=e;this.address=i;this.tokenProvider=n;this.transport=r;this.connection=a;this.aes=c;this.registerPacket(s.SERVER_META,s.CONNECT,s.DISCONNECT,s.TOKEN,s.READY,s.ENCRYPTED_PACKET),this.addPacketHandler(s.DISCONNECT,async o=>{if(o.type===t.SHUTDOWN||o.type===t.CLOSE){this.setStatus({type:"disconnected"});return}const u={[t.ANOTHER_CONNECTION]:l,[t.PERMISSION_DENIED]:f,[t.APP_REMOVED]:m,[t.INVALID_TOKEN]:y,[t.INVALID_ORIGIN]:E,[t.INVALID_VERSION]:v,[t.INTERNAL_ERROR]:k,[t.INVALID_PACKET]:h,[t.INVALID_PACKET_TYPE]:h,[t.INVALID_PACKET_DATA]:h,[t.SERVER_RESTART]:T,[t.CLOSE]:void 0,[t.SHUTDOWN]:void 0}[o.type];u&&(this.reason=new u(o.message??""))}),this.addPacketHandler(s.READY,()=>{if(this.status.type==="ready")throw new Error("Received READY packet when already ready");this.setStatus({type:"ready"}),this.attempt=0})}status={type:"disconnected"};event={connected:new d,disconnected:new d,packet:new d,status:new d};tasks=[];packetMapper=new S;packetHandlers=new P;listenTask=void 0;reason=void 0;attempt=0;setConnection(e){if(this.status.type!=="disconnected")throw new Error("Cannot change connection while connected");this.connection=e}registerPacket(...e){this.packetMapper.register(...e);for(const i of e)this.packetHandlers.set(i.id,{type:i,event:new d})}addPacketHandler(e,i){const n=this.packetHandlers.get(e.id);if(!n)throw new Error(`Packet type ${e.id.key()} not registered`);n.event.listen(i)}async scheduleReconnect(e){const i=Math.min(3e4,2e3*(Math.pow(1.5,e)-1)+2e3),n=new Date;let r=!1;const a={type:"reconnecting",attempt:e,timeout:i,date:n,cancel:()=>{r=!0}};if(await this.setStatus(a),r)return!1;const c=a.timeout-(new Date().getTime()-n.getTime());return await new Promise(o=>setTimeout(o,c)),!0}async connect(e=!0){if(!this.isState("disconnected"))throw new Error(`Cannot connect while ${this.status.type}`);if(this.listenTask)throw new Error("Cannot connect while already connecting");for(this.attempt=0;this.omu.running;){this.attempt++;try{this.aes=void 0,this.connection=await this.transport.connect(),await this.setStatus({type:"connecting"});const n=await this.connection.receive(this.packetMapper);if(!n)throw new Error("Connection closed before receiving server meta");if(!s.SERVER_META.match(n))throw new Error("First packet received was not server meta");const{data:r}=n;this.address.hash=r.hash;let a=await this.tokenProvider.get(this.address,this.omu.app);if(!a)throw new y(`No token available for app ${this.omu.app.id.key()} at ${this.address.host}:${this.address.port}:${this.address.hash}`);let c;if(this.omu.app.type==="remote"&&C&&r.encryption){const o=await A.new(),p=await D.new(r.encryption.rsa);a&&(a=await p.encryptString(a)),this.aes=await N.new(),c={kind:"v1",rsa:await o.toRequest(),aes:await this.aes.serialize(p)}}this.connection.send({type:s.CONNECT,data:new I({app:this.omu.app,protocol:{version:R},encryption:c,token:a})},this.packetMapper),this.listenTask=this.listen(),await this.setStatus({type:"connected"}),await this.event.connected.emit(),this.dispatchTasks().then(()=>{this.send({type:s.READY,data:null})}),await this.listenTask}catch(n){if(n instanceof w&&(this.reason=n),!e)throw n}finally{this.event.disconnected.emit(this.reason),this.status.type!=="disconnected"&&this.status.type!=="reconnecting"&&this.setStatus({type:"disconnected",attempt:this.attempt,reason:this.reason}),this.connection?.close(),this.connection=void 0,this.listenTask=void 0}if(this.reason&&![t.SHUTDOWN,t.SERVER_RESTART].includes(this.reason.type)||(this.reason=void 0,!e)||!await this.scheduleReconnect(this.attempt))break}await this.setStatus({type:"disconnected",reason:this.reason}),this.connection?.close(),this.connection=void 0}isState(e){return this.status.type===e}async send(e){if(!this.connection)throw new Error("No connection established");if(this.aes){const i=this.packetMapper.serialize(e);e=await this.aes.encrypt(i)}this.connection.send(e,this.packetMapper)}async listen(){for(;this.connection;){const e=await this.connection.receive(this.packetMapper);if(!e)break;await this.dispatchPacket(e)}}async dispatchPacket(e){if(s.ENCRYPTED_PACKET.match(e)){if(!this.aes)throw new Error("Received encrypted packet before encryption was established");const n=await this.aes.decrypt(e);e=this.packetMapper.deserialize(n)}await this.event.packet.emit(e);const i=this.packetHandlers.get(e.type.id);i&&await i.event.emit(e.data)}addTask(e){this.tasks.push(e)}removeTask(e){this.tasks.splice(this.tasks.indexOf(e),1)}async dispatchTasks(){for(const e of this.tasks)await e()}async setStatus(e){if(this.status===e)throw new Error(`Cannot set status to ${e} when already ${e}`);this.status=e,await this.event.status.emit(e)}close(){this.setStatus({type:"disconnected"}),this.attempt=0}}export{j as Network};
1
+ import{AnotherConnection as y,AppRemoved as l,DisconnectReason as v,InternalError as w,InvalidOrigin as k,InvalidPacket as p,InvalidToken as u,InvalidVersion as m,PermissionDenied as E,ServerRestart as f}from"../errors.js";import{EventEmitter as T,EventHub as P}from"../event";import{IdentifierMap as R}from"../identifier";import{VERSION as N}from"../version.js";import{PacketMapper as S}from"./connection.js";import{AES as A,Decryptor as C,ENCRYPTION_AVAILABLE as D,Encryptor as I}from"./encryption.js";import{ConnectPacket as b,DisconnectType as n,PACKET_TYPES as s}from"./packet/packet-types.js";class j{constructor(e,t,i,r,o,c){this.omu=e;this.address=t;this.tokenProvider=i;this.transport=r;this.connection=o;this.aes=c;this.registerPacket(s.SERVER_META,s.CONNECT,s.DISCONNECT,s.TOKEN,s.READY,s.ENCRYPTED_PACKET),this.addPacketHandler(s.DISCONNECT,async a=>{if(a.type===n.SHUTDOWN||a.type===n.CLOSE){this.setStatus({type:"disconnected"});return}const h={[n.ANOTHER_CONNECTION]:y,[n.PERMISSION_DENIED]:E,[n.APP_REMOVED]:l,[n.INVALID_TOKEN]:u,[n.INVALID_ORIGIN]:k,[n.INVALID_VERSION]:m,[n.INTERNAL_ERROR]:w,[n.INVALID_PACKET]:p,[n.INVALID_PACKET_TYPE]:p,[n.INVALID_PACKET_DATA]:p,[n.SERVER_RESTART]:f,[n.CLOSE]:void 0,[n.SHUTDOWN]:void 0}[a.type];h&&(this.reason=new h(a.message??""))}),this.addPacketHandler(s.READY,()=>{if(this.status.type==="ready")throw new Error("Received READY packet when already ready");this.setStatus({type:"ready"}),this.attempt=0})}status={type:"disconnected"};events=new P;tasks=[];packetMapper=new S;packetHandlers=new R;listenTask=void 0;reason=void 0;attempt=0;on(e,t){return this.events.on(e,t)}off(e,t){this.events.off(e,t)}setConnection(e){if(this.status.type!=="disconnected")throw new Error("Cannot change connection while connected");this.connection=e}registerPacket(...e){this.packetMapper.register(...e);for(const t of e)this.packetHandlers.set(t.id,{type:t,event:new T})}addPacketHandler(e,t){const i=this.packetHandlers.get(e.id);if(!i)throw new Error(`Packet type ${e.id.key()} not registered`);i.event.listen(t)}async scheduleReconnect(e){const t=Math.min(3e4,2e3*(Math.pow(1.5,e)-1)+2e3),i=new Date;let r=!1;const o={type:"reconnecting",attempt:e,timeout:t,date:i,cancel:()=>{r=!0}};if(await this.setStatus(o),r)return!1;const c=o.timeout-(new Date().getTime()-i.getTime());return await new Promise(a=>setTimeout(a,c)),!0}async connect(e=!0){if(!this.isState("disconnected"))throw new Error(`Cannot connect while ${this.status.type}`);if(this.listenTask)throw new Error("Cannot connect while already connecting");for(this.attempt=0;this.omu.running;){this.attempt++;try{this.aes=void 0,this.connection=await this.transport.connect(),await this.setStatus({type:"connecting"});const i=await this.connection.receive(this.packetMapper);if(!i)throw new Error("Connection closed before receiving server meta");if(!s.SERVER_META.match(i))throw new Error("First packet received was not server meta");const{data:r}=i;this.address.hash=r.hash;let o=await this.tokenProvider.get(this.address,this.omu.app);if(!o)throw new u(`No token available for app ${this.omu.app.id.key()} at ${this.address.host}:${this.address.port}:${this.address.hash}`);let c;if(this.omu.app.type==="remote"&&D&&r.encryption){const a=await C.new(),d=await I.new(r.encryption.rsa);o&&(o=await d.encryptString(o)),this.aes=await A.new(),c={kind:"v1",rsa:await a.toRequest(),aes:await this.aes.serialize(d)}}this.connection.send({type:s.CONNECT,data:new b({app:this.omu.app,protocol:{version:N},encryption:c,token:o})},this.packetMapper),this.listenTask=this.listen(),await this.setStatus({type:"connected"}),await this.events.emit("connected"),this.dispatchTasks().then(()=>{this.send({type:s.READY,data:null})}),await this.listenTask}catch(i){if(i instanceof v&&(this.reason=i),!e)throw i}finally{this.events.emit("disconnected",this.reason),this.status.type!=="disconnected"&&this.status.type!=="reconnecting"&&this.setStatus({type:"disconnected",attempt:this.attempt,reason:this.reason}),this.connection?.close(),this.connection=void 0,this.listenTask=void 0}if(this.reason&&![n.SHUTDOWN,n.SERVER_RESTART].includes(this.reason.type)||(this.reason=void 0,!e)||!await this.scheduleReconnect(this.attempt))break}await this.setStatus({type:"disconnected",reason:this.reason}),this.connection?.close(),this.connection=void 0}isState(e){return this.status.type===e}async send(e){if(!this.connection)throw new Error("No connection established");if(this.aes){const t=this.packetMapper.serialize(e);e=await this.aes.encrypt(t)}this.connection.send(e,this.packetMapper)}async listen(){for(;this.connection;){const e=await this.connection.receive(this.packetMapper);if(!e)break;await this.dispatchPacket(e)}}async dispatchPacket(e){if(s.ENCRYPTED_PACKET.match(e)){if(!this.aes)throw new Error("Received encrypted packet before encryption was established");const i=await this.aes.decrypt(e);e=this.packetMapper.deserialize(i)}await this.events.emit("packet",e);const t=this.packetHandlers.get(e.type.id);t&&await t.event.emit(e.data)}addTask(e){this.tasks.push(e)}removeTask(e){const t=this.tasks.indexOf(e);t!==-1&&this.tasks.splice(t,1)}async dispatchTasks(){for(const e of this.tasks)await e()}async setStatus(e){if(this.status===e)throw new Error(`Cannot set status to ${e} when already ${e}`);this.status=e,await this.events.emit("status",e)}close(){this.setStatus({type:"disconnected"}),this.attempt=0,this.connection?.close(),this.connection=void 0}}export{j as Network};
2
2
  //# sourceMappingURL=network.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/network/network.ts"],
4
- "sourcesContent": ["import type { Address } from '../address.js';\nimport {\n AnotherConnection, AppRemoved, DisconnectReason, InternalError,\n InvalidOrigin,\n InvalidPacket,\n InvalidToken,\n InvalidVersion,\n PermissionDenied,\n ServerRestart,\n} from '../errors.js';\nimport { EventEmitter } from '../event';\nimport { IdentifierMap } from '../identifier';\nimport { Omu } from '../omu.js';\nimport type { SessioTokenProvider } from '../token.js';\nimport { VERSION } from '../version.js';\n\nimport type { Connection, Transport } from './connection.js';\nimport { PacketMapper } from './connection.js';\nimport { AES, Decryptor, ENCRYPTION_AVAILABLE, EncryptionResponse, Encryptor } from './encryption.js';\nimport { ConnectPacket, DisconnectType, PACKET_TYPES } from './packet/packet-types.js';\nimport type { Packet, PacketType } from './packet/packet.js';\n\ntype PacketHandler<T> = {\n readonly type: PacketType<T>;\n event: EventEmitter<[T]>;\n};\n\ntype StatusType<T> = {\n type: T;\n};\n\nexport type NetworkStatus = StatusType<'connecting'> | StatusType<'connected'> | StatusType<'ready'> | {\n type: 'disconnected';\n attempt?: number;\n reason?: DisconnectReason;\n} | {\n type: 'reconnecting';\n attempt: number;\n timeout: number;\n date: Date;\n cancel: () => void;\n};\n\nexport class Network {\n public status: NetworkStatus = { type: 'disconnected' };\n public readonly event: { connected: EventEmitter<[]>; disconnected: EventEmitter<[DisconnectReason | undefined]>; packet: EventEmitter<[Packet<unknown>]>; status: EventEmitter<[NetworkStatus]> } = {\n connected: new EventEmitter(),\n disconnected: new EventEmitter(),\n packet: new EventEmitter(),\n status: new EventEmitter(),\n };\n private readonly tasks: Array<() => Promise<void> | void> = [];\n private readonly packetMapper = new PacketMapper();\n private readonly packetHandlers = new IdentifierMap<PacketHandler<unknown>>();\n private listenTask: Promise<void> | undefined = undefined;\n public reason: DisconnectReason | undefined = undefined;\n private attempt = 0;\n\n constructor(\n private readonly omu: Omu,\n public address: Address,\n private readonly tokenProvider: SessioTokenProvider,\n private transport: Transport,\n private connection?: Connection | undefined,\n private aes?: AES | undefined,\n ) {\n this.registerPacket(\n PACKET_TYPES.SERVER_META,\n PACKET_TYPES.CONNECT,\n PACKET_TYPES.DISCONNECT,\n PACKET_TYPES.TOKEN,\n PACKET_TYPES.READY,\n PACKET_TYPES.ENCRYPTED_PACKET,\n );\n this.addPacketHandler(PACKET_TYPES.DISCONNECT, async (reason) => {\n if (reason.type === DisconnectType.SHUTDOWN\n || reason.type === DisconnectType.CLOSE) {\n this.setStatus({ type: 'disconnected' });\n return;\n }\n const ERROR_MAP = {\n [DisconnectType.ANOTHER_CONNECTION]: AnotherConnection,\n [DisconnectType.PERMISSION_DENIED]: PermissionDenied,\n [DisconnectType.APP_REMOVED]: AppRemoved,\n [DisconnectType.INVALID_TOKEN]: InvalidToken,\n [DisconnectType.INVALID_ORIGIN]: InvalidOrigin,\n [DisconnectType.INVALID_VERSION]: InvalidVersion,\n [DisconnectType.INTERNAL_ERROR]: InternalError,\n [DisconnectType.INVALID_PACKET]: InvalidPacket,\n [DisconnectType.INVALID_PACKET_TYPE]: InvalidPacket,\n [DisconnectType.INVALID_PACKET_DATA]: InvalidPacket,\n [DisconnectType.SERVER_RESTART]: ServerRestart,\n [DisconnectType.CLOSE]: undefined,\n [DisconnectType.SHUTDOWN]: undefined,\n };\n const error = ERROR_MAP[reason.type];\n if (error) {\n this.reason = new error(reason.message ?? '');\n }\n });\n this.addPacketHandler(PACKET_TYPES.READY, () => {\n if (this.status.type === 'ready') {\n throw new Error('Received READY packet when already ready');\n }\n this.setStatus({ type: 'ready' });\n this.attempt = 0;\n });\n }\n\n public setConnection(connection: Connection): void {\n if (this.status.type !== 'disconnected') {\n throw new Error('Cannot change connection while connected');\n }\n this.connection = connection;\n }\n\n public registerPacket(...packetTypes: PacketType<unknown>[]): void {\n this.packetMapper.register(...packetTypes);\n for (const type of packetTypes) {\n this.packetHandlers.set(type.id, {\n type,\n event: new EventEmitter(),\n });\n }\n }\n\n public addPacketHandler<T>(type: PacketType<T>, handler: (packet: T) => void): void {\n const listeners = this.packetHandlers.get(type.id) as PacketHandler<unknown> | undefined;\n if (!listeners) {\n throw new Error(`Packet type ${type.id.key()} not registered`);\n }\n listeners.event.listen(handler as (packet: unknown) => void);\n }\n\n private async scheduleReconnect(attempt: number): Promise<boolean> {\n const timeout = Math.min(30000, 2000 * (Math.pow(1.5, attempt) - 1) + 2000);\n const date = new Date();\n let cancelled = false;\n const status: Extract<NetworkStatus, { type: 'reconnecting' }> = {\n type: 'reconnecting',\n attempt,\n timeout,\n date,\n cancel: () => {cancelled = true;},\n };\n await this.setStatus(status);\n if (cancelled) {\n return false;\n }\n const remaining = status.timeout - (new Date().getTime() - date.getTime());\n await new Promise((resolve) => setTimeout(resolve, remaining));\n return true;\n }\n\n public async connect(reconnect = true): Promise<void> {\n if (!this.isState('disconnected')) {\n throw new Error(`Cannot connect while ${this.status.type}`);\n }\n if (this.listenTask) {\n throw new Error('Cannot connect while already connecting');\n }\n\n this.attempt = 0;\n while (this.omu.running) {\n this.attempt++;\n try {\n this.aes = undefined;\n this.connection = await this.transport.connect();\n await this.setStatus({ type: 'connecting' });\n const metaReceived = await this.connection.receive(this.packetMapper);\n if (!metaReceived) {\n throw new Error('Connection closed before receiving server meta');\n }\n if (!PACKET_TYPES.SERVER_META.match(metaReceived)) {\n throw new Error('First packet received was not server meta');\n }\n const { data: meta } = metaReceived;\n this.address.hash = meta.hash;\n let token = await this.tokenProvider.get(this.address, this.omu.app);\n if (!token) {\n throw new InvalidToken(`No token available for app ${this.omu.app.id.key()} at ${this.address.host}:${this.address.port}:${this.address.hash}`);\n }\n let encryptionResp: EncryptionResponse | undefined = undefined;\n if (this.omu.app.type === 'remote' && ENCRYPTION_AVAILABLE && meta.encryption) {\n const decryptor = await Decryptor.new();\n const encryptor = await Encryptor.new(meta.encryption.rsa);\n if (token) {\n token = await encryptor.encryptString(token);\n }\n this.aes = await AES.new();\n encryptionResp = {\n kind: 'v1',\n rsa: await decryptor.toRequest(),\n aes: await this.aes.serialize(encryptor),\n };\n }\n this.connection.send({\n type: PACKET_TYPES.CONNECT,\n data: new ConnectPacket({\n app: this.omu.app,\n protocol: { version: VERSION },\n encryption: encryptionResp,\n token,\n }),\n }, this.packetMapper);\n this.listenTask = this.listen();\n await this.setStatus({ type: 'connected' });\n await this.event.connected.emit();\n this.dispatchTasks().then(() => {\n this.send({\n type: PACKET_TYPES.READY,\n data: null,\n });\n });\n await this.listenTask;\n } catch (error) {\n if (error instanceof DisconnectReason) {\n this.reason = error;\n }\n if (!reconnect) {\n throw error;\n }\n } finally {\n this.event.disconnected.emit(this.reason);\n if (this.status.type !== 'disconnected' && this.status.type !== 'reconnecting') {\n this.setStatus({ type: 'disconnected', attempt: this.attempt, reason: this.reason });\n }\n this.connection?.close();\n this.connection = undefined;\n this.listenTask = undefined;\n }\n if (this.reason && ![\n DisconnectType.SHUTDOWN,\n DisconnectType.SERVER_RESTART,\n ].includes(this.reason.type)) {\n break;\n }\n this.reason = undefined;\n if (!reconnect) {\n break;\n }\n const shouldReconnect = await this.scheduleReconnect(this.attempt);\n if (!shouldReconnect) {\n break;\n }\n }\n await this.setStatus({ type: 'disconnected', reason: this.reason });\n this.connection?.close();\n this.connection = undefined;\n }\n\n private isState(state: NetworkStatus['type']): boolean {\n return this.status.type === state;\n }\n\n public async send(packet: Packet): Promise<void> {\n if (!this.connection) {\n throw new Error('No connection established');\n }\n if (this.aes) {\n const serialized = this.packetMapper.serialize(packet);\n packet = await this.aes.encrypt(serialized);\n }\n this.connection.send(packet, this.packetMapper);\n }\n\n private async listen(): Promise<void> {\n while (this.connection) {\n const packet = await this.connection.receive(this.packetMapper);\n if (!packet) {\n break;\n }\n await this.dispatchPacket(packet);\n }\n }\n\n private async dispatchPacket(packet: Packet): Promise<void> {\n if (PACKET_TYPES.ENCRYPTED_PACKET.match(packet)) {\n if (!this.aes) {\n throw new Error('Received encrypted packet before encryption was established');\n }\n const decrypted = await this.aes.decrypt(packet);\n packet = this.packetMapper.deserialize(decrypted);\n }\n await this.event.packet.emit(packet);\n const packetHandler = this.packetHandlers.get(packet.type.id);\n if (!packetHandler) {\n return;\n }\n await packetHandler.event.emit(packet.data);\n }\n\n public addTask(task: () => Promise<void> | void): void {\n this.tasks.push(task);\n }\n\n public removeTask(task: () => Promise<void> | void): void {\n this.tasks.splice(this.tasks.indexOf(task), 1);\n }\n\n private async dispatchTasks(): Promise<void> {\n for (const task of this.tasks) {\n await task();\n }\n }\n\n private async setStatus(status: NetworkStatus): Promise<void> {\n if (this.status === status) {\n throw new Error(`Cannot set status to ${status} when already ${status}`);\n }\n this.status = status;\n await this.event.status.emit(status);\n }\n\n public close(): void {\n this.setStatus({ type: 'disconnected' });\n this.attempt = 0;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["AnotherConnection", "AppRemoved", "DisconnectReason", "InternalError", "InvalidOrigin", "InvalidPacket", "InvalidToken", "InvalidVersion", "PermissionDenied", "ServerRestart", "EventEmitter", "IdentifierMap", "VERSION", "PacketMapper", "AES", "Decryptor", "ENCRYPTION_AVAILABLE", "Encryptor", "ConnectPacket", "DisconnectType", "PACKET_TYPES", "Network", "omu", "address", "tokenProvider", "transport", "connection", "aes", "reason", "error", "packetTypes", "type", "handler", "listeners", "attempt", "timeout", "date", "cancelled", "status", "remaining", "resolve", "reconnect", "metaReceived", "meta", "token", "encryptionResp", "decryptor", "encryptor", "state", "packet", "serialized", "decrypted", "packetHandler", "task"]
4
+ "sourcesContent": ["import type { Address } from '../address.js';\nimport {\n AnotherConnection, AppRemoved, DisconnectReason, InternalError,\n InvalidOrigin,\n InvalidPacket,\n InvalidToken,\n InvalidVersion,\n PermissionDenied,\n ServerRestart,\n} from '../errors.js';\nimport { EventEmitter, EventHub } from '../event';\nimport { IdentifierMap } from '../identifier';\nimport { Omu } from '../omu.js';\nimport type { SessionTokenProvider } from '../token.js';\nimport { VERSION } from '../version.js';\n\nimport type { Connection, Transport } from './connection.js';\nimport { PacketMapper } from './connection.js';\nimport { AES, Decryptor, ENCRYPTION_AVAILABLE, EncryptionResponse, Encryptor } from './encryption.js';\nimport { ConnectPacket, DisconnectType, PACKET_TYPES } from './packet/packet-types.js';\nimport type { Packet, PacketType } from './packet/packet.js';\n\ntype PacketHandler<T> = {\n readonly type: PacketType<T>;\n event: EventEmitter<[T]>;\n};\n\ntype StatusType<T> = {\n type: T;\n};\n\nexport type NetworkStatus = StatusType<'connecting'> | StatusType<'connected'> | StatusType<'ready'> | {\n type: 'disconnected';\n attempt?: number;\n reason?: DisconnectReason;\n} | {\n type: 'reconnecting';\n attempt: number;\n timeout: number;\n date: Date;\n cancel: () => void;\n};\n\ntype NetworkEvents = {\n connected: [];\n disconnected: [DisconnectReason | undefined];\n packet: [Packet<unknown>];\n status: [NetworkStatus];\n};\n\nexport class Network {\n public status: NetworkStatus = { type: 'disconnected' };\n private readonly events = new EventHub<NetworkEvents>();\n private readonly tasks: Array<() => Promise<void> | void> = [];\n private readonly packetMapper = new PacketMapper();\n private readonly packetHandlers = new IdentifierMap<PacketHandler<unknown>>();\n private listenTask: Promise<void> | undefined = undefined;\n public reason: DisconnectReason | undefined = undefined;\n private attempt = 0;\n\n constructor(\n private readonly omu: Omu,\n public address: Address,\n private readonly tokenProvider: SessionTokenProvider,\n private transport: Transport,\n private connection?: Connection | undefined,\n private aes?: AES | undefined,\n ) {\n this.registerPacket(\n PACKET_TYPES.SERVER_META,\n PACKET_TYPES.CONNECT,\n PACKET_TYPES.DISCONNECT,\n PACKET_TYPES.TOKEN,\n PACKET_TYPES.READY,\n PACKET_TYPES.ENCRYPTED_PACKET,\n );\n this.addPacketHandler(PACKET_TYPES.DISCONNECT, async (reason) => {\n if (reason.type === DisconnectType.SHUTDOWN\n || reason.type === DisconnectType.CLOSE) {\n this.setStatus({ type: 'disconnected' });\n return;\n }\n const ERROR_MAP = {\n [DisconnectType.ANOTHER_CONNECTION]: AnotherConnection,\n [DisconnectType.PERMISSION_DENIED]: PermissionDenied,\n [DisconnectType.APP_REMOVED]: AppRemoved,\n [DisconnectType.INVALID_TOKEN]: InvalidToken,\n [DisconnectType.INVALID_ORIGIN]: InvalidOrigin,\n [DisconnectType.INVALID_VERSION]: InvalidVersion,\n [DisconnectType.INTERNAL_ERROR]: InternalError,\n [DisconnectType.INVALID_PACKET]: InvalidPacket,\n [DisconnectType.INVALID_PACKET_TYPE]: InvalidPacket,\n [DisconnectType.INVALID_PACKET_DATA]: InvalidPacket,\n [DisconnectType.SERVER_RESTART]: ServerRestart,\n [DisconnectType.CLOSE]: undefined,\n [DisconnectType.SHUTDOWN]: undefined,\n };\n const error = ERROR_MAP[reason.type];\n if (error) {\n this.reason = new error(reason.message ?? '');\n }\n });\n this.addPacketHandler(PACKET_TYPES.READY, () => {\n if (this.status.type === 'ready') {\n throw new Error('Received READY packet when already ready');\n }\n this.setStatus({ type: 'ready' });\n this.attempt = 0;\n });\n }\n\n public on<K extends keyof NetworkEvents>(event: K, listener: (...args: NetworkEvents[K]) => Promise<void> | void): () => void {\n return this.events.on(event, listener);\n }\n\n public off<K extends keyof NetworkEvents>(event: K, listener: (...args: NetworkEvents[K]) => Promise<void> | void): void {\n this.events.off(event, listener);\n }\n\n public setConnection(connection: Connection): void {\n if (this.status.type !== 'disconnected') {\n throw new Error('Cannot change connection while connected');\n }\n this.connection = connection;\n }\n\n public registerPacket(...packetTypes: PacketType<unknown>[]): void {\n this.packetMapper.register(...packetTypes);\n for (const type of packetTypes) {\n this.packetHandlers.set(type.id, {\n type,\n event: new EventEmitter(),\n });\n }\n }\n\n public addPacketHandler<T>(type: PacketType<T>, handler: (packet: T) => void): void {\n const listeners = this.packetHandlers.get(type.id) as PacketHandler<unknown> | undefined;\n if (!listeners) {\n throw new Error(`Packet type ${type.id.key()} not registered`);\n }\n listeners.event.listen(handler as (packet: unknown) => void);\n }\n\n private async scheduleReconnect(attempt: number): Promise<boolean> {\n const timeout = Math.min(30000, 2000 * (Math.pow(1.5, attempt) - 1) + 2000);\n const date = new Date();\n let cancelled = false;\n const status: Extract<NetworkStatus, { type: 'reconnecting' }> = {\n type: 'reconnecting',\n attempt,\n timeout,\n date,\n cancel: () => {cancelled = true;},\n };\n await this.setStatus(status);\n if (cancelled) {\n return false;\n }\n const remaining = status.timeout - (new Date().getTime() - date.getTime());\n await new Promise((resolve) => setTimeout(resolve, remaining));\n return true;\n }\n\n public async connect(reconnect = true): Promise<void> {\n if (!this.isState('disconnected')) {\n throw new Error(`Cannot connect while ${this.status.type}`);\n }\n if (this.listenTask) {\n throw new Error('Cannot connect while already connecting');\n }\n\n this.attempt = 0;\n while (this.omu.running) {\n this.attempt++;\n try {\n this.aes = undefined;\n this.connection = await this.transport.connect();\n await this.setStatus({ type: 'connecting' });\n const metaReceived = await this.connection.receive(this.packetMapper);\n if (!metaReceived) {\n throw new Error('Connection closed before receiving server meta');\n }\n if (!PACKET_TYPES.SERVER_META.match(metaReceived)) {\n throw new Error('First packet received was not server meta');\n }\n const { data: meta } = metaReceived;\n this.address.hash = meta.hash;\n let token = await this.tokenProvider.get(this.address, this.omu.app);\n if (!token) {\n throw new InvalidToken(`No token available for app ${this.omu.app.id.key()} at ${this.address.host}:${this.address.port}:${this.address.hash}`);\n }\n let encryptionResp: EncryptionResponse | undefined = undefined;\n if (this.omu.app.type === 'remote' && ENCRYPTION_AVAILABLE && meta.encryption) {\n const decryptor = await Decryptor.new();\n const encryptor = await Encryptor.new(meta.encryption.rsa);\n if (token) {\n token = await encryptor.encryptString(token);\n }\n this.aes = await AES.new();\n encryptionResp = {\n kind: 'v1',\n rsa: await decryptor.toRequest(),\n aes: await this.aes.serialize(encryptor),\n };\n }\n this.connection.send({\n type: PACKET_TYPES.CONNECT,\n data: new ConnectPacket({\n app: this.omu.app,\n protocol: { version: VERSION },\n encryption: encryptionResp,\n token,\n }),\n }, this.packetMapper);\n this.listenTask = this.listen();\n await this.setStatus({ type: 'connected' });\n await this.events.emit('connected');\n this.dispatchTasks().then(() => {\n this.send({\n type: PACKET_TYPES.READY,\n data: null,\n });\n });\n await this.listenTask;\n } catch (error) {\n if (error instanceof DisconnectReason) {\n this.reason = error;\n }\n if (!reconnect) {\n throw error;\n }\n } finally {\n this.events.emit('disconnected', this.reason);\n if (this.status.type !== 'disconnected' && this.status.type !== 'reconnecting') {\n this.setStatus({ type: 'disconnected', attempt: this.attempt, reason: this.reason });\n }\n this.connection?.close();\n this.connection = undefined;\n this.listenTask = undefined;\n }\n if (this.reason && ![\n DisconnectType.SHUTDOWN,\n DisconnectType.SERVER_RESTART,\n ].includes(this.reason.type)) {\n break;\n }\n this.reason = undefined;\n if (!reconnect) {\n break;\n }\n const shouldReconnect = await this.scheduleReconnect(this.attempt);\n if (!shouldReconnect) {\n break;\n }\n }\n await this.setStatus({ type: 'disconnected', reason: this.reason });\n this.connection?.close();\n this.connection = undefined;\n }\n\n private isState(state: NetworkStatus['type']): boolean {\n return this.status.type === state;\n }\n\n public async send(packet: Packet): Promise<void> {\n if (!this.connection) {\n throw new Error('No connection established');\n }\n if (this.aes) {\n const serialized = this.packetMapper.serialize(packet);\n packet = await this.aes.encrypt(serialized);\n }\n this.connection.send(packet, this.packetMapper);\n }\n\n private async listen(): Promise<void> {\n while (this.connection) {\n const packet = await this.connection.receive(this.packetMapper);\n if (!packet) {\n break;\n }\n await this.dispatchPacket(packet);\n }\n }\n\n private async dispatchPacket(packet: Packet): Promise<void> {\n if (PACKET_TYPES.ENCRYPTED_PACKET.match(packet)) {\n if (!this.aes) {\n throw new Error('Received encrypted packet before encryption was established');\n }\n const decrypted = await this.aes.decrypt(packet);\n packet = this.packetMapper.deserialize(decrypted);\n }\n await this.events.emit('packet', packet);\n const packetHandler = this.packetHandlers.get(packet.type.id);\n if (!packetHandler) {\n return;\n }\n await packetHandler.event.emit(packet.data);\n }\n\n public addTask(task: () => Promise<void> | void): void {\n this.tasks.push(task);\n }\n\n public removeTask(task: () => Promise<void> | void): void {\n const index = this.tasks.indexOf(task);\n if (index !== -1) {\n this.tasks.splice(index, 1);\n }\n }\n\n private async dispatchTasks(): Promise<void> {\n for (const task of this.tasks) {\n await task();\n }\n }\n\n private async setStatus(status: NetworkStatus): Promise<void> {\n if (this.status === status) {\n throw new Error(`Cannot set status to ${status} when already ${status}`);\n }\n this.status = status;\n await this.events.emit('status', status);\n }\n\n public close(): void {\n void this.setStatus({ type: 'disconnected' });\n this.attempt = 0;\n this.connection?.close();\n this.connection = undefined;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["AnotherConnection", "AppRemoved", "DisconnectReason", "InternalError", "InvalidOrigin", "InvalidPacket", "InvalidToken", "InvalidVersion", "PermissionDenied", "ServerRestart", "EventEmitter", "EventHub", "IdentifierMap", "VERSION", "PacketMapper", "AES", "Decryptor", "ENCRYPTION_AVAILABLE", "Encryptor", "ConnectPacket", "DisconnectType", "PACKET_TYPES", "Network", "omu", "address", "tokenProvider", "transport", "connection", "aes", "reason", "error", "event", "listener", "packetTypes", "type", "handler", "listeners", "attempt", "timeout", "date", "cancelled", "status", "remaining", "resolve", "reconnect", "metaReceived", "meta", "token", "encryptionResp", "decryptor", "encryptor", "state", "packet", "serialized", "decrypted", "packetHandler", "task", "index"]
7
7
  }
package/dist/omu.d.ts CHANGED
@@ -14,23 +14,22 @@ import { type SignalExtension } from './api/signal/extension';
14
14
  import { type TableExtension } from './api/table/extension';
15
15
  import type { App } from './app.js';
16
16
  import type { Unlisten } from './event';
17
- import { EventEmitter } from './event';
18
17
  import type { Address, Connection } from './network';
19
18
  import { Network } from './network';
20
19
  import { Transport } from './network/connection.js';
21
20
  import type { PacketType } from './network/packet/packet.js';
22
- import { type SessioTokenProvider } from './token.js';
21
+ import { type SessionTokenProvider } from './token.js';
23
22
  export type ClientEvents = {
24
- started: EventEmitter<[]>;
25
- stopped: EventEmitter<[]>;
26
- ready: EventEmitter<[]>;
23
+ started: [];
24
+ stopped: [];
25
+ ready: [];
27
26
  };
28
27
  export declare class Omu {
29
28
  readonly app: App;
30
29
  ready: boolean;
31
30
  running: boolean;
32
- readonly event: ClientEvents;
33
- readonly token: SessioTokenProvider;
31
+ private readonly events;
32
+ readonly token: SessionTokenProvider;
34
33
  readonly address: Address;
35
34
  readonly sessions: SessionExtension;
36
35
  readonly network: Network;
@@ -49,13 +48,16 @@ export declare class Omu {
49
48
  readonly http: HttpExtension;
50
49
  constructor(app: App, options?: {
51
50
  address?: Address;
52
- token?: SessioTokenProvider | string;
51
+ token?: SessionTokenProvider | string;
53
52
  transport?: Transport;
54
53
  connection?: Connection;
55
54
  });
56
- send<T>(packetType: PacketType<T>, data: T): void;
55
+ send<T>(packetType: PacketType<T>, data: T): Promise<void>;
57
56
  start(): Promise<void>;
58
57
  stop(): void;
58
+ on<K extends keyof ClientEvents>(event: K, handler: (...args: ClientEvents[K]) => void): Unlisten;
59
+ off<K extends keyof ClientEvents>(event: K, handler: (...args: ClientEvents[K]) => void): void;
60
+ emit<K extends keyof ClientEvents>(event: K, ...args: ClientEvents[K]): void;
59
61
  onReady(callback: () => void): Unlisten;
60
62
  waitForReady(): Promise<void>;
61
63
  }
package/dist/omu.js CHANGED
@@ -1,2 +1,2 @@
1
- import{ExtensionRegistry as i}from"./api";import{ASSET_EXTENSION_TYPE as r}from"./api/asset/extension";import{DASHBOARD_EXTENSION_TYPE as o}from"./api/dashboard/extension";import{ENDPOINT_EXTENSION_TYPE as a}from"./api/endpoint/extension";import{HTTP_EXTENSION_TYPE as E}from"./api/http/extension";import{I18N_EXTENSION_TYPE as d}from"./api/i18n/extension";import{LOGGER_EXTENSION_TYPE as p}from"./api/logger/extension.js";import{PERMISSION_EXTENSION_TYPE as h}from"./api/permission/extension";import{PLUGIN_EXTENSION_TYPE as l}from"./api/plugin/extension";import{REGISTRY_EXTENSION_TYPE as m}from"./api/registry/extension";import{SERVER_EXTENSION_TYPE as y}from"./api/server/extension";import{SESSION_EXTENSION_TYPE as T}from"./api/session";import{SIGNAL_EXTENSION_TYPE as x}from"./api/signal/extension";import{TABLE_EXTENSION_TYPE as g}from"./api/table/extension";import{EventEmitter as s}from"./event";import{Network as f}from"./network";import{PACKET_TYPES as c}from"./network/packet/packet-types.js";import{WebsocketTransport as N}from"./network/websocket-transport";import{BrowserSession as S}from"./token.js";class V{constructor(t,e){this.app=t;if(this.ready=!1,this.running=!1,typeof e?.token=="string"){const n=e?.token;this.token={get:()=>Promise.resolve(n)}}else this.token=e?.token??new S;this.address=e?.address??{host:"127.0.0.1",port:26423,secure:!1},this.network=new f(this,this.address,this.token,e?.transport??new N(this.address),e?.connection),this.network.event.disconnected.listen(()=>{this.ready=!1}),this.network.addPacketHandler(c.READY,()=>{if(this.ready)throw new Error("Received READY packet when already ready");this.ready=!0,this.event.ready.emit()}),this.extensions=new i(this),this.endpoints=this.extensions.register(a),this.plugins=this.extensions.register(l),this.permissions=this.extensions.register(h),this.tables=this.extensions.register(g),this.sessions=this.extensions.register(T),this.registries=this.extensions.register(m),this.dashboard=this.extensions.register(o),this.signals=this.extensions.register(x),this.assets=this.extensions.register(r),this.i18n=this.extensions.register(d),this.server=this.extensions.register(y),this.logger=this.extensions.register(p),this.http=this.extensions.register(E)}ready;running;event={started:new s,stopped:new s,ready:new s};token;address;sessions;network;endpoints;permissions;plugins;dashboard;extensions;tables;registries;signals;assets;i18n;server;logger;http;send(t,e){this.network.send({type:t,data:e})}async start(){if(this.running)throw new Error("Client already running");this.running=!0;const t=this.network.connect();this.event.started.emit(),await t}stop(){this.running=!1,this.ready=!1,this.network.close(),this.event.stopped.emit()}onReady(t){return this.ready&&t(),this.event.ready.listen(t)}async waitForReady(){if(!this.ready)return new Promise(t=>{let e=()=>{};e=this.event.ready.listen(()=>{e(),t()})})}}export{V as Omu};
1
+ import{ExtensionRegistry as r}from"./api";import{ASSET_EXTENSION_TYPE as o}from"./api/asset/extension";import{DASHBOARD_EXTENSION_TYPE as a}from"./api/dashboard/extension";import{ENDPOINT_EXTENSION_TYPE as d}from"./api/endpoint/extension";import{HTTP_EXTENSION_TYPE as p}from"./api/http/extension";import{I18N_EXTENSION_TYPE as E}from"./api/i18n/extension";import{LOGGER_EXTENSION_TYPE as l}from"./api/logger/extension.js";import{PERMISSION_EXTENSION_TYPE as h}from"./api/permission/extension";import{PLUGIN_EXTENSION_TYPE as y}from"./api/plugin/extension";import{REGISTRY_EXTENSION_TYPE as m}from"./api/registry/extension";import{SERVER_EXTENSION_TYPE as f}from"./api/server/extension";import{SESSION_EXTENSION_TYPE as g}from"./api/session";import{SIGNAL_EXTENSION_TYPE as x}from"./api/signal/extension";import{TABLE_EXTENSION_TYPE as T}from"./api/table/extension";import{EventHub as c}from"./event";import{Network as v}from"./network";import{PACKET_TYPES as u}from"./network/packet/packet-types.js";import{WebsocketTransport as S}from"./network/websocket-transport";import{BrowserSession as N}from"./token.js";class q{constructor(t,e){this.app=t;if(this.ready=!1,this.running=!1,typeof e?.token=="string"){const s=e?.token;this.token={get:()=>Promise.resolve(s)}}else this.token=e?.token??new N;this.address=e?.address??{host:"127.0.0.1",port:26423,secure:!1},this.network=new v(this,this.address,this.token,e?.transport??new S(this.address),e?.connection),this.network.on("disconnected",()=>{this.ready=!1}),this.network.addPacketHandler(u.READY,()=>{if(this.ready)throw new Error("Received READY packet when already ready");this.ready=!0,this.events.emit("ready")}),this.extensions=new r(this),this.endpoints=this.extensions.register(d),this.plugins=this.extensions.register(y),this.permissions=this.extensions.register(h),this.tables=this.extensions.register(T),this.sessions=this.extensions.register(g),this.registries=this.extensions.register(m),this.dashboard=this.extensions.register(a),this.signals=this.extensions.register(x),this.assets=this.extensions.register(o),this.i18n=this.extensions.register(E),this.server=this.extensions.register(f),this.logger=this.extensions.register(l),this.http=this.extensions.register(p)}ready;running;events=new c;token;address;sessions;network;endpoints;permissions;plugins;dashboard;extensions;tables;registries;signals;assets;i18n;server;logger;http;send(t,e){return this.network.send({type:t,data:e})}async start(){if(this.running)throw new Error("Client already running");this.running=!0;const t=this.network.connect();this.events.emit("started");try{await t}finally{this.running=!1,this.ready=!1}}stop(){this.running=!1,this.ready=!1,this.network.close(),this.events.emit("stopped")}on(t,e){return this.events.on(t,e)}off(t,e){this.events.off(t,e)}emit(t,...e){this.events.emit(t,...e)}onReady(t){return this.ready&&t(),this.events.on("ready",t)}async waitForReady(){if(!this.ready){if(!this.running)throw new Error("Cannot wait for ready before the client has started");return new Promise((t,e)=>{const s=()=>{n(),i()},n=this.events.on("ready",()=>{s(),t()}),i=this.events.on("stopped",()=>{s(),e(new Error("Client stopped before becoming ready"))})})}}}export{q as Omu};
2
2
  //# sourceMappingURL=omu.js.map
package/dist/omu.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/omu.ts"],
4
- "sourcesContent": ["import { ExtensionRegistry } from './api';\nimport { ASSET_EXTENSION_TYPE, type AssetExtension } from './api/asset/extension';\nimport { DASHBOARD_EXTENSION_TYPE, type DashboardExtension } from './api/dashboard/extension';\nimport { ENDPOINT_EXTENSION_TYPE, type EndpointExtension } from './api/endpoint/extension';\nimport { HTTP_EXTENSION_TYPE, HttpExtension } from './api/http/extension';\nimport { I18N_EXTENSION_TYPE, type I18nExtension } from './api/i18n/extension';\nimport { LOGGER_EXTENSION_TYPE, type LoggerExtension } from './api/logger/extension.js';\nimport { PERMISSION_EXTENSION_TYPE, type PermissionExtension } from './api/permission/extension';\nimport { PLUGIN_EXTENSION_TYPE, type PluginExtension } from './api/plugin/extension';\nimport { REGISTRY_EXTENSION_TYPE, type RegistryExtension } from './api/registry/extension';\nimport { SERVER_EXTENSION_TYPE, type ServerExtension } from './api/server/extension';\nimport { SESSION_EXTENSION_TYPE, SessionExtension } from './api/session';\nimport { SIGNAL_EXTENSION_TYPE, type SignalExtension } from './api/signal/extension';\nimport { TABLE_EXTENSION_TYPE, type TableExtension } from './api/table/extension';\nimport type { App } from './app.js';\nimport type { Unlisten } from './event';\nimport { EventEmitter } from './event';\nimport type { Address, Connection } from './network';\nimport { Network } from './network';\nimport { Transport } from './network/connection.js';\nimport { PACKET_TYPES } from './network/packet/packet-types.js';\nimport type { PacketType } from './network/packet/packet.js';\nimport { WebsocketTransport } from './network/websocket-transport';\nimport { BrowserSession, type SessioTokenProvider } from './token.js';\n\nexport type ClientEvents = {\n started: EventEmitter<[]>;\n stopped: EventEmitter<[]>;\n ready: EventEmitter<[]>;\n};\n\nexport class Omu {\n public ready: boolean;\n public running: boolean;\n readonly event: ClientEvents = {\n started: new EventEmitter(),\n stopped: new EventEmitter(),\n ready: new EventEmitter(),\n };\n readonly token: SessioTokenProvider;\n readonly address: Address;\n readonly sessions: SessionExtension;\n readonly network: Network;\n readonly endpoints: EndpointExtension;\n readonly permissions: PermissionExtension;\n readonly plugins: PluginExtension;\n readonly dashboard: DashboardExtension;\n readonly extensions: ExtensionRegistry;\n readonly tables: TableExtension;\n readonly registries: RegistryExtension;\n readonly signals: SignalExtension;\n readonly assets: AssetExtension;\n readonly i18n: I18nExtension;\n readonly server: ServerExtension;\n readonly logger: LoggerExtension;\n readonly http: HttpExtension;\n\n constructor(\n public readonly app: App,\n options?: {\n address?: Address;\n token?: SessioTokenProvider | string;\n transport?: Transport;\n connection?: Connection;\n },\n ) {\n this.ready = false;\n this.running = false;\n if (typeof options?.token === 'string') {\n const token = options?.token;\n this.token = {\n get: () => Promise.resolve(token),\n };\n } else {\n this.token = options?.token ?? new BrowserSession();\n }\n this.address = options?.address ?? {\n host: '127.0.0.1',\n port: 26423,\n secure: false,\n };\n this.network = new Network(\n this,\n this.address,\n this.token,\n options?.transport ?? new WebsocketTransport(this.address),\n options?.connection,\n );\n this.network.event.disconnected.listen(() => {\n this.ready = false;\n });\n this.network.addPacketHandler(PACKET_TYPES.READY, () => {\n if (this.ready) {\n throw new Error('Received READY packet when already ready');\n }\n this.ready = true;\n this.event.ready.emit();\n });\n this.extensions = new ExtensionRegistry(this);\n this.endpoints = this.extensions.register(ENDPOINT_EXTENSION_TYPE);\n this.plugins = this.extensions.register(PLUGIN_EXTENSION_TYPE);\n this.permissions = this.extensions.register(PERMISSION_EXTENSION_TYPE);\n this.tables = this.extensions.register(TABLE_EXTENSION_TYPE);\n this.sessions = this.extensions.register(SESSION_EXTENSION_TYPE);\n this.registries = this.extensions.register(REGISTRY_EXTENSION_TYPE);\n this.dashboard = this.extensions.register(DASHBOARD_EXTENSION_TYPE);\n this.signals = this.extensions.register(SIGNAL_EXTENSION_TYPE);\n this.assets = this.extensions.register(ASSET_EXTENSION_TYPE);\n this.i18n = this.extensions.register(I18N_EXTENSION_TYPE);\n this.server = this.extensions.register(SERVER_EXTENSION_TYPE);\n this.logger = this.extensions.register(LOGGER_EXTENSION_TYPE);\n this.http = this.extensions.register(HTTP_EXTENSION_TYPE);\n }\n\n public send<T>(packetType: PacketType<T>, data: T): void {\n this.network.send({\n type: packetType,\n data,\n });\n }\n\n public async start(): Promise<void> {\n if (this.running) {\n throw new Error('Client already running');\n }\n this.running = true;\n const connect = this.network.connect();\n this.event.started.emit();\n await connect;\n }\n\n public stop(): void {\n this.running = false;\n this.ready = false;\n this.network.close();\n this.event.stopped.emit();\n }\n\n public onReady(callback: () => void): Unlisten {\n if (this.ready) {\n callback();\n }\n return this.event.ready.listen(callback);\n }\n\n public async waitForReady(): Promise<void> {\n if (this.ready) return;\n return new Promise<void>((resolve) => {\n let unlisten = () => {};\n unlisten = this.event.ready.listen(() => {\n unlisten();\n resolve();\n });\n });\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["ExtensionRegistry", "ASSET_EXTENSION_TYPE", "DASHBOARD_EXTENSION_TYPE", "ENDPOINT_EXTENSION_TYPE", "HTTP_EXTENSION_TYPE", "I18N_EXTENSION_TYPE", "LOGGER_EXTENSION_TYPE", "PERMISSION_EXTENSION_TYPE", "PLUGIN_EXTENSION_TYPE", "REGISTRY_EXTENSION_TYPE", "SERVER_EXTENSION_TYPE", "SESSION_EXTENSION_TYPE", "SIGNAL_EXTENSION_TYPE", "TABLE_EXTENSION_TYPE", "EventEmitter", "Network", "PACKET_TYPES", "WebsocketTransport", "BrowserSession", "Omu", "app", "options", "token", "packetType", "data", "connect", "callback", "resolve", "unlisten"]
4
+ "sourcesContent": ["import { ExtensionRegistry } from './api';\nimport { ASSET_EXTENSION_TYPE, type AssetExtension } from './api/asset/extension';\nimport { DASHBOARD_EXTENSION_TYPE, type DashboardExtension } from './api/dashboard/extension';\nimport { ENDPOINT_EXTENSION_TYPE, type EndpointExtension } from './api/endpoint/extension';\nimport { HTTP_EXTENSION_TYPE, HttpExtension } from './api/http/extension';\nimport { I18N_EXTENSION_TYPE, type I18nExtension } from './api/i18n/extension';\nimport { LOGGER_EXTENSION_TYPE, type LoggerExtension } from './api/logger/extension.js';\nimport { PERMISSION_EXTENSION_TYPE, type PermissionExtension } from './api/permission/extension';\nimport { PLUGIN_EXTENSION_TYPE, type PluginExtension } from './api/plugin/extension';\nimport { REGISTRY_EXTENSION_TYPE, type RegistryExtension } from './api/registry/extension';\nimport { SERVER_EXTENSION_TYPE, type ServerExtension } from './api/server/extension';\nimport { SESSION_EXTENSION_TYPE, SessionExtension } from './api/session';\nimport { SIGNAL_EXTENSION_TYPE, type SignalExtension } from './api/signal/extension';\nimport { TABLE_EXTENSION_TYPE, type TableExtension } from './api/table/extension';\nimport type { App } from './app.js';\nimport type { Unlisten } from './event';\nimport { EventHub } from './event';\nimport type { Address, Connection } from './network';\nimport { Network } from './network';\nimport { Transport } from './network/connection.js';\nimport { PACKET_TYPES } from './network/packet/packet-types.js';\nimport type { PacketType } from './network/packet/packet.js';\nimport { WebsocketTransport } from './network/websocket-transport';\nimport { BrowserSession, type SessionTokenProvider } from './token.js';\n\nexport type ClientEvents = {\n started: [];\n stopped: [];\n ready: [];\n};\n\nexport class Omu {\n public ready: boolean;\n public running: boolean;\n private readonly events = new EventHub<ClientEvents>();\n readonly token: SessionTokenProvider;\n readonly address: Address;\n readonly sessions: SessionExtension;\n readonly network: Network;\n readonly endpoints: EndpointExtension;\n readonly permissions: PermissionExtension;\n readonly plugins: PluginExtension;\n readonly dashboard: DashboardExtension;\n readonly extensions: ExtensionRegistry;\n readonly tables: TableExtension;\n readonly registries: RegistryExtension;\n readonly signals: SignalExtension;\n readonly assets: AssetExtension;\n readonly i18n: I18nExtension;\n readonly server: ServerExtension;\n readonly logger: LoggerExtension;\n readonly http: HttpExtension;\n\n constructor(\n public readonly app: App,\n options?: {\n address?: Address;\n token?: SessionTokenProvider | string;\n transport?: Transport;\n connection?: Connection;\n },\n ) {\n this.ready = false;\n this.running = false;\n if (typeof options?.token === 'string') {\n const token = options?.token;\n this.token = {\n get: () => Promise.resolve(token),\n };\n } else {\n this.token = options?.token ?? new BrowserSession();\n }\n this.address = options?.address ?? {\n host: '127.0.0.1',\n port: 26423,\n secure: false,\n };\n this.network = new Network(\n this,\n this.address,\n this.token,\n options?.transport ?? new WebsocketTransport(this.address),\n options?.connection,\n );\n this.network.on('disconnected', () => {\n this.ready = false;\n });\n this.network.addPacketHandler(PACKET_TYPES.READY, () => {\n if (this.ready) {\n throw new Error('Received READY packet when already ready');\n }\n this.ready = true;\n this.events.emit('ready');\n });\n this.extensions = new ExtensionRegistry(this);\n this.endpoints = this.extensions.register(ENDPOINT_EXTENSION_TYPE);\n this.plugins = this.extensions.register(PLUGIN_EXTENSION_TYPE);\n this.permissions = this.extensions.register(PERMISSION_EXTENSION_TYPE);\n this.tables = this.extensions.register(TABLE_EXTENSION_TYPE);\n this.sessions = this.extensions.register(SESSION_EXTENSION_TYPE);\n this.registries = this.extensions.register(REGISTRY_EXTENSION_TYPE);\n this.dashboard = this.extensions.register(DASHBOARD_EXTENSION_TYPE);\n this.signals = this.extensions.register(SIGNAL_EXTENSION_TYPE);\n this.assets = this.extensions.register(ASSET_EXTENSION_TYPE);\n this.i18n = this.extensions.register(I18N_EXTENSION_TYPE);\n this.server = this.extensions.register(SERVER_EXTENSION_TYPE);\n this.logger = this.extensions.register(LOGGER_EXTENSION_TYPE);\n this.http = this.extensions.register(HTTP_EXTENSION_TYPE);\n }\n\n public send<T>(packetType: PacketType<T>, data: T): Promise<void> {\n return this.network.send({\n type: packetType,\n data,\n });\n }\n\n public async start(): Promise<void> {\n if (this.running) {\n throw new Error('Client already running');\n }\n this.running = true;\n const connect = this.network.connect();\n this.events.emit('started');\n try {\n await connect;\n } finally {\n this.running = false;\n this.ready = false;\n }\n }\n\n public stop(): void {\n this.running = false;\n this.ready = false;\n this.network.close();\n this.events.emit('stopped');\n }\n\n public on<K extends keyof ClientEvents>(event: K, handler: (...args: ClientEvents[K]) => void): Unlisten {\n return this.events.on(event, handler);\n }\n\n public off<K extends keyof ClientEvents>(event: K, handler: (...args: ClientEvents[K]) => void): void {\n this.events.off(event, handler);\n }\n\n public emit<K extends keyof ClientEvents>(event: K, ...args: ClientEvents[K]): void {\n this.events.emit(event, ...args);\n }\n\n public onReady(callback: () => void): Unlisten {\n if (this.ready) {\n callback();\n }\n return this.events.on('ready', callback);\n }\n\n public async waitForReady(): Promise<void> {\n if (this.ready) return;\n if (!this.running) {\n throw new Error('Cannot wait for ready before the client has started');\n }\n return new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n unlistenReady();\n unlistenStopped();\n };\n const unlistenReady = this.events.on('ready', () => {\n cleanup();\n resolve();\n });\n const unlistenStopped = this.events.on('stopped', () => {\n cleanup();\n reject(new Error('Client stopped before becoming ready'));\n });\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ExtensionRegistry", "ASSET_EXTENSION_TYPE", "DASHBOARD_EXTENSION_TYPE", "ENDPOINT_EXTENSION_TYPE", "HTTP_EXTENSION_TYPE", "I18N_EXTENSION_TYPE", "LOGGER_EXTENSION_TYPE", "PERMISSION_EXTENSION_TYPE", "PLUGIN_EXTENSION_TYPE", "REGISTRY_EXTENSION_TYPE", "SERVER_EXTENSION_TYPE", "SESSION_EXTENSION_TYPE", "SIGNAL_EXTENSION_TYPE", "TABLE_EXTENSION_TYPE", "EventHub", "Network", "PACKET_TYPES", "WebsocketTransport", "BrowserSession", "Omu", "app", "options", "token", "packetType", "data", "connect", "event", "handler", "args", "callback", "resolve", "reject", "cleanup", "unlistenReady", "unlistenStopped"]
7
7
  }
package/dist/token.d.ts CHANGED
@@ -1,13 +1,15 @@
1
1
  import type { Address } from './address.js';
2
2
  import type { App } from './app.js';
3
- export interface SessioTokenProvider {
3
+ export interface SessionTokenProvider {
4
4
  get(serverAddress: Address, app: App): Promise<string | undefined>;
5
5
  }
6
+ /** @deprecated Use SessionTokenProvider instead. */
7
+ export type SessioTokenProvider = SessionTokenProvider;
6
8
  export type SessionParam = {
7
9
  address: Address;
8
10
  token: string;
9
11
  };
10
- export declare class BrowserSession implements SessioTokenProvider {
12
+ export declare class BrowserSession implements SessionTokenProvider {
11
13
  static readonly PARAM_NAME = "_omu_session";
12
14
  get(address: Address): Promise<string | undefined>;
13
15
  private parseParamSession;
package/dist/token.js CHANGED
@@ -1,2 +1,2 @@
1
- import{tryCatch as t}from"./helper.js";class n{static PARAM_NAME="_omu_session";async get(e){const r=this.parseParamSession(e);if(r)return r}parseParamSession(e){const a=new URLSearchParams(location.search).get(n.PARAM_NAME);if(!a)return;const{ok:o,data:s}=t(()=>JSON.parse(a));if(!o){console.warn(`Failed to parse session from URL parameter: ${s}`);return}if(s.address.hash!==e.hash){console.warn(`Session address hash does not match: expected ${e.hash}, got ${s.address.hash}`);return}return s.token}}export{n as BrowserSession};
1
+ import{tryCatch as t}from"./helper.js";class o{static PARAM_NAME="_omu_session";async get(e){const r=this.parseParamSession(e);if(r)return r}parseParamSession(e){const n=new URLSearchParams(location.search).get(o.PARAM_NAME);if(!n)return;const{ok:a,data:s}=t(()=>JSON.parse(n));if(!a){console.warn(`Failed to parse session from URL parameter: ${s}`);return}if(s.address.hash!==e.hash){console.warn(`Session address hash does not match: expected ${e.hash}, got ${s.address.hash}`);return}return s.token}}export{o as BrowserSession};
2
2
  //# sourceMappingURL=token.js.map
package/dist/token.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/token.ts"],
4
- "sourcesContent": ["import type { Address } from './address.js';\n\nimport type { App } from './app.js';\nimport { tryCatch } from './helper.js';\n\nexport interface SessioTokenProvider {\n get(serverAddress: Address, app: App): Promise<string | undefined>;\n}\n\nexport type SessionParam = {\n address: Address;\n token: string;\n};\n\nexport class BrowserSession implements SessioTokenProvider {\n public static readonly PARAM_NAME = '_omu_session';\n\n public async get(address: Address): Promise<string | undefined> {\n const foundToken = this.parseParamSession(address);\n if (foundToken) return foundToken;\n return;\n }\n\n private parseParamSession(address: Address): string | undefined {\n const searchParams = new URLSearchParams(location.search);\n const param = searchParams.get(BrowserSession.PARAM_NAME);\n if (!param) return;\n const { ok, data: session } = tryCatch<SessionParam>(() => JSON.parse(param));\n if (!ok) {\n console.warn(`Failed to parse session from URL parameter: ${session}`);\n return undefined;\n }\n if (session.address.hash !== address.hash) {\n console.warn(`Session address hash does not match: expected ${address.hash}, got ${session.address.hash}`);\n return undefined;\n }\n return session.token;\n }\n}\n"],
5
- "mappings": "AAGA,OAAS,YAAAA,MAAgB,cAWlB,MAAMC,CAA8C,CACvD,OAAuB,WAAa,eAEpC,MAAa,IAAIC,EAA+C,CAC5D,MAAMC,EAAa,KAAK,kBAAkBD,CAAO,EACjD,GAAIC,EAAY,OAAOA,CAE3B,CAEQ,kBAAkBD,EAAsC,CAE5D,MAAME,EADe,IAAI,gBAAgB,SAAS,MAAM,EAC7B,IAAIH,EAAe,UAAU,EACxD,GAAI,CAACG,EAAO,OACZ,KAAM,CAAE,GAAAC,EAAI,KAAMC,CAAQ,EAAIN,EAAuB,IAAM,KAAK,MAAMI,CAAK,CAAC,EAC5E,GAAI,CAACC,EAAI,CACL,QAAQ,KAAK,+CAA+CC,CAAO,EAAE,EACrE,MACJ,CACA,GAAIA,EAAQ,QAAQ,OAASJ,EAAQ,KAAM,CACvC,QAAQ,KAAK,iDAAiDA,EAAQ,IAAI,SAASI,EAAQ,QAAQ,IAAI,EAAE,EACzG,MACJ,CACA,OAAOA,EAAQ,KACnB,CACJ",
4
+ "sourcesContent": ["import type { Address } from './address.js';\n\nimport type { App } from './app.js';\nimport { tryCatch } from './helper.js';\n\nexport interface SessionTokenProvider {\n get(serverAddress: Address, app: App): Promise<string | undefined>;\n}\n\n/** @deprecated Use SessionTokenProvider instead. */\nexport type SessioTokenProvider = SessionTokenProvider;\n\nexport type SessionParam = {\n address: Address;\n token: string;\n};\n\nexport class BrowserSession implements SessionTokenProvider {\n public static readonly PARAM_NAME = '_omu_session';\n\n public async get(address: Address): Promise<string | undefined> {\n const foundToken = this.parseParamSession(address);\n if (foundToken) return foundToken;\n return;\n }\n\n private parseParamSession(address: Address): string | undefined {\n const searchParams = new URLSearchParams(location.search);\n const param = searchParams.get(BrowserSession.PARAM_NAME);\n if (!param) return;\n const { ok, data: session } = tryCatch<SessionParam>(() => JSON.parse(param));\n if (!ok) {\n console.warn(`Failed to parse session from URL parameter: ${session}`);\n return undefined;\n }\n if (session.address.hash !== address.hash) {\n console.warn(`Session address hash does not match: expected ${address.hash}, got ${session.address.hash}`);\n return undefined;\n }\n return session.token;\n }\n}\n"],
5
+ "mappings": "AAGA,OAAS,YAAAA,MAAgB,cAclB,MAAMC,CAA+C,CACxD,OAAuB,WAAa,eAEpC,MAAa,IAAIC,EAA+C,CAC5D,MAAMC,EAAa,KAAK,kBAAkBD,CAAO,EACjD,GAAIC,EAAY,OAAOA,CAE3B,CAEQ,kBAAkBD,EAAsC,CAE5D,MAAME,EADe,IAAI,gBAAgB,SAAS,MAAM,EAC7B,IAAIH,EAAe,UAAU,EACxD,GAAI,CAACG,EAAO,OACZ,KAAM,CAAE,GAAAC,EAAI,KAAMC,CAAQ,EAAIN,EAAuB,IAAM,KAAK,MAAMI,CAAK,CAAC,EAC5E,GAAI,CAACC,EAAI,CACL,QAAQ,KAAK,+CAA+CC,CAAO,EAAE,EACrE,MACJ,CACA,GAAIA,EAAQ,QAAQ,OAASJ,EAAQ,KAAM,CACvC,QAAQ,KAAK,iDAAiDA,EAAQ,IAAI,SAASI,EAAQ,QAAQ,IAAI,EAAE,EACzG,MACJ,CACA,OAAOA,EAAQ,KACnB,CACJ",
6
6
  "names": ["tryCatch", "BrowserSession", "address", "foundToken", "param", "ok", "session"]
7
7
  }
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.10.7";
1
+ export declare const VERSION = "0.10.9";
2
2
  export declare const VERSION_MINOR = "0.10.0";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- const o="0.10.7",t="0.10.0";export{o as VERSION,t as VERSION_MINOR};
1
+ const o="0.10.9",t="0.10.0";export{o as VERSION,t as VERSION_MINOR};
2
2
  //# sourceMappingURL=version.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/version.ts"],
4
- "sourcesContent": ["export const VERSION = '0.10.7';\nexport const VERSION_MINOR = '0.10.0';\n"],
4
+ "sourcesContent": ["export const VERSION = '0.10.9';\nexport const VERSION_MINOR = '0.10.0';\n"],
5
5
  "mappings": "AAAO,MAAMA,EAAU,SACVC,EAAgB",
6
6
  "names": ["VERSION", "VERSION_MINOR"]
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@omujs/omu",
4
- "version": "0.10.7",
4
+ "version": "0.10.9",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "exports": {
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "./*": {
13
13
  "import": "./dist/*/index.js",
14
- "types": "./dist/*/index.d.js"
14
+ "types": "./dist/*/index.d.ts"
15
15
  }
16
16
  },
17
17
  "files": [