@omujs/omu 0.9.50 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/dashboard/extension.d.ts +8 -2
- package/dist/api/dashboard/extension.js +1 -1
- package/dist/api/dashboard/extension.js.map +3 -3
- package/dist/api/dashboard/index.d.ts +1 -1
- package/dist/api/dashboard/index.js +1 -1
- package/dist/api/dashboard/index.js.map +3 -3
- package/dist/api/registry/extension.js +1 -1
- package/dist/api/registry/extension.js.map +2 -2
- package/dist/api/table/extension.js +1 -1
- package/dist/api/table/extension.js.map +3 -3
- package/dist/network/network.js +1 -1
- package/dist/network/network.js.map +2 -2
- package/dist/serialize/bytebuffer.d.ts +1 -1
- package/dist/serialize/bytebuffer.js.map +2 -2
- package/dist/version.d.ts +2 -2
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -28,6 +28,9 @@ export type Cookie = {
|
|
|
28
28
|
name: string;
|
|
29
29
|
value: string;
|
|
30
30
|
};
|
|
31
|
+
export declare class CookieList extends Array<Cookie> {
|
|
32
|
+
toString(): string;
|
|
33
|
+
}
|
|
31
34
|
export type WebviewRequest = {
|
|
32
35
|
url: string;
|
|
33
36
|
script?: string;
|
|
@@ -65,6 +68,9 @@ export type WebviewEvent = {
|
|
|
65
68
|
} | {
|
|
66
69
|
type: 'cookie';
|
|
67
70
|
cookies: Cookie[];
|
|
71
|
+
} | {
|
|
72
|
+
type: 'message';
|
|
73
|
+
data: any;
|
|
68
74
|
};
|
|
69
75
|
export type WebviewEventListeners = {
|
|
70
76
|
[K in WebviewEvent['type']]?: Array<(event: Extract<WebviewEvent, {
|
|
@@ -79,7 +85,7 @@ export type WebviewEventPacket = {
|
|
|
79
85
|
export type WebviewHandle = {
|
|
80
86
|
readonly id: Identifier;
|
|
81
87
|
readonly url: string;
|
|
82
|
-
getCookies(): PromiseResult<
|
|
88
|
+
getCookies(): PromiseResult<CookieList, UserError>;
|
|
83
89
|
on<T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, {
|
|
84
90
|
type: T;
|
|
85
91
|
}>) => void): void;
|
|
@@ -170,7 +176,7 @@ export declare class DashboardExtension {
|
|
|
170
176
|
private getDashboard;
|
|
171
177
|
set(dashboard: DashboardHandler): void;
|
|
172
178
|
requestWebview(options: WebviewRequest): PromiseResult<WebviewHandle, UserError>;
|
|
173
|
-
getCookies(options: GetCookiesRequest): PromiseResult<
|
|
179
|
+
getCookies(options: GetCookiesRequest): PromiseResult<CookieList, UserError>;
|
|
174
180
|
openApp(app: App): Promise<void>;
|
|
175
181
|
installApp(app: App): Promise<AppInstallResponse>;
|
|
176
182
|
clearBlockedPrompts(): Promise<null>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{App as D}from"../../app.js";import{Identifier as h,IdentifierMap as q}from"../../identifier";import{PacketType as
|
|
1
|
+
import{App as D}from"../../app.js";import{Identifier as h,IdentifierMap as q}from"../../identifier";import{PacketType as m}from"../../network/packet/packet.js";import{PromiseResult as w}from"../../result.js";import{Serializer as g}from"../../serialize";import{EndpointType as i}from"../endpoint/endpoint.js";import{ExtensionType as B}from"../extension.js";import{RegistryType as N}from"../registry/registry.js";import{TableType as C}from"../table/table.js";import{DragDropReadResponse as J}from"./packets.js";const o=new B("dashboard",u=>new $(u)),v=o.join("set"),L=i.createJson(o,{name:"set",requestSerializer:h,permissionId:v}),U=o.join("app","open"),j=i.createJson(o,{name:"open_app",requestSerializer:D,permissionId:U}),b=m.createJson(o,{name:"open_app",serializer:D}),Ie=o.join("app","read"),ke=o.join("app","edit"),M=o.join("app","install"),z=i.createJson(o,{name:"install_app",requestSerializer:D,permissionId:M}),_=o.join("drag_drop"),y=m.createJson(o,{name:"drag_drop_state",serializer:g.noop().field("app",D)}),S=i.createSerialized(o,{name:"drag_drop_read",requestSerializer:g.json(),responseSerializer:J,permissionId:_}),f=i.createJson(o,{name:"drag_drop_request",permissionId:_});class G extends Array{toString(){return this.map(e=>`${e.name}=${e.value}`).join("; ")}}const P=o.join("webview"),I=i.createJson(o,{name:"cookies_get",permissionId:P}),k=i.createJson(o,{name:"webview_request",permissionId:P}),O=i.createJson(o,{name:"webview_close",permissionId:P}),A=m.createJson(o,{name:"webview_event",serializer:g.noop().field("id",h).field("target",h)}),K=C.createJson(o,{name:"allowed_webview_hosts",key:u=>u.id,permissions:{all:v}}),F=i.createJson(o,{name:"host_request",permissionId:P}),x=o.join("speech_recognition"),V=N.createJson(o,{name:"speech_recognition",defaultValue:{type:"idle"},permissions:{read:x,write:v}}),H=i.createJson(o,{name:"speech_recognition_start",permissionId:x}),T=m.createJson(o,{name:"prompt_request"}),W=m.createJson(o,{name:"prompt_response"}),Q=i.createJson(o,{name:"prompt_clear_blocked"});class ${constructor(e){this.omu=e;e.network.registerPacket(b,y,A,T,W),e.network.addPacketHandler(T,s=>{this.handlePromptRequest(s)}),e.network.addPacketHandler(b,s=>{this.handleOpenApp(s)}),e.network.addPacketHandler(y,({state:s})=>{switch(s.type){case"enter":{this.dragDropListeners.enter.forEach(t=>t(s));break}case"over":{this.dragDropListeners.over.forEach(t=>t(s));break}case"drop":{this.dragDropListeners.drop.forEach(t=>t(s));break}case"leave":{this.dragDropListeners.leave.forEach(t=>t(s));break}}}),e.network.addPacketHandler(A,s=>{const t=this.webviewHandles.get(s.id);t&&t.emit(s.event)}),this.allowedHosts=e.tables.get(K),this.speechRecognition=e.registries.get(V)}type=o;dashboard=null;dragDropHandler=null;dragDropListeners={enter:[],over:[],drop:[],leave:[]};allowedHosts;speechRecognition;webviewHandles=new q;async executeRequestForDashboard(e){const s=this.getDashboard();switch(e.kind){case"app/permissions":return await s.handlePermissionRequest(e);case"app/plugins":return await s.handlePluginRequest(e);case"app/install":return await s.handleInstallApp(e);case"app/update":return await s.handleUpdateApp(e);case"index/install":return await s.handleIndexInstall(e);case"http/port":return await s.handleHttpPortRequest(e);default:throw new Error(`Unknown prompt requested: ${JSON.stringify(e)}`)}}async handlePromptRequest(e){const s=await this.executeRequestForDashboard(e);this.omu.send(W,{id:e.id,kind:e.kind,result:s})}async handleOpenApp(e){await this.getDashboard().handleOpenApp(e)}getDashboard(){if(this.dashboard===null)throw new Error("Dashboard not set");return this.dashboard}set(e){if(this.omu.permissions.require(v),this.dashboard!==null)throw new Error("Dashboard already set");this.dashboard=e,this.omu.server.apps.event.remove.listen(async t=>{for(const r of t.values()){const n=await this.allowedHosts.get(r.id.key());n&&this.allowedHosts.remove(n)}});const s=async(t,r)=>{const n=t.caller.key();if(!(await this.allowedHosts.get(n)??{id:n,hosts:[]}).hosts.includes(r))if(await e.handleHostRequest({host:r},t)==="accept"){const l=await this.allowedHosts.get(n)??{id:n,hosts:[]};l.hosts.push(r),await this.allowedHosts.update(l)}else return{type:"cancelled"};return{type:"ok",value:void 0}};this.omu.endpoints.bind(f,async(t,r)=>({ok:await this.getDashboard().handleDragDropRequest(t,r)})),this.omu.endpoints.bind(S,async(t,r)=>await this.getDashboard().handleDragDropReadRequest(t,r)),this.omu.endpoints.bind(I,async(t,r)=>{const{url:n}=t,{host:d}=new URL(n),a=await s(r,d);return a.type!=="ok"?a:await e.getCookies(t)}),this.omu.endpoints.bind(F,async(t,r)=>{const{host:n}=t;return await s(r,n)}),this.omu.endpoints.bind(k,async(t,r)=>{const n=new URL(t.url),{host:d}=n,a=await s(r,d);if(a.type!=="ok")return a;const c=async p=>{this.omu.send(A,{id:l,target:r.caller,event:p})},l=await e.createWebview(t,r,c);return{type:"ok",value:{id:l.key()}}}),this.omu.endpoints.bind(O,async(t,r)=>{const n=await e.getWebview(t,r);return n?(await e.closeWebview(t,r),{type:"ok",value:{id:n.key()}}):{type:"cancelled"}}),this.omu.endpoints.bind(H,async(t,r)=>await e.speechRecognitionStart(t,r)),this.omu.network.addTask(async()=>{if(!(await this.omu.endpoints.call(L,this.omu.app.id)).success)throw new Error("Failed to set dashboard")})}requestWebview(e){const{promise:s,resolve:t,reject:r}=w.create();return this.omu.endpoints.call(k,e).then(n=>{if(n.type!=="ok"){r(n);return}const{value:d}=n,a=h.fromKey(d.id),c={},l={id:a,url:e.url,close:async()=>{await this.omu.endpoints.call(O,{id:a.key()})},getCookies:()=>this.getCookies({url:e.url}),on:function(p,R){c[p]||(c[p]=[]),c[p].push(R)},join:async()=>{await new Promise(p=>{l.on("closed",()=>p())})}};this.webviewHandles.set(a,{handle:l,emit:function(p){const R=c[p.type];if(R)for(const E of R)E(p)}}),t(l)}),s}getCookies(e){const{promise:s,resolve:t,reject:r}=w.create();return this.omu.endpoints.call(I,e).then(n=>{if(n.type==="ok"){t(G.from(n.value));return}else r(n)}),s}async openApp(e){return await this.omu.endpoints.call(j,e)}async installApp(e){return await this.omu.endpoints.call(z,e)}async clearBlockedPrompts(){return await this.omu.endpoints.call(Q,null)}async requestDragDrop(){await this.omu.endpoints.call(f,{});const e=this.dragDropListeners,s=this.omu;return this.dragDropHandler={onEnter(t){e.enter.push(t)},onOver(t){e.over.push(t)},onDrop(t){e.drop.push(t)},onLeave(t){e.leave.push(t)},async read(t){return await s.endpoints.call(S,{drag_id:t})}},this.dragDropHandler}async notifyDropDragState(e){this.omu.send(y,e)}requestSpeechRecognition(){const{promise:e,resolve:s,reject:t}=w.create();return this.omu.endpoints.call(H,{type:"start"}).then(r=>{r.type==="ok"?s(this.speechRecognition):t(r)}),e}}export{G as CookieList,M as DASHBOARD_APP_INSTALL_PERMISSION_ID,_ as DASHBOARD_DRAG_DROP_PERMISSION_ID,o as DASHBOARD_EXTENSION_TYPE,U as DASHBOARD_OPEN_APP_PERMISSION_ID,v as DASHBOARD_SET_PERMISSION_ID,x as DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,P as DASHBOARD_WEBVIEW_PERMISSION_ID,ke as DASHOBARD_APP_EDIT_PERMISSION_ID,Ie as DASHOBARD_APP_READ_PERMISSION_ID,$ as DashboardExtension};
|
|
2
2
|
//# sourceMappingURL=extension.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/dashboard/extension.ts"],
|
|
4
|
-
"sourcesContent": ["import { App, AppJson } from '../../app.js';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu.js';\nimport { PromiseResult } from '../../result.js';\nimport { Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { InvokedParams } from '../endpoint/packets.js';\nimport { ExtensionType } from '../extension.js';\nimport { PermissionTypeJson } from '../permission/permission.js';\nimport { PackageInfo } from '../plugin/package-info.js';\nimport { Registry, RegistryType } from '../registry/registry.js';\nimport { AppIndexRegistryMeta } from '../server/extension.js';\nimport type { Table } from '../table/table.js';\nimport { TableType } from '../table/table.js';\n\nimport type { DashboardHandler } from './handler.js';\nimport { AppInstallResponse, DragDrop, DragDropReadRequest, DragDropReadResponse, DragDropRequestDashboard, DragDropRequestResponse, DragEnter, DragLeave, DragOver, FileDragPacket } from './packets.js';\n\nexport const DASHBOARD_EXTENSION_TYPE: ExtensionType<DashboardExtension> = new ExtensionType(\n 'dashboard',\n (omu: Omu) => new DashboardExtension(omu),\n);\n\ntype DashboardSetResponse = {\n success: boolean;\n};\nexport const DASHBOARD_SET_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('set');\nconst DASHBOARD_SET_ENDPOINT = EndpointType.createJson<Identifier, DashboardSetResponse>(\n DASHBOARD_EXTENSION_TYPE,\n {\n name: 'set',\n requestSerializer: Identifier,\n permissionId: DASHBOARD_SET_PERMISSION_ID,\n },\n);\nexport const DASHBOARD_OPEN_APP_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('app', 'open');\nconst DASHBOARD_OPEN_APP_ENDPOINT = EndpointType.createJson<App, void>(DASHBOARD_EXTENSION_TYPE, {\n name: 'open_app',\n requestSerializer: App,\n permissionId: DASHBOARD_OPEN_APP_PERMISSION_ID,\n});\nconst DASHBOARD_OPEN_APP_PACKET = PacketType.createJson<App>(DASHBOARD_EXTENSION_TYPE, {\n name: 'open_app',\n serializer: App,\n});\nexport const DASHOBARD_APP_READ_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('app', 'read');\nexport const DASHOBARD_APP_EDIT_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('app', 'edit');\nexport const DASHBOARD_APP_INSTALL_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('app', 'install');\nconst DASHBOARD_APP_INSTALL_ENDPOINT = EndpointType.createJson<App, AppInstallResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'install_app',\n requestSerializer: App,\n permissionId: DASHBOARD_APP_INSTALL_PERMISSION_ID,\n});\nexport const DASHBOARD_DRAG_DROP_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('drag_drop');\nconst DASHBOARD_DRAG_DROP_STATE_PACKET = PacketType.createJson<FileDragPacket>(DASHBOARD_EXTENSION_TYPE, {\n name: 'drag_drop_state',\n serializer: Serializer.noop<FileDragPacket>()\n .field('app', App),\n});\nconst DASHBOARD_DRAG_DROP_READ_ENDPOINT = EndpointType.createSerialized<DragDropReadRequest, DragDropReadResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'drag_drop_read',\n requestSerializer: Serializer.json(),\n responseSerializer: DragDropReadResponse,\n permissionId: DASHBOARD_DRAG_DROP_PERMISSION_ID,\n});\nconst DASHBOARD_DRAG_DROP_REQUEST_ENDPOINT = EndpointType.createJson<DragDropRequestDashboard, DragDropRequestResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'drag_drop_request',\n permissionId: DASHBOARD_DRAG_DROP_PERMISSION_ID,\n});\n\ntype DragDropHandler = {\n onEnter(fn: (event: DragEnter) => unknown): void;\n onOver(fn: (event: DragOver) => unknown): void;\n onDrop(fn: (event: DragDrop) => unknown): void;\n onLeave(fn: (event: DragLeave) => unknown): void;\n read(id: string): Promise<DragDropReadResponse>;\n};\n\nexport type Cookie = {\n name: string;\n value: string;\n};\n\nexport type WebviewRequest = {\n url: string;\n script?: string;\n};\n\nexport type WebviewPacket = {\n id: string;\n};\n\nexport type UserResponse<T = undefined> = {\n type: 'ok';\n value: T;\n} | {\n type: 'blocked';\n} | {\n type: 'cancelled';\n};\n\nexport type UserError = Exclude<UserResponse, { type: 'ok' }>;\n\nexport type WebviewResponse = UserResponse<WebviewPacket>;\n\nexport const DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('webview');\n\nexport type HostRequest = {\n host: string;\n};\n\nexport type GetCookiesRequest = {\n url: string;\n};\n\nconst DASHBOARD_COOKIES_GET = EndpointType.createJson<GetCookiesRequest, UserResponse<Cookie[]>>(DASHBOARD_EXTENSION_TYPE, {\n name: 'cookies_get',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_WEBVIEW_REQUEST = EndpointType.createJson<WebviewRequest, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_request',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_WEBVIEW_CLOSE = EndpointType.createJson<WebviewPacket, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_close',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nexport type WebviewEvent = {\n type: 'closed';\n} | {\n type: 'resize';\n dimentions: {\n x: number;\n y: number;\n };\n} | {\n type: 'cookie';\n cookies: Cookie[];\n};\n\nexport type WebviewEventListeners = {\n [K in WebviewEvent['type']]?: Array<(event: Extract<WebviewEvent, { type: K }>) => void>;\n};\n\nexport type WebviewEventPacket = {\n id: Identifier;\n target: Identifier;\n event: WebviewEvent;\n};\n\nexport type WebviewHandle = {\n readonly id: Identifier;\n readonly url: string;\n getCookies(): PromiseResult<Cookie[], UserError>;\n on<T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void;\n close(): Promise<void>;\n join(): Promise<void>;\n};\n\nexport type WebviewEventEmit = <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>) => void;\n\nconst DASHBOARD_WEBVIEW_EVENT_PACKET = PacketType.createJson<WebviewEventPacket>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_event',\n serializer: Serializer.noop<WebviewEventPacket>()\n .field('id', Identifier)\n .field('target', Identifier),\n});\n\ntype AllowedHost = {\n id: string;\n hosts: string[];\n};\n\nconst DASHBOARD_ALLOWED_WEBVIEW_HOSTS = TableType.createJson<AllowedHost>(DASHBOARD_EXTENSION_TYPE, {\n name: 'allowed_webview_hosts',\n key: (entry) => entry.id,\n permissions: { all: DASHBOARD_SET_PERMISSION_ID },\n});\n\nconst DASHBOARD_HOST_REQUEST = EndpointType.createJson<{\n host: string;\n}, UserResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'host_request',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nexport const DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('speech_recognition');\n\nexport type TranscriptSegment = {\n confidence: number;\n transcript: string;\n};\n\nexport type TranscriptStatus = {\n type: 'idle';\n} | {\n type: 'result';\n timestamp: number;\n segments: TranscriptSegment[];\n} | {\n type: 'final';\n timestamp: number;\n segments: TranscriptSegment[];\n} | {\n type: 'audio_started';\n timestamp: number;\n} | {\n type: 'audio_ended';\n timestamp: number;\n};\n\nconst DASHBOARD_SPEECH_RECOGNITION = RegistryType.createJson<TranscriptStatus>(DASHBOARD_EXTENSION_TYPE, {\n name: 'speech_recognition',\n defaultValue: { type: 'idle' },\n permissions: {\n read: DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n write: DASHBOARD_SET_PERMISSION_ID,\n },\n});\n\nexport type SpeechRecognitionStart = {\n type: 'start';\n};\n\nconst DASHBOARD_SPEECH_RECOGNITION_START = EndpointType.createJson<SpeechRecognitionStart, UserResponse<undefined>>(DASHBOARD_EXTENSION_TYPE, {\n name: 'speech_recognition_start',\n permissionId: DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n});\n\ninterface PromptRequestBase<T extends string> {\n kind: T;\n id: string;\n}\n\nexport interface PromptRequestAppPermissions extends PromptRequestBase<'app/permissions'> {\n app: AppJson;\n permissions: PermissionTypeJson[];\n}\n\nexport interface PromptRequestAppPlugins extends PromptRequestBase<'app/plugins'> {\n app: AppJson;\n packages: PackageInfo[];\n}\n\nexport interface PromptRequestAppInstall extends PromptRequestBase<'app/install'> {\n app: AppJson;\n dependencies: Record<string, AppJson>;\n}\n\nexport interface PromptRequestAppUpdate extends PromptRequestBase<'app/update'> {\n old_app: AppJson;\n new_app: AppJson;\n dependencies: Record<string, AppJson>;\n}\n\nexport interface PromptRequestIndexInstall extends PromptRequestBase<'index/install'> {\n index_url: string;\n meta?: AppIndexRegistryMeta;\n}\n\nexport interface PortProcess {\n port: number;\n name: string;\n exe: string;\n}\n\nexport interface PromptRequestHttpPort extends PromptRequestBase<'http/port'> {\n app: AppJson;\n processes: PortProcess[];\n}\n\nexport type PromptRequest = (\n PromptRequestAppPermissions\n | PromptRequestAppPlugins\n | PromptRequestAppInstall\n | PromptRequestAppUpdate\n | PromptRequestIndexInstall\n | PromptRequestHttpPort\n);\n\nconst DASHBOARD_PROMPT_REQUEST = PacketType.createJson<PromptRequest>(DASHBOARD_EXTENSION_TYPE, {\n name: 'prompt_request',\n});\n\nexport type PromptResult = 'accept' | 'deny' | 'block';\n\ninterface PromptResponse {\n id: string;\n kind: string;\n result: PromptResult;\n}\n\nconst DASHBOARD_PROMPT_RESPONSE = PacketType.createJson<PromptResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'prompt_response',\n});\n\nconst DASHBOARD_PROMPT_CLEAR_BLOCKED = EndpointType.createJson<null, null>(DASHBOARD_EXTENSION_TYPE, {\n name: 'prompt_clear_blocked',\n});\n\nexport class DashboardExtension {\n public readonly type: ExtensionType<DashboardExtension> = DASHBOARD_EXTENSION_TYPE;\n private dashboard: DashboardHandler | null = null;\n private dragDropHandler: DragDropHandler | null = null;\n private dragDropListeners = {\n enter: [] as Array<(state: DragEnter) => unknown>,\n over: [] as Array<(state: DragOver) => unknown>,\n drop: [] as Array<(state: DragDrop) => unknown>,\n leave: [] as Array<(state: DragLeave) => unknown>,\n };\n public readonly allowedHosts: Table<AllowedHost>;\n public readonly speechRecognition: Registry<TranscriptStatus>;\n private readonly webviewHandles: IdentifierMap<{ handle: WebviewHandle; emit: WebviewEventEmit }> = new IdentifierMap();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n DASHBOARD_OPEN_APP_PACKET,\n DASHBOARD_DRAG_DROP_STATE_PACKET,\n DASHBOARD_WEBVIEW_EVENT_PACKET,\n DASHBOARD_PROMPT_REQUEST,\n DASHBOARD_PROMPT_RESPONSE,\n );\n omu.network.addPacketHandler(DASHBOARD_PROMPT_REQUEST, (request) => {\n this.handlePromptRequest(request);\n });\n omu.network.addPacketHandler(DASHBOARD_OPEN_APP_PACKET, (app) => {\n this.handleOpenApp(app);\n });\n omu.network.addPacketHandler(DASHBOARD_DRAG_DROP_STATE_PACKET, ({ state }) => {\n switch (state.type) {\n case 'enter': {\n this.dragDropListeners.enter.forEach((fn) => fn(state));\n break;\n }\n case 'over': {\n this.dragDropListeners.over.forEach((fn) => fn(state));\n break;\n }\n case 'drop': {\n this.dragDropListeners.drop.forEach((fn) => fn(state));\n break;\n }\n case 'leave': {\n this.dragDropListeners.leave.forEach((fn) => fn(state));\n break;\n }\n }\n });\n omu.network.addPacketHandler(DASHBOARD_WEBVIEW_EVENT_PACKET, (packet) => {\n const handle = this.webviewHandles.get(packet.id);\n if (!handle) return;\n handle.emit(packet.event);\n });\n this.allowedHosts = omu.tables.get(DASHBOARD_ALLOWED_WEBVIEW_HOSTS);\n this.speechRecognition = omu.registries.get(DASHBOARD_SPEECH_RECOGNITION);\n }\n\n private async executeRequestForDashboard(request: PromptRequest): Promise<PromptResult> {\n const dashboard = this.getDashboard();\n switch (request.kind) {\n case 'app/permissions':\n return await dashboard.handlePermissionRequest(request);\n case 'app/plugins':\n return await dashboard.handlePluginRequest(request);\n case 'app/install':\n return await dashboard.handleInstallApp(request);\n case 'app/update':\n return await dashboard.handleUpdateApp(request);\n case 'index/install':\n return await dashboard.handleIndexInstall(request);\n case 'http/port':\n return await dashboard.handleHttpPortRequest(request);\n default:\n throw new Error(`Unknown prompt requested: ${JSON.stringify(request)}`);\n }\n }\n\n private async handlePromptRequest(request: PromptRequest): Promise<void> {\n const response = await this.executeRequestForDashboard(request);\n this.omu.send(DASHBOARD_PROMPT_RESPONSE, {\n id: request.id,\n kind: request.kind,\n result: response,\n });\n }\n\n private async handleOpenApp(app: App): Promise<void> {\n const dashboard = this.getDashboard();\n await dashboard.handleOpenApp(app);\n }\n\n private getDashboard(): DashboardHandler {\n if (this.dashboard === null) {\n throw new Error('Dashboard not set');\n }\n return this.dashboard;\n }\n\n public set(dashboard: DashboardHandler): void {\n this.omu.permissions.require(DASHBOARD_SET_PERMISSION_ID);\n if (this.dashboard !== null) {\n throw new Error('Dashboard already set');\n }\n this.dashboard = dashboard;\n\n this.omu.server.apps.event.remove.listen(async (apps) => {\n for (const app of apps.values()) {\n const hosts = await this.allowedHosts.get(app.id.key());\n if (!hosts) continue;\n this.allowedHosts.remove(hosts);\n }\n });\n\n const requireHost = async (params: InvokedParams, host: string): Promise<UserResponse<undefined>> => {\n const id = params.caller.key();\n const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };\n const allowed = hostEntry.hosts.includes(host);\n if (!allowed) {\n const result = await dashboard.handleHostRequest({\n host,\n }, params);\n if (result === 'accept') {\n const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };\n hostEntry.hosts.push(host);\n await this.allowedHosts.update(hostEntry);\n } else {\n return { type: 'cancelled' };\n }\n }\n return { type: 'ok', value: undefined };\n };\n\n this.omu.endpoints.bind(DASHBOARD_DRAG_DROP_REQUEST_ENDPOINT, async (request: DragDropRequestDashboard, params): Promise<DragDropRequestResponse> => {\n const dashboard = this.getDashboard();\n const accepted = await dashboard.handleDragDropRequest(request, params);\n return {\n ok: accepted,\n };\n });\n this.omu.endpoints.bind(DASHBOARD_DRAG_DROP_READ_ENDPOINT, async (request, params): Promise<DragDropReadResponse> => {\n const dashboard = this.getDashboard();\n const response = await dashboard.handleDragDropReadRequest(request, params);\n return response;\n });\n this.omu.endpoints.bind(DASHBOARD_COOKIES_GET, async (request, params): Promise<UserResponse<Cookie[]>> => {\n const { url } = request;\n const { host } = new URL(url);\n const hostAccessResult = await requireHost(params, host);\n if (hostAccessResult.type !== 'ok') {\n return hostAccessResult;\n }\n return await dashboard.getCookies(request);\n });\n this.omu.endpoints.bind(DASHBOARD_HOST_REQUEST, async (request, params): Promise<UserResponse> => {\n const { host } = request;\n const result = await requireHost(params, host);\n return result;\n });\n this.omu.endpoints.bind(DASHBOARD_WEBVIEW_REQUEST, async (request, params): Promise<WebviewResponse> => {\n const url = new URL(request.url);\n const { host } = url;\n const hostAccessResult = await requireHost(params, host);\n if (hostAccessResult.type !== 'ok') {\n return hostAccessResult;\n }\n const emit = async (event: WebviewEvent) => {\n this.omu.send(DASHBOARD_WEBVIEW_EVENT_PACKET, {\n id,\n target: params.caller,\n event,\n });\n };\n const id = await dashboard.createWebview(request, params, emit);\n return {\n type: 'ok',\n value: {\n id: id.key(),\n },\n };\n });\n this.omu.endpoints.bind(DASHBOARD_WEBVIEW_CLOSE, async (request, params): Promise<WebviewResponse> => {\n const id = await dashboard.getWebview(request, params);\n if (!id) {\n return {\n type: 'cancelled',\n };\n }\n await dashboard.closeWebview(request, params);\n return {\n type: 'ok',\n value: {\n id: id.key(),\n },\n };\n });\n this.omu.endpoints.bind(DASHBOARD_SPEECH_RECOGNITION_START, async (request, params): Promise<UserResponse<undefined>> => {\n const result = await dashboard.speechRecognitionStart(request, params);\n return result;\n });\n this.omu.network.addTask(async () => {\n const response = await this.omu.endpoints.call(\n DASHBOARD_SET_ENDPOINT,\n this.omu.app.id,\n );\n if (!response.success) {\n throw new Error('Failed to set dashboard');\n }\n });\n }\n\n public requestWebview(options: WebviewRequest): PromiseResult<WebviewHandle, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<WebviewHandle, UserError>();\n this.omu.endpoints.call(\n DASHBOARD_WEBVIEW_REQUEST,\n options,\n ).then((result) => {\n if (result.type !== 'ok') {\n reject(result);\n return;\n }\n const { value } = result;\n const id = Identifier.fromKey(value.id);\n const eventListeners: WebviewEventListeners = {};\n const handle: WebviewHandle = {\n id,\n url: options.url,\n close: async () => {\n await this.omu.endpoints.call(\n DASHBOARD_WEBVIEW_CLOSE,\n { id: id.key() },\n );\n },\n getCookies: () => this.getCookies({\n url: options.url,\n }),\n on: function <T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void {\n if (!eventListeners[key]) {\n eventListeners[key] = [];\n }\n const listeners = eventListeners[key]!;\n listeners.push(callback);\n },\n join: async () => {\n await new Promise<void>((resolve) => {\n handle.on('closed', () => resolve());\n });\n },\n };\n this.webviewHandles.set(id, {\n handle,\n emit: function <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>): void {\n const listeners = eventListeners[event.type];\n if (!listeners) return;\n for (const listener of listeners) {\n listener(event);\n }\n },\n });\n\n resolve(handle);\n });\n return promise;\n }\n\n public getCookies(options: GetCookiesRequest): PromiseResult<Cookie[], UserError> {\n const { promise, resolve, reject } = PromiseResult.create<Cookie[], UserError>();\n this.omu.endpoints.call(\n DASHBOARD_COOKIES_GET,\n options,\n ).then((response) => {\n if (response.type === 'ok') {\n resolve(response.value);\n return;\n } else {\n reject(response);\n }\n });\n return promise;\n }\n\n public async openApp(app: App): Promise<void> {\n return await this.omu.endpoints.call(DASHBOARD_OPEN_APP_ENDPOINT, app);\n }\n\n public async installApp(app: App): Promise<AppInstallResponse> {\n return await this.omu.endpoints.call(DASHBOARD_APP_INSTALL_ENDPOINT, app);\n }\n\n public async clearBlockedPrompts(): Promise<null> {\n return await this.omu.endpoints.call(DASHBOARD_PROMPT_CLEAR_BLOCKED, null);\n }\n\n public async requestDragDrop(): Promise<DragDropHandler> {\n await this.omu.endpoints.call(DASHBOARD_DRAG_DROP_REQUEST_ENDPOINT, {});\n const listeners = this.dragDropListeners;\n const client = this.omu;\n this.dragDropHandler = {\n onEnter(fn) { listeners.enter.push(fn); },\n onOver(fn) { listeners.over.push(fn); },\n onDrop(fn) { listeners.drop.push(fn); },\n onLeave(fn) { listeners.leave.push(fn); },\n async read(id) { return await client.endpoints.call(DASHBOARD_DRAG_DROP_READ_ENDPOINT, { drag_id: id }); },\n };\n return this.dragDropHandler;\n }\n\n public async notifyDropDragState(packet: FileDragPacket): Promise<void> {\n this.omu.send(DASHBOARD_DRAG_DROP_STATE_PACKET, packet);\n }\n\n public requestSpeechRecognition(): PromiseResult<Registry<TranscriptStatus>, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<Registry<TranscriptStatus>, UserError>();\n this.omu.endpoints.call(DASHBOARD_SPEECH_RECOGNITION_START, { type: 'start' }).then((result) => {\n if (result.type === 'ok') {\n resolve(this.speechRecognition);\n } else {\n reject(result);\n }\n });\n return promise;\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAAS,OAAAA,MAAoB,eAC7B,OAAS,cAAAC,EAAY,iBAAAC,MAAqB,mBAC1C,OAAS,cAAAC,MAAkB,iCAE3B,OAAS,iBAAAC,MAAqB,kBAC9B,OAAS,cAAAC,MAAkB,kBAC3B,OAAS,gBAAAC,MAAoB,0BAE7B,OAAS,iBAAAC,MAAqB,kBAG9B,OAAmB,gBAAAC,MAAoB,0BAGvC,OAAS,aAAAC,MAAiB,oBAG1B,OAA4D,wBAAAC,MAA+H,eAEpL,MAAMC,EAA8D,IAAIJ,EAC3E,YACCK,GAAa,IAAIC,EAAmBD,CAAG,CAC5C,EAKaE,EAA0CH,EAAyB,KAAK,KAAK,EACpFI,EAAyBT,EAAa,WACxCK,EACA,CACI,KAAM,MACN,kBAAmBV,EACnB,aAAca,CAClB,CACJ,EACaE,EAA+CL,EAAyB,KAAK,MAAO,MAAM,EACjGM,EAA8BX,EAAa,WAAsBK,EAA0B,CAC7F,KAAM,WACN,kBAAmBX,EACnB,aAAcgB,CAClB,CAAC,EACKE,EAA4Bf,EAAW,WAAgBQ,EAA0B,CACnF,KAAM,WACN,WAAYX,CAChB,CAAC,EACYmB,GAA+CR,EAAyB,KAAK,MAAO,MAAM,EAC1FS,GAA+CT,EAAyB,KAAK,MAAO,MAAM,EAC1FU,EAAkDV,EAAyB,KAAK,MAAO,SAAS,EACvGW,EAAiChB,EAAa,WAAoCK,EAA0B,CAC9G,KAAM,cACN,kBAAmBX,EACnB,aAAcqB,CAClB,CAAC,EACYE,EAAgDZ,EAAyB,KAAK,WAAW,EAChGa,EAAmCrB,EAAW,WAA2BQ,EAA0B,CACrG,KAAM,kBACN,WAAYN,EAAW,KAAqB,EACvC,MAAM,MAAOL,CAAG,CACzB,CAAC,EACKyB,EAAoCnB,EAAa,iBAA4DK,EAA0B,CACzI,KAAM,iBACN,kBAAmBN,EAAW,KAAK,EACnC,mBAAoBK,EACpB,aAAca,CAClB,CAAC,EACKG,EAAuCpB,EAAa,WAA8DK,EAA0B,CAC9I,KAAM,oBACN,aAAcY,CAClB,CAAC,
|
|
6
|
-
"names": ["App", "Identifier", "IdentifierMap", "PacketType", "PromiseResult", "Serializer", "EndpointType", "ExtensionType", "RegistryType", "TableType", "DragDropReadResponse", "DASHBOARD_EXTENSION_TYPE", "omu", "DashboardExtension", "DASHBOARD_SET_PERMISSION_ID", "DASHBOARD_SET_ENDPOINT", "DASHBOARD_OPEN_APP_PERMISSION_ID", "DASHBOARD_OPEN_APP_ENDPOINT", "DASHBOARD_OPEN_APP_PACKET", "DASHOBARD_APP_READ_PERMISSION_ID", "DASHOBARD_APP_EDIT_PERMISSION_ID", "DASHBOARD_APP_INSTALL_PERMISSION_ID", "DASHBOARD_APP_INSTALL_ENDPOINT", "DASHBOARD_DRAG_DROP_PERMISSION_ID", "DASHBOARD_DRAG_DROP_STATE_PACKET", "DASHBOARD_DRAG_DROP_READ_ENDPOINT", "DASHBOARD_DRAG_DROP_REQUEST_ENDPOINT", "DASHBOARD_WEBVIEW_PERMISSION_ID", "DASHBOARD_COOKIES_GET", "DASHBOARD_WEBVIEW_REQUEST", "DASHBOARD_WEBVIEW_CLOSE", "DASHBOARD_WEBVIEW_EVENT_PACKET", "DASHBOARD_ALLOWED_WEBVIEW_HOSTS", "entry", "DASHBOARD_HOST_REQUEST", "DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID", "DASHBOARD_SPEECH_RECOGNITION", "DASHBOARD_SPEECH_RECOGNITION_START", "DASHBOARD_PROMPT_REQUEST", "DASHBOARD_PROMPT_RESPONSE", "DASHBOARD_PROMPT_CLEAR_BLOCKED", "request", "app", "state", "fn", "packet", "handle", "dashboard", "response", "apps", "hosts", "requireHost", "params", "host", "id", "hostEntry", "url", "hostAccessResult", "emit", "event", "options", "promise", "resolve", "reject", "result", "value", "eventListeners", "key", "callback", "listeners", "listener", "client"]
|
|
4
|
+
"sourcesContent": ["import { App, AppJson } from '../../app.js';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu.js';\nimport { PromiseResult } from '../../result.js';\nimport { Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { InvokedParams } from '../endpoint/packets.js';\nimport { ExtensionType } from '../extension.js';\nimport { PermissionTypeJson } from '../permission/permission.js';\nimport { PackageInfo } from '../plugin/package-info.js';\nimport { Registry, RegistryType } from '../registry/registry.js';\nimport { AppIndexRegistryMeta } from '../server/extension.js';\nimport type { Table } from '../table/table.js';\nimport { TableType } from '../table/table.js';\n\nimport type { DashboardHandler } from './handler.js';\nimport { AppInstallResponse, DragDrop, DragDropReadRequest, DragDropReadResponse, DragDropRequestDashboard, DragDropRequestResponse, DragEnter, DragLeave, DragOver, FileDragPacket } from './packets.js';\n\nexport const DASHBOARD_EXTENSION_TYPE: ExtensionType<DashboardExtension> = new ExtensionType(\n 'dashboard',\n (omu: Omu) => new DashboardExtension(omu),\n);\n\ntype DashboardSetResponse = {\n success: boolean;\n};\nexport const DASHBOARD_SET_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('set');\nconst DASHBOARD_SET_ENDPOINT = EndpointType.createJson<Identifier, DashboardSetResponse>(\n DASHBOARD_EXTENSION_TYPE,\n {\n name: 'set',\n requestSerializer: Identifier,\n permissionId: DASHBOARD_SET_PERMISSION_ID,\n },\n);\nexport const DASHBOARD_OPEN_APP_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('app', 'open');\nconst DASHBOARD_OPEN_APP_ENDPOINT = EndpointType.createJson<App, void>(DASHBOARD_EXTENSION_TYPE, {\n name: 'open_app',\n requestSerializer: App,\n permissionId: DASHBOARD_OPEN_APP_PERMISSION_ID,\n});\nconst DASHBOARD_OPEN_APP_PACKET = PacketType.createJson<App>(DASHBOARD_EXTENSION_TYPE, {\n name: 'open_app',\n serializer: App,\n});\nexport const DASHOBARD_APP_READ_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('app', 'read');\nexport const DASHOBARD_APP_EDIT_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('app', 'edit');\nexport const DASHBOARD_APP_INSTALL_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('app', 'install');\nconst DASHBOARD_APP_INSTALL_ENDPOINT = EndpointType.createJson<App, AppInstallResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'install_app',\n requestSerializer: App,\n permissionId: DASHBOARD_APP_INSTALL_PERMISSION_ID,\n});\nexport const DASHBOARD_DRAG_DROP_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('drag_drop');\nconst DASHBOARD_DRAG_DROP_STATE_PACKET = PacketType.createJson<FileDragPacket>(DASHBOARD_EXTENSION_TYPE, {\n name: 'drag_drop_state',\n serializer: Serializer.noop<FileDragPacket>()\n .field('app', App),\n});\nconst DASHBOARD_DRAG_DROP_READ_ENDPOINT = EndpointType.createSerialized<DragDropReadRequest, DragDropReadResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'drag_drop_read',\n requestSerializer: Serializer.json(),\n responseSerializer: DragDropReadResponse,\n permissionId: DASHBOARD_DRAG_DROP_PERMISSION_ID,\n});\nconst DASHBOARD_DRAG_DROP_REQUEST_ENDPOINT = EndpointType.createJson<DragDropRequestDashboard, DragDropRequestResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'drag_drop_request',\n permissionId: DASHBOARD_DRAG_DROP_PERMISSION_ID,\n});\n\ntype DragDropHandler = {\n onEnter(fn: (event: DragEnter) => unknown): void;\n onOver(fn: (event: DragOver) => unknown): void;\n onDrop(fn: (event: DragDrop) => unknown): void;\n onLeave(fn: (event: DragLeave) => unknown): void;\n read(id: string): Promise<DragDropReadResponse>;\n};\n\nexport type Cookie = {\n name: string;\n value: string;\n};\n\nexport class CookieList extends Array<Cookie> {\n public toString(): string {\n return this.map(cookie => `${cookie.name}=${cookie.value}`).join('; ');\n }\n}\n\nexport type WebviewRequest = {\n url: string;\n script?: string;\n};\n\nexport type WebviewPacket = {\n id: string;\n};\n\nexport type UserResponse<T = undefined> = {\n type: 'ok';\n value: T;\n} | {\n type: 'blocked';\n} | {\n type: 'cancelled';\n};\n\nexport type UserError = Exclude<UserResponse, { type: 'ok' }>;\n\nexport type WebviewResponse = UserResponse<WebviewPacket>;\n\nexport const DASHBOARD_WEBVIEW_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('webview');\n\nexport type HostRequest = {\n host: string;\n};\n\nexport type GetCookiesRequest = {\n url: string;\n};\n\nconst DASHBOARD_COOKIES_GET = EndpointType.createJson<GetCookiesRequest, UserResponse<Cookie[]>>(DASHBOARD_EXTENSION_TYPE, {\n name: 'cookies_get',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_WEBVIEW_REQUEST = EndpointType.createJson<WebviewRequest, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_request',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nconst DASHBOARD_WEBVIEW_CLOSE = EndpointType.createJson<WebviewPacket, WebviewResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_close',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nexport type WebviewEvent = {\n type: 'closed';\n} | {\n type: 'resize';\n dimentions: {\n x: number;\n y: number;\n };\n} | {\n type: 'cookie';\n cookies: Cookie[];\n} | {\n type: 'message';\n data: any;\n};\n\nexport type WebviewEventListeners = {\n [K in WebviewEvent['type']]?: Array<(event: Extract<WebviewEvent, { type: K }>) => void>;\n};\n\nexport type WebviewEventPacket = {\n id: Identifier;\n target: Identifier;\n event: WebviewEvent;\n};\n\nexport type WebviewHandle = {\n readonly id: Identifier;\n readonly url: string;\n getCookies(): PromiseResult<CookieList, UserError>;\n on<T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void;\n close(): Promise<void>;\n join(): Promise<void>;\n};\n\nexport type WebviewEventEmit = <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>) => void;\n\nconst DASHBOARD_WEBVIEW_EVENT_PACKET = PacketType.createJson<WebviewEventPacket>(DASHBOARD_EXTENSION_TYPE, {\n name: 'webview_event',\n serializer: Serializer.noop<WebviewEventPacket>()\n .field('id', Identifier)\n .field('target', Identifier),\n});\n\ntype AllowedHost = {\n id: string;\n hosts: string[];\n};\n\nconst DASHBOARD_ALLOWED_WEBVIEW_HOSTS = TableType.createJson<AllowedHost>(DASHBOARD_EXTENSION_TYPE, {\n name: 'allowed_webview_hosts',\n key: (entry) => entry.id,\n permissions: { all: DASHBOARD_SET_PERMISSION_ID },\n});\n\nconst DASHBOARD_HOST_REQUEST = EndpointType.createJson<{\n host: string;\n}, UserResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'host_request',\n permissionId: DASHBOARD_WEBVIEW_PERMISSION_ID,\n});\n\nexport const DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID: Identifier = DASHBOARD_EXTENSION_TYPE.join('speech_recognition');\n\nexport type TranscriptSegment = {\n confidence: number;\n transcript: string;\n};\n\nexport type TranscriptStatus = {\n type: 'idle';\n} | {\n type: 'result';\n timestamp: number;\n segments: TranscriptSegment[];\n} | {\n type: 'final';\n timestamp: number;\n segments: TranscriptSegment[];\n} | {\n type: 'audio_started';\n timestamp: number;\n} | {\n type: 'audio_ended';\n timestamp: number;\n};\n\nconst DASHBOARD_SPEECH_RECOGNITION = RegistryType.createJson<TranscriptStatus>(DASHBOARD_EXTENSION_TYPE, {\n name: 'speech_recognition',\n defaultValue: { type: 'idle' },\n permissions: {\n read: DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n write: DASHBOARD_SET_PERMISSION_ID,\n },\n});\n\nexport type SpeechRecognitionStart = {\n type: 'start';\n};\n\nconst DASHBOARD_SPEECH_RECOGNITION_START = EndpointType.createJson<SpeechRecognitionStart, UserResponse<undefined>>(DASHBOARD_EXTENSION_TYPE, {\n name: 'speech_recognition_start',\n permissionId: DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,\n});\n\ninterface PromptRequestBase<T extends string> {\n kind: T;\n id: string;\n}\n\nexport interface PromptRequestAppPermissions extends PromptRequestBase<'app/permissions'> {\n app: AppJson;\n permissions: PermissionTypeJson[];\n}\n\nexport interface PromptRequestAppPlugins extends PromptRequestBase<'app/plugins'> {\n app: AppJson;\n packages: PackageInfo[];\n}\n\nexport interface PromptRequestAppInstall extends PromptRequestBase<'app/install'> {\n app: AppJson;\n dependencies: Record<string, AppJson>;\n}\n\nexport interface PromptRequestAppUpdate extends PromptRequestBase<'app/update'> {\n old_app: AppJson;\n new_app: AppJson;\n dependencies: Record<string, AppJson>;\n}\n\nexport interface PromptRequestIndexInstall extends PromptRequestBase<'index/install'> {\n index_url: string;\n meta?: AppIndexRegistryMeta;\n}\n\nexport interface PortProcess {\n port: number;\n name: string;\n exe: string;\n}\n\nexport interface PromptRequestHttpPort extends PromptRequestBase<'http/port'> {\n app: AppJson;\n processes: PortProcess[];\n}\n\nexport type PromptRequest = (\n PromptRequestAppPermissions\n | PromptRequestAppPlugins\n | PromptRequestAppInstall\n | PromptRequestAppUpdate\n | PromptRequestIndexInstall\n | PromptRequestHttpPort\n);\n\nconst DASHBOARD_PROMPT_REQUEST = PacketType.createJson<PromptRequest>(DASHBOARD_EXTENSION_TYPE, {\n name: 'prompt_request',\n});\n\nexport type PromptResult = 'accept' | 'deny' | 'block';\n\ninterface PromptResponse {\n id: string;\n kind: string;\n result: PromptResult;\n}\n\nconst DASHBOARD_PROMPT_RESPONSE = PacketType.createJson<PromptResponse>(DASHBOARD_EXTENSION_TYPE, {\n name: 'prompt_response',\n});\n\nconst DASHBOARD_PROMPT_CLEAR_BLOCKED = EndpointType.createJson<null, null>(DASHBOARD_EXTENSION_TYPE, {\n name: 'prompt_clear_blocked',\n});\n\nexport class DashboardExtension {\n public readonly type: ExtensionType<DashboardExtension> = DASHBOARD_EXTENSION_TYPE;\n private dashboard: DashboardHandler | null = null;\n private dragDropHandler: DragDropHandler | null = null;\n private dragDropListeners = {\n enter: [] as Array<(state: DragEnter) => unknown>,\n over: [] as Array<(state: DragOver) => unknown>,\n drop: [] as Array<(state: DragDrop) => unknown>,\n leave: [] as Array<(state: DragLeave) => unknown>,\n };\n public readonly allowedHosts: Table<AllowedHost>;\n public readonly speechRecognition: Registry<TranscriptStatus>;\n private readonly webviewHandles: IdentifierMap<{ handle: WebviewHandle; emit: WebviewEventEmit }> = new IdentifierMap();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n DASHBOARD_OPEN_APP_PACKET,\n DASHBOARD_DRAG_DROP_STATE_PACKET,\n DASHBOARD_WEBVIEW_EVENT_PACKET,\n DASHBOARD_PROMPT_REQUEST,\n DASHBOARD_PROMPT_RESPONSE,\n );\n omu.network.addPacketHandler(DASHBOARD_PROMPT_REQUEST, (request) => {\n this.handlePromptRequest(request);\n });\n omu.network.addPacketHandler(DASHBOARD_OPEN_APP_PACKET, (app) => {\n this.handleOpenApp(app);\n });\n omu.network.addPacketHandler(DASHBOARD_DRAG_DROP_STATE_PACKET, ({ state }) => {\n switch (state.type) {\n case 'enter': {\n this.dragDropListeners.enter.forEach((fn) => fn(state));\n break;\n }\n case 'over': {\n this.dragDropListeners.over.forEach((fn) => fn(state));\n break;\n }\n case 'drop': {\n this.dragDropListeners.drop.forEach((fn) => fn(state));\n break;\n }\n case 'leave': {\n this.dragDropListeners.leave.forEach((fn) => fn(state));\n break;\n }\n }\n });\n omu.network.addPacketHandler(DASHBOARD_WEBVIEW_EVENT_PACKET, (packet) => {\n const handle = this.webviewHandles.get(packet.id);\n if (!handle) return;\n handle.emit(packet.event);\n });\n this.allowedHosts = omu.tables.get(DASHBOARD_ALLOWED_WEBVIEW_HOSTS);\n this.speechRecognition = omu.registries.get(DASHBOARD_SPEECH_RECOGNITION);\n }\n\n private async executeRequestForDashboard(request: PromptRequest): Promise<PromptResult> {\n const dashboard = this.getDashboard();\n switch (request.kind) {\n case 'app/permissions':\n return await dashboard.handlePermissionRequest(request);\n case 'app/plugins':\n return await dashboard.handlePluginRequest(request);\n case 'app/install':\n return await dashboard.handleInstallApp(request);\n case 'app/update':\n return await dashboard.handleUpdateApp(request);\n case 'index/install':\n return await dashboard.handleIndexInstall(request);\n case 'http/port':\n return await dashboard.handleHttpPortRequest(request);\n default:\n throw new Error(`Unknown prompt requested: ${JSON.stringify(request)}`);\n }\n }\n\n private async handlePromptRequest(request: PromptRequest): Promise<void> {\n const response = await this.executeRequestForDashboard(request);\n this.omu.send(DASHBOARD_PROMPT_RESPONSE, {\n id: request.id,\n kind: request.kind,\n result: response,\n });\n }\n\n private async handleOpenApp(app: App): Promise<void> {\n const dashboard = this.getDashboard();\n await dashboard.handleOpenApp(app);\n }\n\n private getDashboard(): DashboardHandler {\n if (this.dashboard === null) {\n throw new Error('Dashboard not set');\n }\n return this.dashboard;\n }\n\n public set(dashboard: DashboardHandler): void {\n this.omu.permissions.require(DASHBOARD_SET_PERMISSION_ID);\n if (this.dashboard !== null) {\n throw new Error('Dashboard already set');\n }\n this.dashboard = dashboard;\n\n this.omu.server.apps.event.remove.listen(async (apps) => {\n for (const app of apps.values()) {\n const hosts = await this.allowedHosts.get(app.id.key());\n if (!hosts) continue;\n this.allowedHosts.remove(hosts);\n }\n });\n\n const requireHost = async (params: InvokedParams, host: string): Promise<UserResponse<undefined>> => {\n const id = params.caller.key();\n const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };\n const allowed = hostEntry.hosts.includes(host);\n if (!allowed) {\n const result = await dashboard.handleHostRequest({\n host,\n }, params);\n if (result === 'accept') {\n const hostEntry: AllowedHost = await this.allowedHosts.get(id) ?? { id: id, hosts: [] };\n hostEntry.hosts.push(host);\n await this.allowedHosts.update(hostEntry);\n } else {\n return { type: 'cancelled' };\n }\n }\n return { type: 'ok', value: undefined };\n };\n\n this.omu.endpoints.bind(DASHBOARD_DRAG_DROP_REQUEST_ENDPOINT, async (request: DragDropRequestDashboard, params): Promise<DragDropRequestResponse> => {\n const dashboard = this.getDashboard();\n const accepted = await dashboard.handleDragDropRequest(request, params);\n return {\n ok: accepted,\n };\n });\n this.omu.endpoints.bind(DASHBOARD_DRAG_DROP_READ_ENDPOINT, async (request, params): Promise<DragDropReadResponse> => {\n const dashboard = this.getDashboard();\n const response = await dashboard.handleDragDropReadRequest(request, params);\n return response;\n });\n this.omu.endpoints.bind(DASHBOARD_COOKIES_GET, async (request, params): Promise<UserResponse<Cookie[]>> => {\n const { url } = request;\n const { host } = new URL(url);\n const hostAccessResult = await requireHost(params, host);\n if (hostAccessResult.type !== 'ok') {\n return hostAccessResult;\n }\n return await dashboard.getCookies(request);\n });\n this.omu.endpoints.bind(DASHBOARD_HOST_REQUEST, async (request, params): Promise<UserResponse> => {\n const { host } = request;\n const result = await requireHost(params, host);\n return result;\n });\n this.omu.endpoints.bind(DASHBOARD_WEBVIEW_REQUEST, async (request, params): Promise<WebviewResponse> => {\n const url = new URL(request.url);\n const { host } = url;\n const hostAccessResult = await requireHost(params, host);\n if (hostAccessResult.type !== 'ok') {\n return hostAccessResult;\n }\n const emit = async (event: WebviewEvent) => {\n this.omu.send(DASHBOARD_WEBVIEW_EVENT_PACKET, {\n id,\n target: params.caller,\n event,\n });\n };\n const id = await dashboard.createWebview(request, params, emit);\n return {\n type: 'ok',\n value: {\n id: id.key(),\n },\n };\n });\n this.omu.endpoints.bind(DASHBOARD_WEBVIEW_CLOSE, async (request, params): Promise<WebviewResponse> => {\n const id = await dashboard.getWebview(request, params);\n if (!id) {\n return {\n type: 'cancelled',\n };\n }\n await dashboard.closeWebview(request, params);\n return {\n type: 'ok',\n value: {\n id: id.key(),\n },\n };\n });\n this.omu.endpoints.bind(DASHBOARD_SPEECH_RECOGNITION_START, async (request, params): Promise<UserResponse<undefined>> => {\n const result = await dashboard.speechRecognitionStart(request, params);\n return result;\n });\n this.omu.network.addTask(async () => {\n const response = await this.omu.endpoints.call(\n DASHBOARD_SET_ENDPOINT,\n this.omu.app.id,\n );\n if (!response.success) {\n throw new Error('Failed to set dashboard');\n }\n });\n }\n\n public requestWebview(options: WebviewRequest): PromiseResult<WebviewHandle, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<WebviewHandle, UserError>();\n this.omu.endpoints.call(\n DASHBOARD_WEBVIEW_REQUEST,\n options,\n ).then((result) => {\n if (result.type !== 'ok') {\n reject(result);\n return;\n }\n const { value } = result;\n const id = Identifier.fromKey(value.id);\n const eventListeners: WebviewEventListeners = {};\n const handle: WebviewHandle = {\n id,\n url: options.url,\n close: async () => {\n await this.omu.endpoints.call(\n DASHBOARD_WEBVIEW_CLOSE,\n { id: id.key() },\n );\n },\n getCookies: () => this.getCookies({\n url: options.url,\n }),\n on: function <T extends WebviewEvent['type']>(key: T, callback: (event: Extract<WebviewEvent, { type: T }>) => void): void {\n if (!eventListeners[key]) {\n eventListeners[key] = [];\n }\n const listeners = eventListeners[key]!;\n listeners.push(callback);\n },\n join: async () => {\n await new Promise<void>((resolve) => {\n handle.on('closed', () => resolve());\n });\n },\n };\n this.webviewHandles.set(id, {\n handle,\n emit: function <T extends WebviewEvent['type']>(event: Extract<WebviewEvent, { type: T }>): void {\n const listeners = eventListeners[event.type];\n if (!listeners) return;\n for (const listener of listeners) {\n listener(event);\n }\n },\n });\n\n resolve(handle);\n });\n return promise;\n }\n\n public getCookies(options: GetCookiesRequest): PromiseResult<CookieList, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<CookieList, UserError>();\n this.omu.endpoints.call(\n DASHBOARD_COOKIES_GET,\n options,\n ).then((response) => {\n if (response.type === 'ok') {\n resolve(CookieList.from(response.value));\n return;\n } else {\n reject(response);\n }\n });\n return promise;\n }\n\n public async openApp(app: App): Promise<void> {\n return await this.omu.endpoints.call(DASHBOARD_OPEN_APP_ENDPOINT, app);\n }\n\n public async installApp(app: App): Promise<AppInstallResponse> {\n return await this.omu.endpoints.call(DASHBOARD_APP_INSTALL_ENDPOINT, app);\n }\n\n public async clearBlockedPrompts(): Promise<null> {\n return await this.omu.endpoints.call(DASHBOARD_PROMPT_CLEAR_BLOCKED, null);\n }\n\n public async requestDragDrop(): Promise<DragDropHandler> {\n await this.omu.endpoints.call(DASHBOARD_DRAG_DROP_REQUEST_ENDPOINT, {});\n const listeners = this.dragDropListeners;\n const client = this.omu;\n this.dragDropHandler = {\n onEnter(fn) { listeners.enter.push(fn); },\n onOver(fn) { listeners.over.push(fn); },\n onDrop(fn) { listeners.drop.push(fn); },\n onLeave(fn) { listeners.leave.push(fn); },\n async read(id) { return await client.endpoints.call(DASHBOARD_DRAG_DROP_READ_ENDPOINT, { drag_id: id }); },\n };\n return this.dragDropHandler;\n }\n\n public async notifyDropDragState(packet: FileDragPacket): Promise<void> {\n this.omu.send(DASHBOARD_DRAG_DROP_STATE_PACKET, packet);\n }\n\n public requestSpeechRecognition(): PromiseResult<Registry<TranscriptStatus>, UserError> {\n const { promise, resolve, reject } = PromiseResult.create<Registry<TranscriptStatus>, UserError>();\n this.omu.endpoints.call(DASHBOARD_SPEECH_RECOGNITION_START, { type: 'start' }).then((result) => {\n if (result.type === 'ok') {\n resolve(this.speechRecognition);\n } else {\n reject(result);\n }\n });\n return promise;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["App", "Identifier", "IdentifierMap", "PacketType", "PromiseResult", "Serializer", "EndpointType", "ExtensionType", "RegistryType", "TableType", "DragDropReadResponse", "DASHBOARD_EXTENSION_TYPE", "omu", "DashboardExtension", "DASHBOARD_SET_PERMISSION_ID", "DASHBOARD_SET_ENDPOINT", "DASHBOARD_OPEN_APP_PERMISSION_ID", "DASHBOARD_OPEN_APP_ENDPOINT", "DASHBOARD_OPEN_APP_PACKET", "DASHOBARD_APP_READ_PERMISSION_ID", "DASHOBARD_APP_EDIT_PERMISSION_ID", "DASHBOARD_APP_INSTALL_PERMISSION_ID", "DASHBOARD_APP_INSTALL_ENDPOINT", "DASHBOARD_DRAG_DROP_PERMISSION_ID", "DASHBOARD_DRAG_DROP_STATE_PACKET", "DASHBOARD_DRAG_DROP_READ_ENDPOINT", "DASHBOARD_DRAG_DROP_REQUEST_ENDPOINT", "CookieList", "cookie", "DASHBOARD_WEBVIEW_PERMISSION_ID", "DASHBOARD_COOKIES_GET", "DASHBOARD_WEBVIEW_REQUEST", "DASHBOARD_WEBVIEW_CLOSE", "DASHBOARD_WEBVIEW_EVENT_PACKET", "DASHBOARD_ALLOWED_WEBVIEW_HOSTS", "entry", "DASHBOARD_HOST_REQUEST", "DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID", "DASHBOARD_SPEECH_RECOGNITION", "DASHBOARD_SPEECH_RECOGNITION_START", "DASHBOARD_PROMPT_REQUEST", "DASHBOARD_PROMPT_RESPONSE", "DASHBOARD_PROMPT_CLEAR_BLOCKED", "request", "app", "state", "fn", "packet", "handle", "dashboard", "response", "apps", "hosts", "requireHost", "params", "host", "id", "hostEntry", "url", "hostAccessResult", "emit", "event", "options", "promise", "resolve", "reject", "result", "value", "eventListeners", "key", "callback", "listeners", "listener", "client"]
|
|
7
7
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { DASHBOARD_APP_INSTALL_PERMISSION_ID, DASHBOARD_DRAG_DROP_PERMISSION_ID as DAShBOARD_DRAG_DROP_PERMISSION_ID, DASHBOARD_OPEN_APP_PERMISSION_ID, DASHBOARD_SET_PERMISSION_ID, DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID, DASHBOARD_WEBVIEW_PERMISSION_ID, DASHOBARD_APP_EDIT_PERMISSION_ID, DASHOBARD_APP_READ_PERMISSION_ID, type Cookie, type GetCookiesRequest, type HostRequest, type PortProcess, type PromptRequest, type PromptRequestAppInstall, type PromptRequestAppPermissions, type PromptRequestAppPlugins, type PromptRequestAppUpdate, type PromptRequestHttpPort, type PromptRequestIndexInstall, type PromptResult, type SpeechRecognitionStart, type TranscriptSegment, type TranscriptStatus, type UserResponse, type WebviewEvent, type WebviewPacket, type WebviewRequest, } from './extension.js';
|
|
1
|
+
export { CookieList, DASHBOARD_APP_INSTALL_PERMISSION_ID, DASHBOARD_DRAG_DROP_PERMISSION_ID as DAShBOARD_DRAG_DROP_PERMISSION_ID, DASHBOARD_OPEN_APP_PERMISSION_ID, DASHBOARD_SET_PERMISSION_ID, DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID, DASHBOARD_WEBVIEW_PERMISSION_ID, DASHOBARD_APP_EDIT_PERMISSION_ID, DASHOBARD_APP_READ_PERMISSION_ID, type Cookie, type GetCookiesRequest, type HostRequest, type PortProcess, type PromptRequest, type PromptRequestAppInstall, type PromptRequestAppPermissions, type PromptRequestAppPlugins, type PromptRequestAppUpdate, type PromptRequestHttpPort, type PromptRequestIndexInstall, type PromptResult, type SpeechRecognitionStart, type TranscriptSegment, type TranscriptStatus, type UserResponse, type WebviewEvent, type WebviewHandle, type WebviewPacket, type WebviewRequest, } from './extension.js';
|
|
2
2
|
export type { DashboardHandler } from './handler';
|
|
3
3
|
export { DragDropReadResponse, type DragDropFile, type DragDropReadRequest, type DragDropRequestDashboard, type FileData, } from './packets.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{CookieList as p,DASHBOARD_APP_INSTALL_PERMISSION_ID as D,DASHBOARD_DRAG_DROP_PERMISSION_ID as R,DASHBOARD_OPEN_APP_PERMISSION_ID as r,DASHBOARD_SET_PERMISSION_ID as o,DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID as s,DASHBOARD_WEBVIEW_PERMISSION_ID as I,DASHOBARD_APP_EDIT_PERMISSION_ID as P,DASHOBARD_APP_READ_PERMISSION_ID as S}from"./extension.js";import{DragDropReadResponse as A}from"./packets.js";export{p as CookieList,D as DASHBOARD_APP_INSTALL_PERMISSION_ID,r as DASHBOARD_OPEN_APP_PERMISSION_ID,o as DASHBOARD_SET_PERMISSION_ID,s as DASHBOARD_SPEECH_RECOGNITION_PERMISSION_ID,I as DASHBOARD_WEBVIEW_PERMISSION_ID,P as DASHOBARD_APP_EDIT_PERMISSION_ID,S as DASHOBARD_APP_READ_PERMISSION_ID,R as DAShBOARD_DRAG_DROP_PERMISSION_ID,A as DragDropReadResponse};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/dashboard/index.ts"],
|
|
4
|
-
"sourcesContent": ["export {\n DASHBOARD_APP_INSTALL_PERMISSION_ID,\n DASHBOARD_DRAG_DROP_PERMISSION_ID as 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 DASHOBARD_APP_EDIT_PERMISSION_ID,\n DASHOBARD_APP_READ_PERMISSION_ID
|
|
5
|
-
"mappings": "AAAA,OACI,
|
|
6
|
-
"names": ["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", "DASHOBARD_APP_EDIT_PERMISSION_ID", "DASHOBARD_APP_READ_PERMISSION_ID", "DragDropReadResponse"]
|
|
4
|
+
"sourcesContent": ["export {\n CookieList, DASHBOARD_APP_INSTALL_PERMISSION_ID,\n DASHBOARD_DRAG_DROP_PERMISSION_ID as 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 DASHOBARD_APP_EDIT_PERMISSION_ID,\n DASHOBARD_APP_READ_PERMISSION_ID, type Cookie,\n type GetCookiesRequest,\n type HostRequest,\n type PortProcess,\n type PromptRequest,\n type PromptRequestAppInstall,\n type PromptRequestAppPermissions,\n type PromptRequestAppPlugins,\n type PromptRequestAppUpdate,\n type PromptRequestHttpPort,\n type PromptRequestIndexInstall,\n type PromptResult,\n type SpeechRecognitionStart,\n type TranscriptSegment,\n type TranscriptStatus,\n type UserResponse,\n type WebviewEvent, type WebviewHandle, type WebviewPacket,\n type WebviewRequest,\n} from './extension.js';\nexport type { DashboardHandler } from './handler';\nexport {\n DragDropReadResponse,\n type DragDropFile,\n type DragDropReadRequest,\n type DragDropRequestDashboard,\n type FileData,\n} from './packets.js';\n\n"],
|
|
5
|
+
"mappings": "AAAA,OACI,cAAAA,EAAY,uCAAAC,EACyB,qCAArCC,EACA,oCAAAC,EACA,+BAAAC,EACA,8CAAAC,EACA,mCAAAC,EACA,oCAAAC,EACA,oCAAAC,MAkBG,iBAEP,OACI,wBAAAC,MAKG",
|
|
6
|
+
"names": ["CookieList", "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", "DASHOBARD_APP_EDIT_PERMISSION_ID", "DASHOBARD_APP_READ_PERMISSION_ID", "DragDropReadResponse"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{EventEmitter as v}from"../../event";import{Identifier as T,IdentifierMap as w}from"../../identifier";import{Lock as k}from"../../lock.js";import{PacketType as y}from"../../network/packet";import{Serializer as P}from"../../serialize";import{EndpointType as x}from"../endpoint/endpoint.js";import{ExtensionType as z}from"../extension.js";import{RegisterPacket as b,RegistryPacket as f}from"./packets.js";import{RegistryType as g}from"./registry.js";class S{constructor(e){this.omu=e;e.network.registerPacket(E,h,p)}type=a;registries=new w;createRegistry(e){if(this.registries.has(e.id))throw new Error(`Registry with identifier '${e.id}' already exists`);return new I(this.omu,e)}get(e){const i=e.id;let t=this.registries.get(i);return t===void 0&&(t=this.createRegistry(e),this.registries.set(i,t)),t}json(e,i){const t=g.createJson(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}serialized(e,i){const t=g.createSerialized(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}}class I{constructor(e,i){this.omu=e;this.type=i;this.value=i.defaultValue,e.network.addPacketHandler(h,t=>this.handleUpdate(t)),e.network.addTask(()=>this.onTask())}eventEmitter=new v;lock=new k;listening=!1;value;async#t(){const e=await this.omu.endpoints.call(O,this.type.id);return e.value===null?this.type.defaultValue:this.type.serializer.deserialize(e.value)}async#e(e){this.omu.send(h,{id:this.type.id,value:this.type.serializer.serialize(e)})}async get(){const e=await this.lock.use(async()=>this.#t());return this.eventEmitter.emit(e),e}async set(e){await this.lock.use(async()=>this.#e(e)),this.eventEmitter.emit(e)}async update(e){const i=await this.lock.use(async()=>{const t=await this.#t(),r=await e(t);return await this.#e(r),r});return this.eventEmitter.emit(i),i}async modify(e){const i=await this.lock.use(async()=>{const t=await this.#t();return await e(t),await this.#e(t),t});return this.eventEmitter.emit(i),i}listen(e){return!this.listening&&this.omu.ready&&this.omu.send(p,this.type.id),this.listening=!0,this.eventEmitter.listen(e)}handleUpdate(e){e.id.isEqual(this.type.id)&&(e.value!==null&&(this.value=this.type.serializer.deserialize(e.value)),this.eventEmitter.emit(this.value))}onTask(){this.listening&&this.omu.send(p,this.type.id),this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(E,{id:this.type.id,permissions:this.type.permissions})}compatSvelte(){let e=!1;const i={changed:!1,markChanged:()=>{i.changed=!0,this.#e(this.value),r(this.value)}},t=new Set,r=n=>{e=!0,m(n)},o=this.listen(r),m=n=>{this.value=n;const l=c(n,i);t.forEach(d=>d(l))};return{set:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);n?.[u]&&!i.changed||(this.#e(n),m(n),i.changed=!1)},subscribe:n=>(t.add(n),n(c(this.value,i)),()=>{t.delete(n),t.size===0&&o?.()}),update:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);this.update(n)},wait:()=>e?Promise.resolve(this.value):new Promise(n=>{const l=this.listen(d=>{l?.(),n(d)})})}}}const u=Symbol("ProxiedRegistry");function R(s,e){if(s===e)return!0;if(typeof s!="object"||typeof e!="object"||s===null||e===null)return!1;const i=Object.keys(s),t=Object.keys(e);if(i.length!==t.length)return!1;for(const r of i)if(!t.includes(r)||!R(s[r],e[r]))return!1;return!0}function c(s,e){if(typeof s!="object"||s===null||u in s)return s;let i=!1;return new Proxy(s,{set(t,r,o){return i=!R(t[r],o),i&&(t[r]=o,e.markChanged()),!0},get(t,r){return r===u?s:c(t[r],e)},has(t,r){return r===u?!0:r in t},deleteProperty(t,r){return r in t?(delete t[r],e.markChanged(),!0):!1}})}const a=new z("registry",s=>new S(s)),_=a.join("permission"),E=y.createJson(a,{name:"register",serializer:b}),h=y.createSerialized(a,{name:"update",serializer:f}),p=y.createJson(a,{name:"listen",serializer:T}),O=x.createSerialized(a,{name:"get",requestSerializer:P.of(T).toJson(),responseSerializer:f,permissionId:_});export{a as REGISTRY_EXTENSION_TYPE,_ as REGISTRY_PERMISSION_ID,S as RegistryExtension};
|
|
1
|
+
import{EventEmitter as v}from"../../event";import{Identifier as T,IdentifierMap as w}from"../../identifier";import{Lock as k}from"../../lock.js";import{PacketType as y}from"../../network/packet";import{Serializer as P}from"../../serialize";import{EndpointType as x}from"../endpoint/endpoint.js";import{ExtensionType as z}from"../extension.js";import{RegisterPacket as b,RegistryPacket as f}from"./packets.js";import{RegistryType as g}from"./registry.js";class S{constructor(e){this.omu=e;e.network.registerPacket(E,h,p)}type=a;registries=new w;createRegistry(e){if(this.registries.has(e.id))throw new Error(`Registry with identifier '${e.id}' already exists`);return new I(this.omu,e)}get(e){const i=e.id;let t=this.registries.get(i);return t===void 0&&(t=this.createRegistry(e),this.registries.set(i,t)),t}json(e,i){const t=g.createJson(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}serialized(e,i){const t=g.createSerialized(this.omu.app.id.base,{name:e,defaultValue:i.default,serializer:i.serializer});if(this.registries.has(t.id))throw new Error(`Registry with name '${e}' already exists`);return this.createRegistry(t)}}class I{constructor(e,i){this.omu=e;this.type=i;this.value=i.defaultValue,e.network.addPacketHandler(h,t=>this.handleUpdate(t)),e.network.addTask(()=>this.onTask()),e.running&&this.onTask()}eventEmitter=new v;lock=new k;listening=!1;value;async#t(){const e=await this.omu.endpoints.call(O,this.type.id);return e.value===null?this.type.defaultValue:this.type.serializer.deserialize(e.value)}async#e(e){this.omu.send(h,{id:this.type.id,value:this.type.serializer.serialize(e)})}async get(){const e=await this.lock.use(async()=>this.#t());return this.eventEmitter.emit(e),e}async set(e){await this.lock.use(async()=>this.#e(e)),this.eventEmitter.emit(e)}async update(e){const i=await this.lock.use(async()=>{const t=await this.#t(),r=await e(t);return await this.#e(r),r});return this.eventEmitter.emit(i),i}async modify(e){const i=await this.lock.use(async()=>{const t=await this.#t();return await e(t),await this.#e(t),t});return this.eventEmitter.emit(i),i}listen(e){return!this.listening&&this.omu.ready&&this.omu.send(p,this.type.id),this.listening=!0,this.eventEmitter.listen(e)}handleUpdate(e){e.id.isEqual(this.type.id)&&(e.value!==null&&(this.value=this.type.serializer.deserialize(e.value)),this.eventEmitter.emit(this.value))}onTask(){this.listening&&this.omu.send(p,this.type.id),this.type.id.isSubpathOf(this.omu.app.id)&&this.omu.send(E,{id:this.type.id,permissions:this.type.permissions})}compatSvelte(){let e=!1;const i={changed:!1,markChanged:()=>{i.changed=!0,this.#e(this.value),r(this.value)}},t=new Set,r=n=>{e=!0,m(n)},o=this.listen(r),m=n=>{this.value=n;const l=c(n,i);t.forEach(d=>d(l))};return{set:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);n?.[u]&&!i.changed||(this.#e(n),m(n),i.changed=!1)},subscribe:n=>(t.add(n),n(c(this.value,i)),()=>{t.delete(n),t.size===0&&o?.()}),update:n=>{if(!e)throw new Error(`Registry ${this.type.id.key()} is not ready`);this.update(n)},wait:()=>e?Promise.resolve(this.value):new Promise(n=>{const l=this.listen(d=>{l?.(),n(d)})})}}}const u=Symbol("ProxiedRegistry");function R(s,e){if(s===e)return!0;if(typeof s!="object"||typeof e!="object"||s===null||e===null)return!1;const i=Object.keys(s),t=Object.keys(e);if(i.length!==t.length)return!1;for(const r of i)if(!t.includes(r)||!R(s[r],e[r]))return!1;return!0}function c(s,e){if(typeof s!="object"||s===null||u in s)return s;let i=!1;return new Proxy(s,{set(t,r,o){return i=!R(t[r],o),i&&(t[r]=o,e.markChanged()),!0},get(t,r){return r===u?s:c(t[r],e)},has(t,r){return r===u?!0:r in t},deleteProperty(t,r){return r in t?(delete t[r],e.markChanged(),!0):!1}})}const a=new z("registry",s=>new S(s)),_=a.join("permission"),E=y.createJson(a,{name:"register",serializer:b}),h=y.createSerialized(a,{name:"update",serializer:f}),p=y.createJson(a,{name:"listen",serializer:T}),O=x.createSerialized(a,{name:"get",requestSerializer:P.of(T).toJson(),responseSerializer:f,permissionId:_});export{a as REGISTRY_EXTENSION_TYPE,_ as REGISTRY_PERMISSION_ID,S as RegistryExtension};
|
|
2
2
|
//# sourceMappingURL=extension.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/registry/extension.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventEmitter } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { Lock } from '../../lock.js';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { JsonType, Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { type Extension, ExtensionType } from '../extension.js';\n\nimport { RegisterPacket, RegistryPacket } from './packets.js';\nimport { type Registry, RegistryType, Writable } from './registry.js';\n\nexport class RegistryExtension implements Extension {\n public readonly type: ExtensionType<RegistryExtension> = REGISTRY_EXTENSION_TYPE;\n private readonly registries = new IdentifierMap<Registry<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n REGISTRY_REGISTER_PACKET,\n REGISTRY_UPDATE_PACKET,\n REGISTRY_LISTEN_PACKET,\n );\n }\n\n private createRegistry<T>(registryType: RegistryType<T>): Registry<T> {\n if (this.registries.has(registryType.id)) {\n throw new Error(`Registry with identifier '${registryType.id}' already exists`);\n }\n return new RegistryImpl(this.omu, registryType);\n }\n\n public get<T>(registryType: RegistryType<T>): Registry<T> {\n const identifier = registryType.id;\n let registry = this.registries.get(identifier);\n if (registry === undefined) {\n registry = this.createRegistry(registryType);\n this.registries.set(identifier, registry);\n }\n return registry as Registry<T>;\n }\n\n public json<T, D extends JsonType = T extends JsonType ? T : JsonType>(name: string, options: { default: T; serializer?: Serializer<T, D> }): Registry<T> {\n const tableType = RegistryType.createJson<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n\n public serialized<T>(name: string, options: { default: T; serializer: Serializer<T, Uint8Array> }): Registry<T> {\n const tableType = RegistryType.createSerialized<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n}\n\nclass RegistryImpl<T> implements Registry<T> {\n private readonly eventEmitter: EventEmitter<[T]> = new EventEmitter();\n private readonly lock: Lock = new Lock();\n private listening = false;\n public value: T;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: RegistryType<T>,\n ) {\n this.value = type.defaultValue;\n omu.network.addPacketHandler(REGISTRY_UPDATE_PACKET, (packet) =>\n this.handleUpdate(packet),\n );\n omu.network.addTask(() => this.onTask());\n }\n\n async #get(): Promise<T> {\n const result = await this.omu.endpoints.call(REGISTRY_GET_ENDPOINT, this.type.id);\n if (result.value === null) {\n return this.type.defaultValue;\n }\n return this.type.serializer.deserialize(result.value);\n }\n\n async #set(value: T): Promise<void> {\n this.omu.send(REGISTRY_UPDATE_PACKET, {\n id: this.type.id,\n value: this.type.serializer.serialize(value),\n });\n }\n\n public async get(): Promise<T> {\n const value = await this.lock.use(async () => this.#get());\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async set(value: T): Promise<void> {\n await this.lock.use(async () => this.#set(value));\n this.eventEmitter.emit(value);\n }\n\n public async update(fn: (value: T) => PromiseLike<T> | T): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n const newValue = await fn(value);\n await this.#set(newValue);\n return newValue;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async modify(fn: (value: T) => PromiseLike<void> | void): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n await fn(value);\n await this.#set(value);\n return value;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public listen(handler: (value: T) => Promise<void> | void): Unlisten {\n if (!this.listening && this.omu.ready) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n this.listening = true;\n return this.eventEmitter.listen(handler);\n }\n\n private handleUpdate(data: RegistryPacket): void {\n if (!data.id.isEqual(this.type.id)) {\n return;\n }\n if (data.value !== null) {\n this.value = this.type.serializer.deserialize(data.value);\n }\n this.eventEmitter.emit(this.value);\n }\n\n private onTask(): void {\n if (this.listening) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n if (!this.type.id.isSubpathOf(this.omu.app.id)) {\n return;\n }\n this.omu.send(REGISTRY_REGISTER_PACKET, {\n id: this.type.id,\n permissions: this.type.permissions,\n });\n }\n\n public compatSvelte(): Writable<T> {\n let isReady = false;\n const context = {\n changed: false,\n markChanged: () => {\n context.changed = true;\n this.#set(this.value);\n handle(this.value);\n },\n };\n const listeners = new Set<(value: T) => void>();\n\n const handle = (newValue: T) => {\n isReady = true;\n emit(newValue);\n };\n\n const unsubscribe = this.listen(handle);\n\n const emit = (value: T) => {\n this.value = value;\n const proxied = proxy(value, context);\n listeners.forEach(listener => listener(proxied));\n };\n\n return {\n set: (value: T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n const proxied = value?.[PROXIED_SYMBOL];\n if (proxied && !context.changed) return;\n this.#set(value);\n emit(value);\n context.changed = false;\n },\n subscribe: (run: (value: T) => void) => {\n listeners.add(run);\n run(proxy(this.value, context));\n\n return () => {\n listeners.delete(run);\n if (listeners.size === 0) {\n unsubscribe?.();\n }\n };\n },\n update: (fn: (value: T) => T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n this.update(fn);\n },\n wait: (): Promise<T> => {\n return isReady\n ? Promise.resolve(this.value)\n : new Promise(resolve => {\n const unsubscribe = this.listen((value: T) => {\n unsubscribe?.();\n resolve(value);\n });\n });\n },\n };\n }\n}\n\nconst PROXIED_SYMBOL = Symbol('ProxiedRegistry');\n\nfunction deepEqual(objA, objB) {\n if (objA === objB) return true; // Check for referential equality and primitive values\n\n if (\n typeof objA !== 'object' ||\n typeof objB !== 'object' ||\n objA === null ||\n objB === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false; // Different number of properties\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !deepEqual(objA[key], objB[key])) {\n return false; // Property missing or values are not deeply equal\n }\n }\n\n return true; // All properties and their values are deeply equal\n}\n\ntype ProxyContext = {\n changed: boolean;\n markChanged: () => void;\n};\n\nfunction proxy<T>(\n value: T,\n context: ProxyContext,\n) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (PROXIED_SYMBOL in value) {\n return value;\n }\n let changed = false;\n return new Proxy(value, {\n set(target, prop, value) {\n changed = !deepEqual(target[prop], value);\n if (!changed) return true;\n target[prop] = value;\n context.markChanged();\n return true;\n },\n get(target, prop) {\n if (prop === PROXIED_SYMBOL) {\n return value;\n }\n return proxy(target[prop], context);\n },\n has(target, p) {\n if (p === PROXIED_SYMBOL) return true;\n return p in target;\n },\n deleteProperty(target, prop) {\n if (!(prop in target)) return false;\n delete target[prop];\n context.markChanged();\n return true;\n },\n });\n}\n\nexport const REGISTRY_EXTENSION_TYPE: ExtensionType<RegistryExtension> = new ExtensionType(\n 'registry',\n (omu: Omu) => new RegistryExtension(omu),\n);\nexport const REGISTRY_PERMISSION_ID: Identifier = REGISTRY_EXTENSION_TYPE.join('permission');\nconst REGISTRY_REGISTER_PACKET = PacketType.createJson<RegisterPacket>(REGISTRY_EXTENSION_TYPE, {\n name: 'register',\n serializer: RegisterPacket,\n});\nconst REGISTRY_UPDATE_PACKET = PacketType.createSerialized<RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'update',\n serializer: RegistryPacket,\n },\n);\nconst REGISTRY_LISTEN_PACKET = PacketType.createJson<Identifier>(REGISTRY_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst REGISTRY_GET_ENDPOINT = EndpointType.createSerialized<Identifier, RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'get',\n requestSerializer: Serializer.of(Identifier).toJson(),\n responseSerializer: RegistryPacket,\n permissionId: REGISTRY_PERMISSION_ID,\n },\n);\n"],
|
|
5
|
-
"mappings": "AACA,OAAS,gBAAAA,MAAoB,cAC7B,OAAS,cAAAC,EAAY,iBAAAC,MAAqB,mBAC1C,OAAS,QAAAC,MAAY,gBACrB,OAAS,cAAAC,MAAkB,uBAE3B,OAAmB,cAAAC,MAAkB,kBACrC,OAAS,gBAAAC,MAAoB,0BAC7B,OAAyB,iBAAAC,MAAqB,kBAE9C,OAAS,kBAAAC,EAAgB,kBAAAC,MAAsB,eAC/C,OAAwB,gBAAAC,MAA8B,gBAE/C,MAAMC,CAAuC,CAIhD,YAA6BC,EAAU,CAAV,SAAAA,EACzBA,EAAI,QAAQ,eACRC,EACAC,EACAC,CACJ,CACJ,CATgB,KAAyCC,EACxC,WAAa,IAAId,EAU1B,eAAkBe,EAA4C,CAClE,GAAI,KAAK,WAAW,IAAIA,EAAa,EAAE,EACnC,MAAM,IAAI,MAAM,6BAA6BA,EAAa,EAAE,kBAAkB,EAElF,OAAO,IAAIC,EAAa,KAAK,IAAKD,CAAY,CAClD,CAEO,IAAOA,EAA4C,CACtD,MAAME,EAAaF,EAAa,GAChC,IAAIG,EAAW,KAAK,WAAW,IAAID,CAAU,EAC7C,OAAIC,IAAa,SACbA,EAAW,KAAK,eAAeH,CAAY,EAC3C,KAAK,WAAW,IAAIE,EAAYC,CAAQ,GAErCA,CACX,CAEO,KAAgEC,EAAcC,EAAqE,CACtJ,MAAMC,EAAYb,EAAa,WAAc,KAAK,IAAI,IAAI,GAAG,KAAM,CAC/D,KAAAW,EACA,aAAcC,EAAQ,QACtB,WAAYA,EAAQ,UACxB,CAAC,EACD,GAAI,KAAK,WAAW,IAAIC,EAAU,EAAE,EAChC,MAAM,IAAI,MAAM,uBAAuBF,CAAI,kBAAkB,EAEjE,OAAO,KAAK,eAAeE,CAAS,CACxC,CAEO,WAAcF,EAAcC,EAA6E,CAC5G,MAAMC,EAAYb,EAAa,iBAAoB,KAAK,IAAI,IAAI,GAAG,KAAM,CACrE,KAAAW,EACA,aAAcC,EAAQ,QACtB,WAAYA,EAAQ,UACxB,CAAC,EACD,GAAI,KAAK,WAAW,IAAIC,EAAU,EAAE,EAChC,MAAM,IAAI,MAAM,uBAAuBF,CAAI,kBAAkB,EAEjE,OAAO,KAAK,eAAeE,CAAS,CACxC,CACJ,CAEA,MAAML,CAAuC,CAMzC,YACqBN,EACDY,EAClB,CAFmB,SAAAZ,EACD,UAAAY,EAEhB,KAAK,MAAQA,EAAK,aAClBZ,EAAI,QAAQ,iBAAiBE,EAAyBW,GAClD,KAAK,aAAaA,CAAM,CAC5B,EACAb,EAAI,QAAQ,QAAQ,IAAM,KAAK,OAAO,CAAC,
|
|
4
|
+
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventEmitter } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { Lock } from '../../lock.js';\nimport { PacketType } from '../../network/packet';\nimport { Omu } from '../../omu';\nimport { JsonType, Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport { type Extension, ExtensionType } from '../extension.js';\n\nimport { RegisterPacket, RegistryPacket } from './packets.js';\nimport { type Registry, RegistryType, Writable } from './registry.js';\n\nexport class RegistryExtension implements Extension {\n public readonly type: ExtensionType<RegistryExtension> = REGISTRY_EXTENSION_TYPE;\n private readonly registries = new IdentifierMap<Registry<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n REGISTRY_REGISTER_PACKET,\n REGISTRY_UPDATE_PACKET,\n REGISTRY_LISTEN_PACKET,\n );\n }\n\n private createRegistry<T>(registryType: RegistryType<T>): Registry<T> {\n if (this.registries.has(registryType.id)) {\n throw new Error(`Registry with identifier '${registryType.id}' already exists`);\n }\n return new RegistryImpl(this.omu, registryType);\n }\n\n public get<T>(registryType: RegistryType<T>): Registry<T> {\n const identifier = registryType.id;\n let registry = this.registries.get(identifier);\n if (registry === undefined) {\n registry = this.createRegistry(registryType);\n this.registries.set(identifier, registry);\n }\n return registry as Registry<T>;\n }\n\n public json<T, D extends JsonType = T extends JsonType ? T : JsonType>(name: string, options: { default: T; serializer?: Serializer<T, D> }): Registry<T> {\n const tableType = RegistryType.createJson<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n\n public serialized<T>(name: string, options: { default: T; serializer: Serializer<T, Uint8Array> }): Registry<T> {\n const tableType = RegistryType.createSerialized<T>(this.omu.app.id.base, {\n name,\n defaultValue: options.default,\n serializer: options.serializer,\n });\n if (this.registries.has(tableType.id)) {\n throw new Error(`Registry with name '${name}' already exists`);\n }\n return this.createRegistry(tableType);\n }\n}\n\nclass RegistryImpl<T> implements Registry<T> {\n private readonly eventEmitter: EventEmitter<[T]> = new EventEmitter();\n private readonly lock: Lock = new Lock();\n private listening = false;\n public value: T;\n\n constructor(\n private readonly omu: Omu,\n public readonly type: RegistryType<T>,\n ) {\n this.value = type.defaultValue;\n omu.network.addPacketHandler(REGISTRY_UPDATE_PACKET, (packet) =>\n this.handleUpdate(packet),\n );\n omu.network.addTask(() => this.onTask());\n if (omu.running) {\n this.onTask();\n }\n }\n\n async #get(): Promise<T> {\n const result = await this.omu.endpoints.call(REGISTRY_GET_ENDPOINT, this.type.id);\n if (result.value === null) {\n return this.type.defaultValue;\n }\n return this.type.serializer.deserialize(result.value);\n }\n\n async #set(value: T): Promise<void> {\n this.omu.send(REGISTRY_UPDATE_PACKET, {\n id: this.type.id,\n value: this.type.serializer.serialize(value),\n });\n }\n\n public async get(): Promise<T> {\n const value = await this.lock.use(async () => this.#get());\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async set(value: T): Promise<void> {\n await this.lock.use(async () => this.#set(value));\n this.eventEmitter.emit(value);\n }\n\n public async update(fn: (value: T) => PromiseLike<T> | T): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n const newValue = await fn(value);\n await this.#set(newValue);\n return newValue;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public async modify(fn: (value: T) => PromiseLike<void> | void): Promise<T> {\n const value = await this.lock.use(async () => {\n const value = await this.#get();\n await fn(value);\n await this.#set(value);\n return value;\n });\n this.eventEmitter.emit(value);\n return value;\n }\n\n public listen(handler: (value: T) => Promise<void> | void): Unlisten {\n if (!this.listening && this.omu.ready) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n this.listening = true;\n return this.eventEmitter.listen(handler);\n }\n\n private handleUpdate(data: RegistryPacket): void {\n if (!data.id.isEqual(this.type.id)) {\n return;\n }\n if (data.value !== null) {\n this.value = this.type.serializer.deserialize(data.value);\n }\n this.eventEmitter.emit(this.value);\n }\n\n private onTask(): void {\n if (this.listening) {\n this.omu.send(REGISTRY_LISTEN_PACKET, this.type.id);\n }\n if (!this.type.id.isSubpathOf(this.omu.app.id)) {\n return;\n }\n this.omu.send(REGISTRY_REGISTER_PACKET, {\n id: this.type.id,\n permissions: this.type.permissions,\n });\n }\n\n public compatSvelte(): Writable<T> {\n let isReady = false;\n const context = {\n changed: false,\n markChanged: () => {\n context.changed = true;\n this.#set(this.value);\n handle(this.value);\n },\n };\n const listeners = new Set<(value: T) => void>();\n\n const handle = (newValue: T) => {\n isReady = true;\n emit(newValue);\n };\n\n const unsubscribe = this.listen(handle);\n\n const emit = (value: T) => {\n this.value = value;\n const proxied = proxy(value, context);\n listeners.forEach(listener => listener(proxied));\n };\n\n return {\n set: (value: T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n const proxied = value?.[PROXIED_SYMBOL];\n if (proxied && !context.changed) return;\n this.#set(value);\n emit(value);\n context.changed = false;\n },\n subscribe: (run: (value: T) => void) => {\n listeners.add(run);\n run(proxy(this.value, context));\n\n return () => {\n listeners.delete(run);\n if (listeners.size === 0) {\n unsubscribe?.();\n }\n };\n },\n update: (fn: (value: T) => T) => {\n if (!isReady) {\n throw new Error(`Registry ${this.type.id.key()} is not ready`);\n }\n this.update(fn);\n },\n wait: (): Promise<T> => {\n return isReady\n ? Promise.resolve(this.value)\n : new Promise(resolve => {\n const unsubscribe = this.listen((value: T) => {\n unsubscribe?.();\n resolve(value);\n });\n });\n },\n };\n }\n}\n\nconst PROXIED_SYMBOL = Symbol('ProxiedRegistry');\n\nfunction deepEqual(objA, objB) {\n if (objA === objB) return true; // Check for referential equality and primitive values\n\n if (\n typeof objA !== 'object' ||\n typeof objB !== 'object' ||\n objA === null ||\n objB === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false; // Different number of properties\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !deepEqual(objA[key], objB[key])) {\n return false; // Property missing or values are not deeply equal\n }\n }\n\n return true; // All properties and their values are deeply equal\n}\n\ntype ProxyContext = {\n changed: boolean;\n markChanged: () => void;\n};\n\nfunction proxy<T>(\n value: T,\n context: ProxyContext,\n) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (PROXIED_SYMBOL in value) {\n return value;\n }\n let changed = false;\n return new Proxy(value, {\n set(target, prop, value) {\n changed = !deepEqual(target[prop], value);\n if (!changed) return true;\n target[prop] = value;\n context.markChanged();\n return true;\n },\n get(target, prop) {\n if (prop === PROXIED_SYMBOL) {\n return value;\n }\n return proxy(target[prop], context);\n },\n has(target, p) {\n if (p === PROXIED_SYMBOL) return true;\n return p in target;\n },\n deleteProperty(target, prop) {\n if (!(prop in target)) return false;\n delete target[prop];\n context.markChanged();\n return true;\n },\n });\n}\n\nexport const REGISTRY_EXTENSION_TYPE: ExtensionType<RegistryExtension> = new ExtensionType(\n 'registry',\n (omu: Omu) => new RegistryExtension(omu),\n);\nexport const REGISTRY_PERMISSION_ID: Identifier = REGISTRY_EXTENSION_TYPE.join('permission');\nconst REGISTRY_REGISTER_PACKET = PacketType.createJson<RegisterPacket>(REGISTRY_EXTENSION_TYPE, {\n name: 'register',\n serializer: RegisterPacket,\n});\nconst REGISTRY_UPDATE_PACKET = PacketType.createSerialized<RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'update',\n serializer: RegistryPacket,\n },\n);\nconst REGISTRY_LISTEN_PACKET = PacketType.createJson<Identifier>(REGISTRY_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst REGISTRY_GET_ENDPOINT = EndpointType.createSerialized<Identifier, RegistryPacket>(\n REGISTRY_EXTENSION_TYPE,\n {\n name: 'get',\n requestSerializer: Serializer.of(Identifier).toJson(),\n responseSerializer: RegistryPacket,\n permissionId: REGISTRY_PERMISSION_ID,\n },\n);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["EventEmitter", "Identifier", "IdentifierMap", "Lock", "PacketType", "Serializer", "EndpointType", "ExtensionType", "RegisterPacket", "RegistryPacket", "RegistryType", "RegistryExtension", "omu", "REGISTRY_REGISTER_PACKET", "REGISTRY_UPDATE_PACKET", "REGISTRY_LISTEN_PACKET", "REGISTRY_EXTENSION_TYPE", "registryType", "RegistryImpl", "identifier", "registry", "name", "options", "tableType", "type", "packet", "#get", "result", "REGISTRY_GET_ENDPOINT", "#set", "value", "fn", "newValue", "handler", "data", "isReady", "context", "handle", "listeners", "emit", "unsubscribe", "proxied", "proxy", "listener", "PROXIED_SYMBOL", "run", "resolve", "deepEqual", "objA", "objB", "keysA", "keysB", "key", "changed", "target", "prop", "p", "REGISTRY_PERMISSION_ID"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{EventEmitter as m}from"../../event";import{Identifier as
|
|
1
|
+
import{EventEmitter as m}from"../../event";import{Identifier as g,IdentifierMap as x}from"../../identifier";import{PacketType as o}from"../../network/packet/packet.js";import{Serializer as h}from"../../serialize";import{EndpointType as l}from"../endpoint/endpoint.js";import{ExtensionType as C}from"../extension.js";import{SetConfigPacket as L,SetPermissionPacket as N,TableFetchPacket as I,TableFetchRangePacket as O,TableItemsPacket as d,TableKeysPacket as p,TablePacket as u,TableProxyPacket as B}from"./packets.js";import{TableType as _}from"./table.js";const r=new C("table",T=>new H(T)),c=r.join("permission"),R=o.createSerialized(r,{name:"set_permission",serializer:N}),S=o.createSerialized(r,{name:"set_config",serializer:L}),k=o.createJson(r,{name:"listen",serializer:g}),v=o.createJson(r,{name:"proxy_listen",serializer:g}),b=o.createSerialized(r,{name:"proxy",serializer:B}),f=o.createSerialized(r,{name:"item_add",serializer:d}),E=o.createSerialized(r,{name:"item_update",serializer:d}),z=o.createSerialized(r,{name:"item_remove",serializer:d}),M=l.createSerialized(r,{name:"item_get",requestSerializer:p,responseSerializer:d,permissionId:c}),A=l.createSerialized(r,{name:"item_has",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),j=l.createSerialized(r,{name:"item_has_all",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),K=l.createSerialized(r,{name:"item_has_any",requestSerializer:p,responseSerializer:h.json(),permissionId:c}),q=l.createSerialized(r,{name:"fetch",requestSerializer:I,responseSerializer:d,permissionId:c}),D=l.createSerialized(r,{name:"fetch_range",requestSerializer:O,responseSerializer:d,permissionId:c}),U=l.createSerialized(r,{name:"fetch_all",requestSerializer:u,responseSerializer:d,permissionId:c}),F=l.createSerialized(r,{name:"size",requestSerializer:u,responseSerializer:h.json(),permissionId:c}),P=o.createSerialized(r,{name:"clear",serializer:u});class H{constructor(e){this.omu=e;e.network.registerPacket(R,S,k,v,b,f,E,z,P)}type=r;tableMap=new x;createTable(e){this.omu.permissions.require(c);const i=this.tableMap.get(e.id);if(i)return i;const t=new J(this.omu,e);return this.tableMap.set(e.id,t),t}json(e,i){const t=new _(this.omu.app.id.base.join(e),h.pipe(i.serializer??h.noop(),h.json()),i.key);return this.createTable(t)}serialized(e,i){const t=new _(this.omu.app.id.base.join(e),i.serializer,i.key);return this.createTable(t)}get(e){return this.has(e.id)?this.tableMap.get(e.id):this.createTable(e)}has(e){return this.tableMap.has(e)}}class J{constructor(e,i){this.omu=e;this.id=i.id,this.serializer=i.serializer,this.keyFunction=i.keyFunction,this.cache=new Map,this.event={add:new m,update:new m,remove:new m,clear:new m,cacheUpdate:new m},this.promiseMap=new Map,this.proxies=[],this.listening=!1,e.network.addPacketHandler(b,t=>{if(!t.id.isEqual(this.id))return;let s=this.deserializeItems(t.items);this.proxies.forEach(a=>{s=new Map([...s.entries()].map(([n,w])=>{const y=a(w);if(y!==void 0)return[n,y]}).filter(n=>typeof n<"u"))}),e.send(b,{id:this.id,key:t.key,items:Object.fromEntries([...s.entries()].map(([a,n])=>[a,this.serializer.serialize(n)]))})}),e.network.addPacketHandler(f,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.event.add.emit(s)}),e.network.addPacketHandler(E,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);this.updateCache(s),this.event.update.emit(s)}),e.network.addPacketHandler(z,t=>{if(!t.id.isEqual(this.id))return;const s=this.deserializeItems(t.items);s.forEach((a,n)=>{this.cache.delete(n)}),this.event.remove.emit(s),this.event.cacheUpdate.emit(this.cache)}),e.network.addPacketHandler(P,t=>{t.id.isEqual(this.id)&&(this.cache=new Map,this.event.clear.emit(),this.event.cacheUpdate.emit(this.cache))}),e.event.ready.listen(()=>this.onReady())}cache;event;promiseMap;proxies;id;serializer;keyFunction;listening;cacheSize;config;permissions;updateCache(e){if(!this.cacheSize)this.cache=e;else{const i=new Map([...this.cache,...e].slice(-this.cacheSize));this.cache=i}this.event.cacheUpdate.emit(this.cache)}listen(e){return this.listening||(this.omu.onReady(()=>{this.omu.send(k,this.id)}),this.listening=!0),e?this.event.cacheUpdate.listen(e):()=>{}}proxy(e){if(this.proxies.length===0){let i=()=>{};i=this.omu.onReady(()=>{if(this.proxies.length===0){i();return}this.omu.send(v,this.id)})}return this.proxies.push(e),()=>{this.proxies.splice(this.proxies.indexOf(e),1)}}onReady(){this.config&&this.omu.send(S,{id:this.id,config:this.config})}async get(e){if(this.cache.has(e))return this.cache.get(e);if(this.promiseMap.has(e))return await this.promiseMap.get(e);const i=this.omu.endpoints.call(M,{id:this.id,keys:[e]}).then(t=>{const s=this.deserializeItems(t.items);return this.updateCache(s),this.cache.get(e)});return this.promiseMap.set(e,i),await i.then(t=>(this.promiseMap.delete(e),t))}async getMany(...e){const i=e.filter(a=>!this.cache.has(a)).filter(a=>!this.promiseMap.has(a));if(i.length===0)return new Map([...this.cache].filter(([a])=>e.includes(a)));const t=this.omu.endpoints.call(M,{id:this.id,keys:i}).then(a=>{const n=this.deserializeItems(a.items);return this.updateCache(n),n});for(const a of i)this.promiseMap.set(a,t.then(n=>n.get(a)));const s=await t;for(const a of i)this.promiseMap.delete(a);return new Map([...this.cache,...s].filter(([a])=>e.includes(a)))}async add(...e){const i=this.serializeItems(e);this.omu.send(f,{id:this.id,items:i})}async update(...e){const i=this.serializeItems(e);this.omu.send(E,{id:this.id,items:i})}async remove(...e){const i=this.serializeItems(e),t=Object.keys(i);this.cache=new Map([...this.cache].filter(([s])=>!t.includes(s))),this.omu.send(z,{id:this.id,items:i})}async clear(){this.omu.send(P,{id:this.id})}async has(e){return this.cache.has(e)?!0:(await this.omu.endpoints.call(A,{id:this.id,keys:[e]}))[e]??!1}async hasMany(...e){return await this.omu.endpoints.call(A,{id:this.id,keys:e})}async hasAll(...e){return await this.omu.endpoints.call(j,{id:this.id,keys:e})}async hasAny(...e){return await this.omu.endpoints.call(K,{id:this.id,keys:e})}async fetchItems({limit:e,backward:i,cursor:t}){const s=await this.omu.endpoints.call(q,new I(this.id,e,i,t)),a=this.deserializeItems(s.items);return this.updateCache(a),a}async fetchRange({start:e,end:i}){const t=await this.omu.endpoints.call(D,{id:this.id,start:e,end:i}),s=this.deserializeItems(t.items);return this.updateCache(s),s}async fetchAll(){const e=await this.omu.endpoints.call(U,{id:this.id}),i=this.deserializeItems(e.items);return this.updateCache(i),i}async*iterate({backward:e,cursor:i}){for(;;){const t=await this.fetchItems({limit:this.cacheSize??100,backward:e,cursor:i});if(t.size===0)break;yield*t.values(),i!==void 0&&t.delete(i);const s=e?t.values().next().value:[...t.values()].pop();if(!s)break;i=this.keyFunction(s)}}async size(){return await this.omu.endpoints.call(F,{id:this.id})}deserializeItems(e){return new Map(Object.entries(e).map(([i,t])=>{const s=this.serializer.deserialize(t);return this.cache.set(i,s),[i,s]}))}serializeItems(e){return Object.fromEntries(e.map(i=>[this.keyFunction(i),this.serializer.serialize(i)]))}setCacheSize(e){this.cacheSize=e}setConfig(e){if(this.omu.running)throw new Error("Cannot set config after client has started");this.config=e}setPermissions(e){this.permissions=e}}export{r as TABLE_EXTENSION_TYPE,c as TABLE_PERMISSION_ID,H as TableExtension};
|
|
2
2
|
//# sourceMappingURL=extension.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/table/extension.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventEmitter } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu';\nimport type { JsonType, Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport type { Extension } from '../extension.js';\nimport { ExtensionType } from '../extension.js';\n\nimport {\n SetConfigPacket,\n SetPermissionPacket,\n TableFetchPacket,\n TableFetchRangePacket,\n TableItemsPacket,\n TableKeysPacket,\n TablePacket,\n TableProxyPacket,\n} from './packets.js';\nimport type { Table, TableConfig, TableEvents, TablePermissions } from './table.js';\nimport { TableType } from './table.js';\n\nexport const TABLE_EXTENSION_TYPE: ExtensionType<TableExtension> = new ExtensionType(\n 'table',\n (client) => new TableExtension(client),\n);\nexport const TABLE_PERMISSION_ID: Identifier = TABLE_EXTENSION_TYPE.join('permission');\n\nconst TABLE_SET_PERMISSION_PACKET = PacketType.createSerialized<SetPermissionPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_permission',\n serializer: SetPermissionPacket,\n});\nconst TABLE_SET_CONFIG_PACKET = PacketType.createSerialized<SetConfigPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_config',\n serializer: SetConfigPacket,\n});\nconst TABLE_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'proxy_listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_PACKET = PacketType.createSerialized<TableProxyPacket>(TABLE_EXTENSION_TYPE, {\n name: 'proxy',\n serializer: TableProxyPacket,\n});\nconst TABLE_ITEM_ADD_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_add',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_UPDATE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_update',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_REMOVE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_remove',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_GET_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_get',\n requestSerializer: TableKeysPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, Record<string, boolean>>(TABLE_EXTENSION_TYPE, {\n name: 'item_has',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ALL_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_all',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ANY_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_any',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ENDPOINT = EndpointType.createSerialized<TableFetchPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch',\n requestSerializer: TableFetchPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_RANGE_ENDPOINT = EndpointType.createSerialized<TableFetchRangePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_range',\n requestSerializer: TableFetchRangePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ALL_ENDPOINT = EndpointType.createSerialized<TablePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_all',\n requestSerializer: TablePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_SIZE_ENDPOINT = EndpointType.createSerialized<TablePacket, number>(TABLE_EXTENSION_TYPE, {\n name: 'size',\n requestSerializer: TablePacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_CLEAR_PACKET = PacketType.createSerialized<TablePacket>(TABLE_EXTENSION_TYPE, {\n name: 'clear',\n serializer: TablePacket,\n});\n\nexport class TableExtension implements Extension {\n public readonly type: ExtensionType<TableExtension> = TABLE_EXTENSION_TYPE;\n private readonly tableMap = new IdentifierMap<Table<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n TABLE_SET_PERMISSION_PACKET,\n TABLE_SET_CONFIG_PACKET,\n TABLE_LISTEN_PACKET,\n TABLE_PROXY_LISTEN_PACKET,\n TABLE_PROXY_PACKET,\n TABLE_ITEM_ADD_PACKET,\n TABLE_ITEM_UPDATE_PACKET,\n TABLE_ITEM_REMOVE_PACKET,\n TABLE_ITEM_CLEAR_PACKET,\n );\n }\n\n private createTable<T>(tableType: TableType<T>): Table<T> {\n this.omu.permissions.require(TABLE_PERMISSION_ID);\n if (this.has(tableType.id)) {\n throw new Error('Table already exists');\n }\n const table = new TableImpl<T>(this.omu, tableType);\n this.tableMap.set(tableType.id, table as Table<unknown>);\n return table;\n }\n\n public json<T, D extends JsonType = JsonType>(name: string, options: { key: (item: T) => string; serializer?: Serializable<T, D> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n Serializer.pipe<T, JsonType, Uint8Array>(options.serializer ?? Serializer.noop(), Serializer.json()),\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public serialized<T>(name: string, options: { key: (item: T) => string; serializer: Serializable<T, Uint8Array> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n options.serializer,\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public get<T>(type: TableType<T>): Table<T> {\n if (this.has(type.id)) {\n return this.tableMap.get(type.id) as Table<T>;\n }\n return this.createTable(type);\n }\n\n public has(identifier: Identifier): boolean {\n return this.tableMap.has(identifier);\n }\n}\n\nclass TableImpl<T> implements Table<T> {\n public cache: Map<string, T>;\n public readonly event: TableEvents<T>;\n private readonly promiseMap: Map<string, Promise<T | undefined>>;\n private readonly proxies: Array<(item: T) => T | undefined>;\n private id: Identifier;\n private serializer: Serializable<T, Uint8Array>;\n private keyFunction: (item: T) => string;\n private listening: boolean;\n private cacheSize?: number;\n private config?: TableConfig;\n private permissions?: TablePermissions;\n\n constructor(\n private readonly omu: Omu,\n tableType: TableType<T>,\n ) {\n this.id = tableType.id;\n this.serializer = tableType.serializer;\n this.keyFunction = tableType.keyFunction;\n this.cache = new Map();\n this.event = {\n add: new EventEmitter<[Map<string, T>]>(),\n update: new EventEmitter<[Map<string, T>]>(),\n remove: new EventEmitter<[Map<string, T>]>(),\n clear: new EventEmitter<[]>(),\n cacheUpdate: new EventEmitter<[Map<string, T>]>(),\n };\n this.promiseMap = new Map();\n this.proxies = [];\n this.listening = false;\n\n omu.network.addPacketHandler(TABLE_PROXY_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n let items = this.deserializeItems(packet.items);\n this.proxies.forEach((proxy) => {\n items = new Map(\n [...items.entries()]\n .map(([key, item]) => {\n const proxyItem = proxy(item);\n if (proxyItem !== undefined) {\n return [key, proxyItem as T];\n }\n return undefined;\n })\n .filter((item): item is [string, T] => {\n return typeof item !== 'undefined';\n }),\n );\n });\n omu.send(TABLE_PROXY_PACKET, {\n id: this.id,\n key: packet.key,\n items: Object.fromEntries(\n [...items.entries()].map(([key, item]) => {\n return [key, this.serializer.serialize(item)];\n }),\n ),\n });\n });\n omu.network.addPacketHandler(TABLE_ITEM_ADD_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.event.add.emit(items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_UPDATE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.event.update.emit(items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_REMOVE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n items.forEach((_, key) => {\n this.cache.delete(key);\n });\n this.event.remove.emit(items);\n this.event.cacheUpdate.emit(this.cache);\n });\n omu.network.addPacketHandler(TABLE_ITEM_CLEAR_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n this.cache = new Map();\n this.event.clear.emit();\n this.event.cacheUpdate.emit(this.cache);\n });\n omu.event.ready.listen(() => this.onReady());\n }\n\n private updateCache(items: Map<string, T>): void {\n if (!this.cacheSize) {\n this.cache = items;\n } else {\n const cache = new Map([...this.cache, ...items].slice(-this.cacheSize));\n this.cache = cache;\n }\n this.event.cacheUpdate.emit(this.cache);\n }\n\n public listen(listener?: (items: Map<string, T>) => void): Unlisten {\n if (!this.listening) {\n this.omu.onReady(() => {\n this.omu.send(TABLE_LISTEN_PACKET, this.id);\n });\n this.listening = true;\n }\n if (listener) {\n return this.event.cacheUpdate.listen(listener);\n }\n return () => {};\n }\n\n public proxy(callback: (item: T) => T | undefined): Unlisten {\n if (this.proxies.length === 0) {\n let cancel = (): void => {};\n cancel = this.omu.onReady(() => {\n if (this.proxies.length === 0) {\n cancel();\n return;\n }\n this.omu.send(TABLE_PROXY_LISTEN_PACKET, this.id);\n });\n }\n this.proxies.push(callback);\n return () => {\n this.proxies.splice(this.proxies.indexOf(callback), 1);\n };\n }\n\n private onReady(): void {\n if (this.config) {\n this.omu.send(TABLE_SET_CONFIG_PACKET, {\n id: this.id,\n config: this.config,\n });\n }\n }\n\n public async get(key: string): Promise<T | undefined> {\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n if (this.promiseMap.has(key)) {\n return await this.promiseMap.get(key);\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: [key],\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return this.cache.get(key);\n });\n this.promiseMap.set(key, promise);\n return await promise.then((item) => {\n this.promiseMap.delete(key);\n return item;\n });\n }\n\n public async getMany(...keys: string[]): Promise<Map<string, T>> {\n const filteredKeys = keys\n .filter((key) => !this.cache.has(key))\n .filter((key) => !this.promiseMap.has(key));\n if (filteredKeys.length === 0) {\n return new Map([...this.cache].filter(([key]) => keys.includes(key)));\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: filteredKeys,\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n });\n for (const key of filteredKeys) {\n this.promiseMap.set(\n key,\n promise.then((items) => items.get(key)),\n );\n }\n const items = await promise;\n for (const key of filteredKeys) {\n this.promiseMap.delete(key);\n }\n return new Map([...this.cache, ...items].filter(([key]) => keys.includes(key)));\n }\n\n public async add(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n this.omu.send(TABLE_ITEM_ADD_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async update(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n this.omu.send(TABLE_ITEM_UPDATE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async remove(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n const keys = Object.keys(data);\n this.cache = new Map([...this.cache].filter(([key]) => !keys.includes(key)));\n this.omu.send(TABLE_ITEM_REMOVE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async clear(): Promise<void> {\n this.omu.send(TABLE_ITEM_CLEAR_PACKET, {\n id: this.id,\n });\n }\n\n public async has(key: string): Promise<boolean> {\n if (this.cache.has(key)) {\n return true;\n }\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: [key],\n });\n return res[key] ?? false;\n }\n\n public async hasMany<T extends Record<string, unknown>>(...keys: (keyof T)[]): Promise<{ [key in keyof T]: boolean }> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: keys,\n });\n return res as { [key in keyof T]: boolean };\n }\n\n public async hasAll(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ALL_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async hasAny(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ANY_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async fetchItems({\n limit,\n backward,\n cursor,\n }: {\n limit: number;\n backward?: boolean;\n cursor?: string;\n }): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(\n TABLE_FETCH_ENDPOINT,\n new TableFetchPacket(this.id, limit, backward, cursor),\n );\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchRange({\n start,\n end,\n }: {\n start: string;\n end: string;\n }): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_RANGE_ENDPOINT, {\n id: this.id,\n start,\n end,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchAll(): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_ALL_ENDPOINT, {\n id: this.id,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async *iterate({\n backward,\n cursor,\n }: {\n backward?: boolean;\n cursor?: string;\n }): AsyncIterable<T> {\n while (true) {\n const items = await this.fetchItems({\n limit: this.cacheSize ?? 100,\n backward,\n cursor,\n });\n if (items.size === 0) {\n break;\n }\n yield* items.values();\n if (cursor !== undefined) {\n items.delete(cursor);\n }\n const cursorItem = backward ? items.values().next().value : [...items.values()].pop();\n if (!cursorItem) {\n break;\n }\n cursor = this.keyFunction(cursorItem);\n }\n }\n\n public async size(): Promise<number> {\n return await this.omu.endpoints.call(TABLE_SIZE_ENDPOINT, {\n id: this.id,\n });\n }\n\n private deserializeItems(items: Record<string, Uint8Array>): Map<string, T> {\n return new Map(\n Object.entries(items).map(([key, data]) => {\n const item = this.serializer.deserialize(data);\n this.cache.set(key, item);\n return [key, item];\n }),\n );\n }\n\n private serializeItems(items: T[]): Record<string, Uint8Array> {\n return Object.fromEntries(\n items.map((item) => {\n return [this.keyFunction(item), this.serializer.serialize(item)];\n }),\n );\n }\n\n public setCacheSize(size: number): void {\n this.cacheSize = size;\n }\n\n public setConfig(config: TableConfig): void {\n if (this.omu.running) {\n throw new Error('Cannot set config after client has started');\n }\n this.config = config;\n }\n\n public setPermissions(permissions: TablePermissions): void {\n this.permissions = permissions;\n }\n}\n"],
|
|
5
|
-
"mappings": "AACA,OAAS,gBAAAA,MAAoB,cAC7B,OAAS,cAAAC,EAAY,iBAAAC,MAAqB,mBAC1C,OAAS,cAAAC,MAAkB,iCAG3B,OAAS,cAAAC,MAAkB,kBAC3B,OAAS,gBAAAC,MAAoB,0BAE7B,OAAS,iBAAAC,MAAqB,kBAE9B,OACI,mBAAAC,EACA,uBAAAC,EACA,oBAAAC,EACA,yBAAAC,EACA,oBAAAC,EACA,mBAAAC,EACA,eAAAC,EACA,oBAAAC,MACG,eAEP,OAAS,aAAAC,MAAiB,aAEnB,MAAMC,EAAsD,IAAIV,EACnE,QACCW,GAAW,IAAIC,EAAeD,CAAM,CACzC,EACaE,EAAkCH,EAAqB,KAAK,YAAY,EAE/EI,EAA8BjB,EAAW,iBAAsCa,EAAsB,CACvG,KAAM,iBACN,WAAYR,CAChB,CAAC,EACKa,EAA0BlB,EAAW,iBAAkCa,EAAsB,CAC/F,KAAM,aACN,WAAYT,CAChB,CAAC,EACKe,EAAsBnB,EAAW,WAAuBa,EAAsB,CAChF,KAAM,SACN,WAAYf,CAChB,CAAC,EACKsB,EAA4BpB,EAAW,WAAuBa,EAAsB,CACtF,KAAM,eACN,WAAYf,CAChB,CAAC,EACKuB,EAAqBrB,EAAW,iBAAmCa,EAAsB,CAC3F,KAAM,QACN,WAAYF,CAChB,CAAC,EACKW,EAAwBtB,EAAW,iBAAmCa,EAAsB,CAC9F,KAAM,WACN,WAAYL,CAChB,CAAC,EACKe,EAA2BvB,EAAW,iBAAmCa,EAAsB,CACjG,KAAM,cACN,WAAYL,CAChB,CAAC,EACKgB,EAA2BxB,EAAW,iBAAmCa,EAAsB,CACjG,KAAM,cACN,WAAYL,CAChB,CAAC,EACKiB,EAA0BvB,EAAa,iBAAoDW,EAAsB,CACnH,KAAM,WACN,kBAAmBJ,EACnB,mBAAoBD,EACpB,aAAcQ,CAClB,CAAC,EACKU,EAA0BxB,EAAa,iBAA2DW,EAAsB,CAC1H,KAAM,WACN,kBAAmBJ,EACnB,mBAAoBR,EAAW,KAAK,EACpC,aAAce,CAClB,CAAC,EACKW,EAA8BzB,EAAa,iBAA2CW,EAAsB,CAC9G,KAAM,eACN,kBAAmBJ,EACnB,mBAAoBR,EAAW,KAAK,EACpC,aAAce,CAClB,CAAC,EACKY,EAA8B1B,EAAa,iBAA2CW,EAAsB,CAC9G,KAAM,eACN,kBAAmBJ,EACnB,mBAAoBR,EAAW,KAAK,EACpC,aAAce,CAClB,CAAC,EACKa,EAAuB3B,EAAa,iBAAqDW,EAAsB,CACjH,KAAM,QACN,kBAAmBP,EACnB,mBAAoBE,EACpB,aAAcQ,CAClB,CAAC,EACKc,EAA6B5B,EAAa,iBAA0DW,EAAsB,CAC5H,KAAM,cACN,kBAAmBN,EACnB,mBAAoBC,EACpB,aAAcQ,CAClB,CAAC,EACKe,EAA2B7B,EAAa,iBAAgDW,EAAsB,CAChH,KAAM,YACN,kBAAmBH,EACnB,mBAAoBF,EACpB,aAAcQ,CAClB,CAAC,EACKgB,EAAsB9B,EAAa,iBAAsCW,EAAsB,CACjG,KAAM,OACN,kBAAmBH,EACnB,mBAAoBT,EAAW,KAAK,EACpC,aAAce,CAClB,CAAC,EACKiB,EAA0BjC,EAAW,iBAA8Ba,EAAsB,CAC3F,KAAM,QACN,WAAYH,CAChB,CAAC,EAEM,MAAMK,CAAoC,CAI7C,YAA6BmB,EAAU,CAAV,SAAAA,EACzBA,EAAI,QAAQ,eACRjB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAS,CACJ,CACJ,CAfgB,KAAsCpB,EACrC,SAAW,IAAId,EAgBxB,YAAeoC,EAAmC,
|
|
6
|
-
"names": ["EventEmitter", "Identifier", "IdentifierMap", "PacketType", "Serializer", "EndpointType", "ExtensionType", "SetConfigPacket", "SetPermissionPacket", "TableFetchPacket", "TableFetchRangePacket", "TableItemsPacket", "TableKeysPacket", "TablePacket", "TableProxyPacket", "TableType", "TABLE_EXTENSION_TYPE", "client", "TableExtension", "TABLE_PERMISSION_ID", "TABLE_SET_PERMISSION_PACKET", "TABLE_SET_CONFIG_PACKET", "TABLE_LISTEN_PACKET", "TABLE_PROXY_LISTEN_PACKET", "TABLE_PROXY_PACKET", "TABLE_ITEM_ADD_PACKET", "TABLE_ITEM_UPDATE_PACKET", "TABLE_ITEM_REMOVE_PACKET", "TABLE_ITEM_GET_ENDPOINT", "TABLE_ITEM_HAS_ENDPOINT", "TABLE_ITEM_HAS_ALL_ENDPOINT", "TABLE_ITEM_HAS_ANY_ENDPOINT", "TABLE_FETCH_ENDPOINT", "TABLE_FETCH_RANGE_ENDPOINT", "TABLE_FETCH_ALL_ENDPOINT", "TABLE_SIZE_ENDPOINT", "TABLE_ITEM_CLEAR_PACKET", "omu", "tableType", "table", "TableImpl", "name", "options", "type", "identifier", "packet", "items", "proxy", "key", "item", "proxyItem", "_", "cache", "listener", "callback", "cancel", "promise", "res", "keys", "filteredKeys", "data", "limit", "backward", "cursor", "start", "end", "cursorItem", "size", "config", "permissions"]
|
|
4
|
+
"sourcesContent": ["import type { Unlisten } from '../../event';\nimport { EventEmitter } from '../../event';\nimport { Identifier, IdentifierMap } from '../../identifier';\nimport { PacketType } from '../../network/packet/packet.js';\nimport { Omu } from '../../omu';\nimport type { JsonType, Serializable } from '../../serialize';\nimport { Serializer } from '../../serialize';\nimport { EndpointType } from '../endpoint/endpoint.js';\nimport type { Extension } from '../extension.js';\nimport { ExtensionType } from '../extension.js';\n\nimport {\n SetConfigPacket,\n SetPermissionPacket,\n TableFetchPacket,\n TableFetchRangePacket,\n TableItemsPacket,\n TableKeysPacket,\n TablePacket,\n TableProxyPacket,\n} from './packets.js';\nimport type { Table, TableConfig, TableEvents, TablePermissions } from './table.js';\nimport { TableType } from './table.js';\n\nexport const TABLE_EXTENSION_TYPE: ExtensionType<TableExtension> = new ExtensionType(\n 'table',\n (client) => new TableExtension(client),\n);\nexport const TABLE_PERMISSION_ID: Identifier = TABLE_EXTENSION_TYPE.join('permission');\n\nconst TABLE_SET_PERMISSION_PACKET = PacketType.createSerialized<SetPermissionPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_permission',\n serializer: SetPermissionPacket,\n});\nconst TABLE_SET_CONFIG_PACKET = PacketType.createSerialized<SetConfigPacket>(TABLE_EXTENSION_TYPE, {\n name: 'set_config',\n serializer: SetConfigPacket,\n});\nconst TABLE_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_LISTEN_PACKET = PacketType.createJson<Identifier>(TABLE_EXTENSION_TYPE, {\n name: 'proxy_listen',\n serializer: Identifier,\n});\nconst TABLE_PROXY_PACKET = PacketType.createSerialized<TableProxyPacket>(TABLE_EXTENSION_TYPE, {\n name: 'proxy',\n serializer: TableProxyPacket,\n});\nconst TABLE_ITEM_ADD_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_add',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_UPDATE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_update',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_REMOVE_PACKET = PacketType.createSerialized<TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_remove',\n serializer: TableItemsPacket,\n});\nconst TABLE_ITEM_GET_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'item_get',\n requestSerializer: TableKeysPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, Record<string, boolean>>(TABLE_EXTENSION_TYPE, {\n name: 'item_has',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ALL_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_all',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_HAS_ANY_ENDPOINT = EndpointType.createSerialized<TableKeysPacket, boolean>(TABLE_EXTENSION_TYPE, {\n name: 'item_has_any',\n requestSerializer: TableKeysPacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ENDPOINT = EndpointType.createSerialized<TableFetchPacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch',\n requestSerializer: TableFetchPacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_RANGE_ENDPOINT = EndpointType.createSerialized<TableFetchRangePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_range',\n requestSerializer: TableFetchRangePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_FETCH_ALL_ENDPOINT = EndpointType.createSerialized<TablePacket, TableItemsPacket>(TABLE_EXTENSION_TYPE, {\n name: 'fetch_all',\n requestSerializer: TablePacket,\n responseSerializer: TableItemsPacket,\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_SIZE_ENDPOINT = EndpointType.createSerialized<TablePacket, number>(TABLE_EXTENSION_TYPE, {\n name: 'size',\n requestSerializer: TablePacket,\n responseSerializer: Serializer.json(),\n permissionId: TABLE_PERMISSION_ID,\n});\nconst TABLE_ITEM_CLEAR_PACKET = PacketType.createSerialized<TablePacket>(TABLE_EXTENSION_TYPE, {\n name: 'clear',\n serializer: TablePacket,\n});\n\nexport class TableExtension implements Extension {\n public readonly type: ExtensionType<TableExtension> = TABLE_EXTENSION_TYPE;\n private readonly tableMap = new IdentifierMap<Table<unknown>>();\n\n constructor(private readonly omu: Omu) {\n omu.network.registerPacket(\n TABLE_SET_PERMISSION_PACKET,\n TABLE_SET_CONFIG_PACKET,\n TABLE_LISTEN_PACKET,\n TABLE_PROXY_LISTEN_PACKET,\n TABLE_PROXY_PACKET,\n TABLE_ITEM_ADD_PACKET,\n TABLE_ITEM_UPDATE_PACKET,\n TABLE_ITEM_REMOVE_PACKET,\n TABLE_ITEM_CLEAR_PACKET,\n );\n }\n\n private createTable<T>(tableType: TableType<T>): Table<T> {\n this.omu.permissions.require(TABLE_PERMISSION_ID);\n const existing = this.tableMap.get(tableType.id);\n if (existing) {\n return existing as Table<T>;\n }\n const table = new TableImpl<T>(this.omu, tableType);\n this.tableMap.set(tableType.id, table as Table<unknown>);\n return table;\n }\n\n public json<T, D extends JsonType = JsonType>(name: string, options: { key: (item: T) => string; serializer?: Serializable<T, D> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n Serializer.pipe<T, JsonType, Uint8Array>(options.serializer ?? Serializer.noop(), Serializer.json()),\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public serialized<T>(name: string, options: { key: (item: T) => string; serializer: Serializable<T, Uint8Array> }): Table<T> {\n const tableType = new TableType<T>(\n this.omu.app.id.base.join(name),\n options.serializer,\n options.key,\n );\n return this.createTable(tableType);\n }\n\n public get<T>(type: TableType<T>): Table<T> {\n if (this.has(type.id)) {\n return this.tableMap.get(type.id) as Table<T>;\n }\n return this.createTable(type);\n }\n\n public has(identifier: Identifier): boolean {\n return this.tableMap.has(identifier);\n }\n}\n\nclass TableImpl<T> implements Table<T> {\n public cache: Map<string, T>;\n public readonly event: TableEvents<T>;\n private readonly promiseMap: Map<string, Promise<T | undefined>>;\n private readonly proxies: Array<(item: T) => T | undefined>;\n private id: Identifier;\n private serializer: Serializable<T, Uint8Array>;\n private keyFunction: (item: T) => string;\n private listening: boolean;\n private cacheSize?: number;\n private config?: TableConfig;\n private permissions?: TablePermissions;\n\n constructor(\n private readonly omu: Omu,\n tableType: TableType<T>,\n ) {\n this.id = tableType.id;\n this.serializer = tableType.serializer;\n this.keyFunction = tableType.keyFunction;\n this.cache = new Map();\n this.event = {\n add: new EventEmitter<[Map<string, T>]>(),\n update: new EventEmitter<[Map<string, T>]>(),\n remove: new EventEmitter<[Map<string, T>]>(),\n clear: new EventEmitter<[]>(),\n cacheUpdate: new EventEmitter<[Map<string, T>]>(),\n };\n this.promiseMap = new Map();\n this.proxies = [];\n this.listening = false;\n\n omu.network.addPacketHandler(TABLE_PROXY_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n let items = this.deserializeItems(packet.items);\n this.proxies.forEach((proxy) => {\n items = new Map(\n [...items.entries()]\n .map(([key, item]) => {\n const proxyItem = proxy(item);\n if (proxyItem !== undefined) {\n return [key, proxyItem as T];\n }\n return undefined;\n })\n .filter((item): item is [string, T] => {\n return typeof item !== 'undefined';\n }),\n );\n });\n omu.send(TABLE_PROXY_PACKET, {\n id: this.id,\n key: packet.key,\n items: Object.fromEntries(\n [...items.entries()].map(([key, item]) => {\n return [key, this.serializer.serialize(item)];\n }),\n ),\n });\n });\n omu.network.addPacketHandler(TABLE_ITEM_ADD_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.event.add.emit(items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_UPDATE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n this.updateCache(items);\n this.event.update.emit(items);\n });\n omu.network.addPacketHandler(TABLE_ITEM_REMOVE_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n const items = this.deserializeItems(packet.items);\n items.forEach((_, key) => {\n this.cache.delete(key);\n });\n this.event.remove.emit(items);\n this.event.cacheUpdate.emit(this.cache);\n });\n omu.network.addPacketHandler(TABLE_ITEM_CLEAR_PACKET, (packet) => {\n if (!packet.id.isEqual(this.id)) {\n return;\n }\n this.cache = new Map();\n this.event.clear.emit();\n this.event.cacheUpdate.emit(this.cache);\n });\n omu.event.ready.listen(() => this.onReady());\n }\n\n private updateCache(items: Map<string, T>): void {\n if (!this.cacheSize) {\n this.cache = items;\n } else {\n const cache = new Map([...this.cache, ...items].slice(-this.cacheSize));\n this.cache = cache;\n }\n this.event.cacheUpdate.emit(this.cache);\n }\n\n public listen(listener?: (items: Map<string, T>) => void): Unlisten {\n if (!this.listening) {\n this.omu.onReady(() => {\n this.omu.send(TABLE_LISTEN_PACKET, this.id);\n });\n this.listening = true;\n }\n if (listener) {\n return this.event.cacheUpdate.listen(listener);\n }\n return () => {};\n }\n\n public proxy(callback: (item: T) => T | undefined): Unlisten {\n if (this.proxies.length === 0) {\n let cancel = (): void => {};\n cancel = this.omu.onReady(() => {\n if (this.proxies.length === 0) {\n cancel();\n return;\n }\n this.omu.send(TABLE_PROXY_LISTEN_PACKET, this.id);\n });\n }\n this.proxies.push(callback);\n return () => {\n this.proxies.splice(this.proxies.indexOf(callback), 1);\n };\n }\n\n private onReady(): void {\n if (this.config) {\n this.omu.send(TABLE_SET_CONFIG_PACKET, {\n id: this.id,\n config: this.config,\n });\n }\n }\n\n public async get(key: string): Promise<T | undefined> {\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n if (this.promiseMap.has(key)) {\n return await this.promiseMap.get(key);\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: [key],\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return this.cache.get(key);\n });\n this.promiseMap.set(key, promise);\n return await promise.then((item) => {\n this.promiseMap.delete(key);\n return item;\n });\n }\n\n public async getMany(...keys: string[]): Promise<Map<string, T>> {\n const filteredKeys = keys\n .filter((key) => !this.cache.has(key))\n .filter((key) => !this.promiseMap.has(key));\n if (filteredKeys.length === 0) {\n return new Map([...this.cache].filter(([key]) => keys.includes(key)));\n }\n const promise = this.omu.endpoints\n .call(TABLE_ITEM_GET_ENDPOINT, {\n id: this.id,\n keys: filteredKeys,\n })\n .then((res) => {\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n });\n for (const key of filteredKeys) {\n this.promiseMap.set(\n key,\n promise.then((items) => items.get(key)),\n );\n }\n const items = await promise;\n for (const key of filteredKeys) {\n this.promiseMap.delete(key);\n }\n return new Map([...this.cache, ...items].filter(([key]) => keys.includes(key)));\n }\n\n public async add(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n this.omu.send(TABLE_ITEM_ADD_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async update(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n this.omu.send(TABLE_ITEM_UPDATE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async remove(...items: T[]): Promise<void> {\n const data = this.serializeItems(items);\n const keys = Object.keys(data);\n this.cache = new Map([...this.cache].filter(([key]) => !keys.includes(key)));\n this.omu.send(TABLE_ITEM_REMOVE_PACKET, {\n id: this.id,\n items: data,\n });\n }\n\n public async clear(): Promise<void> {\n this.omu.send(TABLE_ITEM_CLEAR_PACKET, {\n id: this.id,\n });\n }\n\n public async has(key: string): Promise<boolean> {\n if (this.cache.has(key)) {\n return true;\n }\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: [key],\n });\n return res[key] ?? false;\n }\n\n public async hasMany<T extends Record<string, unknown>>(...keys: (keyof T)[]): Promise<{ [key in keyof T]: boolean }> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ENDPOINT, {\n id: this.id,\n keys: keys,\n });\n return res as { [key in keyof T]: boolean };\n }\n\n public async hasAll(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ALL_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async hasAny(...keys: string[]): Promise<boolean> {\n const res = await this.omu.endpoints.call(TABLE_ITEM_HAS_ANY_ENDPOINT, {\n id: this.id,\n keys,\n });\n return res;\n }\n\n public async fetchItems({\n limit,\n backward,\n cursor,\n }: {\n limit: number;\n backward?: boolean;\n cursor?: string;\n }): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(\n TABLE_FETCH_ENDPOINT,\n new TableFetchPacket(this.id, limit, backward, cursor),\n );\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchRange({\n start,\n end,\n }: {\n start: string;\n end: string;\n }): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_RANGE_ENDPOINT, {\n id: this.id,\n start,\n end,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async fetchAll(): Promise<Map<string, T>> {\n const res = await this.omu.endpoints.call(TABLE_FETCH_ALL_ENDPOINT, {\n id: this.id,\n });\n const items = this.deserializeItems(res.items);\n this.updateCache(items);\n return items;\n }\n\n public async *iterate({\n backward,\n cursor,\n }: {\n backward?: boolean;\n cursor?: string;\n }): AsyncIterable<T> {\n while (true) {\n const items = await this.fetchItems({\n limit: this.cacheSize ?? 100,\n backward,\n cursor,\n });\n if (items.size === 0) {\n break;\n }\n yield* items.values();\n if (cursor !== undefined) {\n items.delete(cursor);\n }\n const cursorItem = backward ? items.values().next().value : [...items.values()].pop();\n if (!cursorItem) {\n break;\n }\n cursor = this.keyFunction(cursorItem);\n }\n }\n\n public async size(): Promise<number> {\n return await this.omu.endpoints.call(TABLE_SIZE_ENDPOINT, {\n id: this.id,\n });\n }\n\n private deserializeItems(items: Record<string, Uint8Array>): Map<string, T> {\n return new Map(\n Object.entries(items).map(([key, data]) => {\n const item = this.serializer.deserialize(data);\n this.cache.set(key, item);\n return [key, item];\n }),\n );\n }\n\n private serializeItems(items: T[]): Record<string, Uint8Array> {\n return Object.fromEntries(\n items.map((item) => {\n return [this.keyFunction(item), this.serializer.serialize(item)];\n }),\n );\n }\n\n public setCacheSize(size: number): void {\n this.cacheSize = size;\n }\n\n public setConfig(config: TableConfig): void {\n if (this.omu.running) {\n throw new Error('Cannot set config after client has started');\n }\n this.config = config;\n }\n\n public setPermissions(permissions: TablePermissions): void {\n this.permissions = permissions;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["EventEmitter", "Identifier", "IdentifierMap", "PacketType", "Serializer", "EndpointType", "ExtensionType", "SetConfigPacket", "SetPermissionPacket", "TableFetchPacket", "TableFetchRangePacket", "TableItemsPacket", "TableKeysPacket", "TablePacket", "TableProxyPacket", "TableType", "TABLE_EXTENSION_TYPE", "client", "TableExtension", "TABLE_PERMISSION_ID", "TABLE_SET_PERMISSION_PACKET", "TABLE_SET_CONFIG_PACKET", "TABLE_LISTEN_PACKET", "TABLE_PROXY_LISTEN_PACKET", "TABLE_PROXY_PACKET", "TABLE_ITEM_ADD_PACKET", "TABLE_ITEM_UPDATE_PACKET", "TABLE_ITEM_REMOVE_PACKET", "TABLE_ITEM_GET_ENDPOINT", "TABLE_ITEM_HAS_ENDPOINT", "TABLE_ITEM_HAS_ALL_ENDPOINT", "TABLE_ITEM_HAS_ANY_ENDPOINT", "TABLE_FETCH_ENDPOINT", "TABLE_FETCH_RANGE_ENDPOINT", "TABLE_FETCH_ALL_ENDPOINT", "TABLE_SIZE_ENDPOINT", "TABLE_ITEM_CLEAR_PACKET", "omu", "tableType", "existing", "table", "TableImpl", "name", "options", "type", "identifier", "packet", "items", "proxy", "key", "item", "proxyItem", "_", "cache", "listener", "callback", "cancel", "promise", "res", "keys", "filteredKeys", "data", "limit", "backward", "cursor", "start", "end", "cursorItem", "size", "config", "permissions"]
|
|
7
7
|
}
|
package/dist/network/network.js
CHANGED
|
@@ -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){
|
|
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};
|
|
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 if (this.omu.running) {\n throw new Error('Cannot add task after client is ready');\n }\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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
|
|
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
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"]
|
|
7
7
|
}
|
|
@@ -39,7 +39,7 @@ export declare class ByteWriter {
|
|
|
39
39
|
writeString(value: string): ByteWriter;
|
|
40
40
|
writeJSON(value: JsonType): ByteWriter;
|
|
41
41
|
writeFlags(flags: Flags): ByteWriter;
|
|
42
|
-
finish(): Uint8Array
|
|
42
|
+
finish(): Uint8Array<ArrayBuffer>;
|
|
43
43
|
toUint8Array(): Uint8Array;
|
|
44
44
|
toArrayBuffer(): ArrayBuffer;
|
|
45
45
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/serialize/bytebuffer.ts"],
|
|
4
|
-
"sourcesContent": ["import { textDecoder, textEncoder } from '../const.js';\nimport { JsonType } from './serializer.js';\n\nexport class Flags {\n private value: number;\n private length: number;\n\n constructor(options: { value?: number; length?: number }) {\n this.value = options.value ?? 0;\n this.length = options.length ?? 32;\n }\n\n public has(position: number): boolean {\n return (this.value & (1 << position)) !== 0;\n }\n\n public get(position: number): boolean {\n return (this.value & (1 << position)) !== 0;\n }\n\n public ifSet<T>(position: number, callback: () => T): T | undefined {\n if (this.has(position)) {\n return callback();\n }\n return undefined;\n }\n\n public set(position: number, value: boolean): void {\n if (value) {\n this.value |= 1 << position;\n } else {\n this.value &= ~(1 << position);\n }\n }\n\n public write(writer: ByteWriter): void {\n const bits = new Uint8Array((this.length + 7) / 8);\n for (let i = 0; i < bits.length; i++) {\n bits[i] = (this.value >> (i * 8)) & 0xff;\n }\n writer.write(bits);\n }\n\n public static read(reader: ByteReader, length: number): Flags {\n let value = 0;\n for (let i = 0; i < (length + 7) / 8; i++) {\n value |= reader.readUint8() << (i * 8);\n }\n return new Flags({ value, length });\n }\n}\n\nfunction readFloat16(dataView: DataView, offset: number): number {\n const sign = (dataView.getUint16(offset) & 0x8000) ? -1 : 1;\n const exponent = (dataView.getUint16(offset) & 0x7c00) >> 10;\n const mantissa = (dataView.getUint16(offset) & 0x03ff);\n if (exponent === 0 && mantissa === 0) {\n return 0;\n } else if (exponent === 0x1f) {\n return mantissa === 0 ? Infinity * sign : NaN;\n } else {\n const normalizedExponent = exponent - 15;\n const normalizedMantissa = mantissa / 1024;\n return sign * Math.pow(2, normalizedExponent) * (1 + normalizedMantissa);\n }\n}\n\nfunction writeFloat16(dataView: DataView, offset: number, value: number): void {\n if (value === 0) {\n dataView.setUint16(offset, 0);\n return;\n }\n const sign = value < 0 ? 1 : 0;\n value = Math.abs(value);\n if (!isFinite(value)) {\n dataView.setUint16(offset, 0x7c00 | (sign << 15));\n return;\n }\n const exponent = Math.floor(Math.log2(value));\n const mantissa = value / Math.pow(2, exponent) - 1;\n const normalizedExponent = exponent + 15;\n const normalizedMantissa = Math.round(mantissa * 1024);\n if (normalizedExponent <= 0) {\n dataView.setUint16(offset, sign << 15);\n } else if (normalizedExponent >= 0x1f) {\n dataView.setUint16(offset, 0x7c00 | (sign << 15));\n } else {\n dataView.setUint16(offset, (sign << 15) | (normalizedExponent << 10) | normalizedMantissa);\n }\n}\n\nexport class ByteWriter {\n private dataView: DataView;\n private buffer: ArrayBuffer;\n private offset = 0;\n private finished = false;\n\n constructor(init?: ArrayBuffer, offset?: number) {\n this.offset = offset ?? 0;\n this.buffer = init ?? new ArrayBuffer(1024);\n this.dataView = new DataView(this.buffer);\n }\n\n public static fromUint8Array(buffer: Uint8Array): ByteWriter {\n const arrayBuffer = new ArrayBuffer(buffer.byteLength);\n const uint8Array = new Uint8Array(arrayBuffer);\n uint8Array.set(new Uint8Array(buffer));\n return new ByteWriter(arrayBuffer, buffer.byteLength);\n }\n\n private allocate(length: number): void {\n if (this.offset + length > this.buffer.byteLength) {\n const newByteLength = Math.max(this.buffer.byteLength * 2, this.offset + length);\n const newBuffer = new ArrayBuffer(newByteLength);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));\n this.buffer = newBuffer;\n this.dataView = new DataView(this.buffer);\n }\n }\n\n public write(data: Uint8Array): ByteWriter {\n if (this.finished) {\n throw new Error('Buffer already finished');\n }\n this.allocate(data.length);\n new Uint8Array(this.buffer).set(data, this.offset);\n this.offset += data.length;\n return this;\n }\n\n public writeBoolean(value: boolean): ByteWriter {\n this.allocate(1);\n this.dataView.setInt8(this.offset, value ? 1 : 0);\n this.offset += 1;\n return this;\n }\n\n public writeInt8(value: number): ByteWriter {\n this.allocate(1);\n this.dataView.setInt8(this.offset, value);\n this.offset += 1;\n return this;\n }\n\n public writeUint8(value: number): ByteWriter {\n this.allocate(1);\n this.dataView.setUint8(this.offset, value);\n this.offset += 1;\n return this;\n }\n\n public writeInt16(value: number): ByteWriter {\n this.allocate(2);\n this.dataView.setInt16(this.offset, value);\n this.offset += 2;\n return this;\n }\n\n public writeUint16(value: number): ByteWriter {\n this.allocate(2);\n this.dataView.setUint16(this.offset, value);\n this.offset += 2;\n return this;\n }\n\n public writeInt32(value: number): ByteWriter {\n this.allocate(4);\n this.dataView.setInt32(this.offset, value);\n this.offset += 4;\n return this;\n }\n\n public writeUint32(value: number): ByteWriter {\n this.allocate(4);\n this.dataView.setUint32(this.offset, value);\n this.offset += 4;\n return this;\n }\n\n public writeInt64(value: bigint): ByteWriter {\n this.allocate(8);\n this.dataView.setBigInt64(this.offset, value);\n this.offset += 8;\n return this;\n }\n\n public writeUint64(value: bigint): ByteWriter {\n this.allocate(8);\n this.dataView.setBigUint64(this.offset, value);\n this.offset += 8;\n return this;\n }\n\n public writeULEB128(value: number): ByteWriter {\n // Unsigned LEB128\n if (value < 0) {\n throw new Error('Value must be non-negative');\n }\n while (value > 0x7f) {\n this.allocate(1);\n this.dataView.setUint8(this.offset, (value & 0x7f) | 0x80);\n this.offset += 1;\n value >>= 7;\n }\n this.allocate(1);\n this.dataView.setUint8(this.offset, value & 0x7f);\n this.offset += 1;\n return this;\n }\n\n public writeFloat16(value: number): ByteWriter {\n this.allocate(2);\n writeFloat16(this.dataView, this.offset, value);\n this.offset += 2;\n return this;\n }\n\n public writeFloat32(value: number): ByteWriter {\n this.allocate(4);\n this.dataView.setFloat32(this.offset, value);\n this.offset += 4;\n return this;\n }\n\n public writeFloat64(value: number): ByteWriter {\n this.allocate(4);\n this.dataView.setFloat64(this.offset, value);\n this.offset += 4;\n return this;\n }\n\n public writeUint8Array(value: Uint8Array): ByteWriter {\n this.writeULEB128(value.byteLength);\n this.write(value);\n return this;\n }\n\n public writeString(value: string): ByteWriter {\n this.writeUint8Array(textEncoder.encode(value));\n return this;\n }\n\n public writeJSON(value: JsonType): ByteWriter {\n this.writeString(JSON.stringify(value));\n return this;\n }\n\n public writeFlags(flags: Flags): ByteWriter {\n flags.write(this);\n return this;\n }\n\n public finish(): Uint8Array {\n if (this.finished) {\n throw new Error('Buffer already finished');\n }\n this.finished = true;\n return new Uint8Array(this.buffer, 0, this.offset);\n }\n\n public toUint8Array(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.offset);\n }\n\n public toArrayBuffer(): ArrayBuffer {\n return this.buffer.slice(0, this.offset);\n }\n}\n\nexport class ByteReader {\n private dataView: DataView;\n private offset: number;\n private finished: boolean;\n\n private constructor(data: DataView) {\n this.dataView = data;\n this.offset = 0;\n this.finished = false;\n }\n\n public static fromUint8Array(buffer: Uint8Array): ByteReader {\n const arrayBuffer = new ArrayBuffer(buffer.byteLength);\n const uint8Array = new Uint8Array(arrayBuffer);\n uint8Array.set(new Uint8Array(buffer));\n const dataView = new DataView(arrayBuffer);\n return new ByteReader(dataView);\n }\n\n public static fromArrayBuffer(buffer: ArrayBuffer): ByteReader {\n const dataView = new DataView(buffer);\n return new ByteReader(dataView);\n }\n\n public static async fromBlob(blob: Blob): Promise<ByteReader> {\n const arrayBuffer = await blob.arrayBuffer();\n const dataView = new DataView(arrayBuffer);\n return new ByteReader(dataView);\n }\n\n public read(size: number): Uint8Array {\n if (this.finished) {\n throw new Error('Buffer already finished');\n }\n if (size < 0) {\n throw new Error('Size must be positive');\n }\n if (this.offset + size > this.dataView.byteLength) {\n throw new Error('Buffer not fully read');\n }\n const value = new Uint8Array(this.dataView.buffer.slice(this.offset, this.offset + size));\n this.offset += size;\n return value;\n }\n\n public readBoolean(): boolean {\n const value = this.dataView.getInt8(this.offset);\n this.offset += 1;\n return value !== 0;\n }\n\n public readInt8(): number {\n const value = this.dataView.getInt8(this.offset);\n this.offset += 1;\n return value;\n }\n\n public readUint8(): number {\n const value = this.dataView.getUint8(this.offset);\n this.offset += 1;\n return value;\n }\n\n public readInt16(): number {\n const value = this.dataView.getInt16(this.offset);\n this.offset += 2;\n return value;\n }\n\n public readUint16(): number {\n const value = this.dataView.getUint16(this.offset);\n this.offset += 2;\n return value;\n }\n\n public readInt32(): number {\n const value = this.dataView.getInt32(this.offset);\n this.offset += 4;\n return value;\n }\n\n public readUint32(): number {\n const value = this.dataView.getUint32(this.offset);\n this.offset += 4;\n return value;\n }\n\n public readInt64(): bigint {\n const value = this.dataView.getBigInt64(this.offset);\n this.offset += 8;\n return value;\n }\n\n public readUint64(): bigint {\n const value = this.dataView.getBigUint64(this.offset);\n this.offset += 8;\n return value;\n }\n\n public readULEB128(): number {\n // Unsigned LEB128\n let value = 0;\n let shift = 0;\n let byte: number;\n do {\n if (this.offset >= this.dataView.byteLength) {\n throw new Error('Buffer not fully read');\n }\n byte = this.dataView.getUint8(this.offset);\n this.offset += 1;\n value |= (byte & 0b01111111) << shift;\n shift += 7;\n }\n while ((byte & 0b10000000) !== 0);\n return value;\n }\n\n public readFloat16(): number {\n const value = readFloat16(this.dataView, this.offset);\n this.offset += 2;\n return value;\n }\n\n public readFloat32(): number {\n const value = this.dataView.getFloat32(this.offset);\n this.offset += 4;\n return value;\n }\n\n public readFloat64(): number {\n const value = this.dataView.getFloat64(this.offset);\n this.offset += 8;\n return value;\n }\n\n public readUint8Array(): Uint8Array {\n const length = this.readULEB128();\n return this.read(length);\n }\n\n public readString(): string {\n const byteArray = this.readUint8Array();\n return textDecoder.decode(byteArray);\n }\n\n public readJSON<T extends JsonType>(): T {\n return JSON.parse(this.readString());\n }\n\n public readFlags(length: number): Flags {\n return Flags.read(this, length);\n }\n\n public finish(): void {\n if (this.finished) {\n throw new Error('Buffer already finished');\n }\n this.finished = true;\n if (this.offset !== this.dataView.byteLength) {\n throw new Error('Buffer not fully read');\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { textDecoder, textEncoder } from '../const.js';\nimport { JsonType } from './serializer.js';\n\nexport class Flags {\n private value: number;\n private length: number;\n\n constructor(options: { value?: number; length?: number }) {\n this.value = options.value ?? 0;\n this.length = options.length ?? 32;\n }\n\n public has(position: number): boolean {\n return (this.value & (1 << position)) !== 0;\n }\n\n public get(position: number): boolean {\n return (this.value & (1 << position)) !== 0;\n }\n\n public ifSet<T>(position: number, callback: () => T): T | undefined {\n if (this.has(position)) {\n return callback();\n }\n return undefined;\n }\n\n public set(position: number, value: boolean): void {\n if (value) {\n this.value |= 1 << position;\n } else {\n this.value &= ~(1 << position);\n }\n }\n\n public write(writer: ByteWriter): void {\n const bits = new Uint8Array((this.length + 7) / 8);\n for (let i = 0; i < bits.length; i++) {\n bits[i] = (this.value >> (i * 8)) & 0xff;\n }\n writer.write(bits);\n }\n\n public static read(reader: ByteReader, length: number): Flags {\n let value = 0;\n for (let i = 0; i < (length + 7) / 8; i++) {\n value |= reader.readUint8() << (i * 8);\n }\n return new Flags({ value, length });\n }\n}\n\nfunction readFloat16(dataView: DataView, offset: number): number {\n const sign = (dataView.getUint16(offset) & 0x8000) ? -1 : 1;\n const exponent = (dataView.getUint16(offset) & 0x7c00) >> 10;\n const mantissa = (dataView.getUint16(offset) & 0x03ff);\n if (exponent === 0 && mantissa === 0) {\n return 0;\n } else if (exponent === 0x1f) {\n return mantissa === 0 ? Infinity * sign : NaN;\n } else {\n const normalizedExponent = exponent - 15;\n const normalizedMantissa = mantissa / 1024;\n return sign * Math.pow(2, normalizedExponent) * (1 + normalizedMantissa);\n }\n}\n\nfunction writeFloat16(dataView: DataView, offset: number, value: number): void {\n if (value === 0) {\n dataView.setUint16(offset, 0);\n return;\n }\n const sign = value < 0 ? 1 : 0;\n value = Math.abs(value);\n if (!isFinite(value)) {\n dataView.setUint16(offset, 0x7c00 | (sign << 15));\n return;\n }\n const exponent = Math.floor(Math.log2(value));\n const mantissa = value / Math.pow(2, exponent) - 1;\n const normalizedExponent = exponent + 15;\n const normalizedMantissa = Math.round(mantissa * 1024);\n if (normalizedExponent <= 0) {\n dataView.setUint16(offset, sign << 15);\n } else if (normalizedExponent >= 0x1f) {\n dataView.setUint16(offset, 0x7c00 | (sign << 15));\n } else {\n dataView.setUint16(offset, (sign << 15) | (normalizedExponent << 10) | normalizedMantissa);\n }\n}\n\nexport class ByteWriter {\n private dataView: DataView;\n private buffer: ArrayBuffer;\n private offset = 0;\n private finished = false;\n\n constructor(init?: ArrayBuffer, offset?: number) {\n this.offset = offset ?? 0;\n this.buffer = init ?? new ArrayBuffer(1024);\n this.dataView = new DataView(this.buffer);\n }\n\n public static fromUint8Array(buffer: Uint8Array): ByteWriter {\n const arrayBuffer = new ArrayBuffer(buffer.byteLength);\n const uint8Array = new Uint8Array(arrayBuffer);\n uint8Array.set(new Uint8Array(buffer));\n return new ByteWriter(arrayBuffer, buffer.byteLength);\n }\n\n private allocate(length: number): void {\n if (this.offset + length > this.buffer.byteLength) {\n const newByteLength = Math.max(this.buffer.byteLength * 2, this.offset + length);\n const newBuffer = new ArrayBuffer(newByteLength);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));\n this.buffer = newBuffer;\n this.dataView = new DataView(this.buffer);\n }\n }\n\n public write(data: Uint8Array): ByteWriter {\n if (this.finished) {\n throw new Error('Buffer already finished');\n }\n this.allocate(data.length);\n new Uint8Array(this.buffer).set(data, this.offset);\n this.offset += data.length;\n return this;\n }\n\n public writeBoolean(value: boolean): ByteWriter {\n this.allocate(1);\n this.dataView.setInt8(this.offset, value ? 1 : 0);\n this.offset += 1;\n return this;\n }\n\n public writeInt8(value: number): ByteWriter {\n this.allocate(1);\n this.dataView.setInt8(this.offset, value);\n this.offset += 1;\n return this;\n }\n\n public writeUint8(value: number): ByteWriter {\n this.allocate(1);\n this.dataView.setUint8(this.offset, value);\n this.offset += 1;\n return this;\n }\n\n public writeInt16(value: number): ByteWriter {\n this.allocate(2);\n this.dataView.setInt16(this.offset, value);\n this.offset += 2;\n return this;\n }\n\n public writeUint16(value: number): ByteWriter {\n this.allocate(2);\n this.dataView.setUint16(this.offset, value);\n this.offset += 2;\n return this;\n }\n\n public writeInt32(value: number): ByteWriter {\n this.allocate(4);\n this.dataView.setInt32(this.offset, value);\n this.offset += 4;\n return this;\n }\n\n public writeUint32(value: number): ByteWriter {\n this.allocate(4);\n this.dataView.setUint32(this.offset, value);\n this.offset += 4;\n return this;\n }\n\n public writeInt64(value: bigint): ByteWriter {\n this.allocate(8);\n this.dataView.setBigInt64(this.offset, value);\n this.offset += 8;\n return this;\n }\n\n public writeUint64(value: bigint): ByteWriter {\n this.allocate(8);\n this.dataView.setBigUint64(this.offset, value);\n this.offset += 8;\n return this;\n }\n\n public writeULEB128(value: number): ByteWriter {\n // Unsigned LEB128\n if (value < 0) {\n throw new Error('Value must be non-negative');\n }\n while (value > 0x7f) {\n this.allocate(1);\n this.dataView.setUint8(this.offset, (value & 0x7f) | 0x80);\n this.offset += 1;\n value >>= 7;\n }\n this.allocate(1);\n this.dataView.setUint8(this.offset, value & 0x7f);\n this.offset += 1;\n return this;\n }\n\n public writeFloat16(value: number): ByteWriter {\n this.allocate(2);\n writeFloat16(this.dataView, this.offset, value);\n this.offset += 2;\n return this;\n }\n\n public writeFloat32(value: number): ByteWriter {\n this.allocate(4);\n this.dataView.setFloat32(this.offset, value);\n this.offset += 4;\n return this;\n }\n\n public writeFloat64(value: number): ByteWriter {\n this.allocate(4);\n this.dataView.setFloat64(this.offset, value);\n this.offset += 4;\n return this;\n }\n\n public writeUint8Array(value: Uint8Array): ByteWriter {\n this.writeULEB128(value.byteLength);\n this.write(value);\n return this;\n }\n\n public writeString(value: string): ByteWriter {\n this.writeUint8Array(textEncoder.encode(value));\n return this;\n }\n\n public writeJSON(value: JsonType): ByteWriter {\n this.writeString(JSON.stringify(value));\n return this;\n }\n\n public writeFlags(flags: Flags): ByteWriter {\n flags.write(this);\n return this;\n }\n\n public finish(): Uint8Array<ArrayBuffer> {\n if (this.finished) {\n throw new Error('Buffer already finished');\n }\n this.finished = true;\n return new Uint8Array(this.buffer, 0, this.offset);\n }\n\n public toUint8Array(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.offset);\n }\n\n public toArrayBuffer(): ArrayBuffer {\n return this.buffer.slice(0, this.offset);\n }\n}\n\nexport class ByteReader {\n private dataView: DataView;\n private offset: number;\n private finished: boolean;\n\n private constructor(data: DataView) {\n this.dataView = data;\n this.offset = 0;\n this.finished = false;\n }\n\n public static fromUint8Array(buffer: Uint8Array): ByteReader {\n const arrayBuffer = new ArrayBuffer(buffer.byteLength);\n const uint8Array = new Uint8Array(arrayBuffer);\n uint8Array.set(new Uint8Array(buffer));\n const dataView = new DataView(arrayBuffer);\n return new ByteReader(dataView);\n }\n\n public static fromArrayBuffer(buffer: ArrayBuffer): ByteReader {\n const dataView = new DataView(buffer);\n return new ByteReader(dataView);\n }\n\n public static async fromBlob(blob: Blob): Promise<ByteReader> {\n const arrayBuffer = await blob.arrayBuffer();\n const dataView = new DataView(arrayBuffer);\n return new ByteReader(dataView);\n }\n\n public read(size: number): Uint8Array {\n if (this.finished) {\n throw new Error('Buffer already finished');\n }\n if (size < 0) {\n throw new Error('Size must be positive');\n }\n if (this.offset + size > this.dataView.byteLength) {\n throw new Error('Buffer not fully read');\n }\n const value = new Uint8Array(this.dataView.buffer.slice(this.offset, this.offset + size));\n this.offset += size;\n return value;\n }\n\n public readBoolean(): boolean {\n const value = this.dataView.getInt8(this.offset);\n this.offset += 1;\n return value !== 0;\n }\n\n public readInt8(): number {\n const value = this.dataView.getInt8(this.offset);\n this.offset += 1;\n return value;\n }\n\n public readUint8(): number {\n const value = this.dataView.getUint8(this.offset);\n this.offset += 1;\n return value;\n }\n\n public readInt16(): number {\n const value = this.dataView.getInt16(this.offset);\n this.offset += 2;\n return value;\n }\n\n public readUint16(): number {\n const value = this.dataView.getUint16(this.offset);\n this.offset += 2;\n return value;\n }\n\n public readInt32(): number {\n const value = this.dataView.getInt32(this.offset);\n this.offset += 4;\n return value;\n }\n\n public readUint32(): number {\n const value = this.dataView.getUint32(this.offset);\n this.offset += 4;\n return value;\n }\n\n public readInt64(): bigint {\n const value = this.dataView.getBigInt64(this.offset);\n this.offset += 8;\n return value;\n }\n\n public readUint64(): bigint {\n const value = this.dataView.getBigUint64(this.offset);\n this.offset += 8;\n return value;\n }\n\n public readULEB128(): number {\n // Unsigned LEB128\n let value = 0;\n let shift = 0;\n let byte: number;\n do {\n if (this.offset >= this.dataView.byteLength) {\n throw new Error('Buffer not fully read');\n }\n byte = this.dataView.getUint8(this.offset);\n this.offset += 1;\n value |= (byte & 0b01111111) << shift;\n shift += 7;\n }\n while ((byte & 0b10000000) !== 0);\n return value;\n }\n\n public readFloat16(): number {\n const value = readFloat16(this.dataView, this.offset);\n this.offset += 2;\n return value;\n }\n\n public readFloat32(): number {\n const value = this.dataView.getFloat32(this.offset);\n this.offset += 4;\n return value;\n }\n\n public readFloat64(): number {\n const value = this.dataView.getFloat64(this.offset);\n this.offset += 8;\n return value;\n }\n\n public readUint8Array(): Uint8Array {\n const length = this.readULEB128();\n return this.read(length);\n }\n\n public readString(): string {\n const byteArray = this.readUint8Array();\n return textDecoder.decode(byteArray);\n }\n\n public readJSON<T extends JsonType>(): T {\n return JSON.parse(this.readString());\n }\n\n public readFlags(length: number): Flags {\n return Flags.read(this, length);\n }\n\n public finish(): void {\n if (this.finished) {\n throw new Error('Buffer already finished');\n }\n this.finished = true;\n if (this.offset !== this.dataView.byteLength) {\n throw new Error('Buffer not fully read');\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["textDecoder", "textEncoder", "Flags", "options", "position", "callback", "value", "writer", "bits", "reader", "length", "i", "readFloat16", "dataView", "offset", "sign", "exponent", "mantissa", "normalizedExponent", "normalizedMantissa", "writeFloat16", "ByteWriter", "init", "buffer", "arrayBuffer", "newByteLength", "newBuffer", "data", "flags", "ByteReader", "blob", "size", "shift", "byte", "byteArray"]
|
|
7
7
|
}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
2
|
-
export declare const VERSION_MINOR = "0.
|
|
1
|
+
export declare const VERSION = "0.10.0";
|
|
2
|
+
export declare const VERSION_MINOR = "0.10.0";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const o="0.
|
|
1
|
+
const o="0.10.0",t="0.10.0";export{o as VERSION,t as VERSION_MINOR};
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/dist/version.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/version.ts"],
|
|
4
|
-
"sourcesContent": ["export const VERSION = '0.
|
|
4
|
+
"sourcesContent": ["export const VERSION = '0.10.0';\nexport const VERSION_MINOR = '0.10.0';\n"],
|
|
5
5
|
"mappings": "AAAO,MAAMA,EAAU,SACVC,EAAgB",
|
|
6
6
|
"names": ["VERSION", "VERSION_MINOR"]
|
|
7
7
|
}
|