@omujs/omu 0.9.47 → 0.9.49
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/dts/api/asset/extension.d.ts +25 -0
- package/dist/dts/api/asset/index.d.ts +2 -0
- package/dist/dts/api/dashboard/extension.d.ts +183 -0
- package/{src/api/dashboard/handler.ts → dist/dts/api/dashboard/handler.d.ts} +0 -2
- package/dist/dts/api/dashboard/index.d.ts +3 -0
- package/dist/dts/api/dashboard/packets.d.ts +73 -0
- package/dist/dts/api/endpoint/endpoint.d.ts +21 -0
- package/dist/dts/api/endpoint/extension.d.ts +17 -0
- package/{src/api/endpoint/index.ts → dist/dts/api/endpoint/index.d.ts} +0 -1
- package/dist/dts/api/endpoint/packets.d.ts +51 -0
- package/dist/dts/api/extension-registry.d.ts +8 -0
- package/dist/dts/api/extension.d.ts +11 -0
- package/dist/dts/api/http/extension.d.ts +41 -0
- package/dist/dts/api/http/http.d.ts +36 -0
- package/{src/api/http/index.ts → dist/dts/api/http/index.d.ts} +0 -1
- package/dist/dts/api/http/websocket.d.ts +125 -0
- package/dist/dts/api/i18n/extension.d.ts +19 -0
- package/{src/api/i18n/index.ts → dist/dts/api/i18n/index.d.ts} +0 -1
- package/{src/api/index.ts → dist/dts/api/index.d.ts} +0 -1
- package/dist/dts/api/logger/extension.d.ts +25 -0
- package/dist/dts/api/logger/index.d.ts +1 -0
- package/dist/dts/api/logger/packets.d.ts +18 -0
- package/dist/dts/api/permission/extension.d.ts +19 -0
- package/{src/api/permission/index.ts → dist/dts/api/permission/index.d.ts} +0 -1
- package/dist/dts/api/permission/permission.d.ts +25 -0
- package/dist/dts/api/plugin/extension.d.ts +43 -0
- package/{src/api/plugin/index.ts → dist/dts/api/plugin/index.d.ts} +0 -1
- package/{src/api/plugin/package-info.ts → dist/dts/api/plugin/package-info.d.ts} +0 -7
- package/dist/dts/api/registry/extension.d.ts +23 -0
- package/{src/api/registry/index.ts → dist/dts/api/registry/index.d.ts} +0 -1
- package/dist/dts/api/registry/packets.d.ts +20 -0
- package/{src/api/registry/registry.ts → dist/dts/api/registry/registry.d.ts} +11 -53
- package/dist/dts/api/server/extension.d.ts +61 -0
- package/dist/dts/api/server/index.d.ts +1 -0
- package/dist/dts/api/session/extension.d.ts +52 -0
- package/dist/dts/api/session/index.d.ts +1 -0
- package/dist/dts/api/signal/extension.d.ts +19 -0
- package/dist/dts/api/signal/packets.d.ts +21 -0
- package/dist/dts/api/signal/signal.d.ts +33 -0
- package/dist/dts/api/table/extension.d.ts +26 -0
- package/{src/api/table/index.ts → dist/dts/api/table/index.d.ts} +0 -1
- package/dist/dts/api/table/packets.d.ts +65 -0
- package/dist/dts/api/table/table.d.ts +75 -0
- package/dist/dts/app.d.ts +49 -0
- package/dist/dts/const.d.ts +2 -0
- package/dist/dts/errors.d.ts +36 -0
- package/dist/dts/event/index.d.ts +6 -0
- package/dist/dts/helper.d.ts +10 -0
- package/dist/dts/identifier.d.ts +51 -0
- package/dist/dts/index.d.ts +36 -0
- package/{src/localization/index.ts → dist/dts/localization/index.d.ts} +0 -1
- package/dist/dts/localization/locale.d.ts +735 -0
- package/{src/localization/localization.ts → dist/dts/localization/localization.d.ts} +0 -2
- package/dist/dts/lock.d.ts +6 -0
- package/dist/dts/network/connection.d.ts +17 -0
- package/dist/dts/network/encryption.d.ts +38 -0
- package/dist/dts/network/frame-transport.d.ts +22 -0
- package/{src/network/index.ts → dist/dts/network/index.d.ts} +0 -1
- package/dist/dts/network/network.d.ts +59 -0
- package/{src/network/packet/index.ts → dist/dts/network/packet/index.d.ts} +0 -1
- package/dist/dts/network/packet/packet-types.d.ts +84 -0
- package/dist/dts/network/packet/packet.d.ts +25 -0
- package/dist/dts/network/websocket-transport.d.ts +24 -0
- package/dist/dts/omu.d.ts +61 -0
- package/dist/dts/result.d.ts +26 -0
- package/dist/dts/serialize/bytebuffer.d.ts +73 -0
- package/dist/dts/serialize/serializer.d.ts +26 -0
- package/dist/dts/token.d.ts +14 -0
- package/dist/dts/version.d.ts +2 -0
- package/dist/esm/address.js +4 -0
- package/dist/esm/api/asset/extension.js +911 -0
- package/dist/esm/api/asset/index.js +909 -0
- package/dist/esm/api/dashboard/extension.js +1362 -0
- package/dist/esm/api/dashboard/handler.js +4 -0
- package/dist/esm/api/dashboard/index.js +1361 -0
- package/dist/esm/api/dashboard/packets.js +419 -0
- package/dist/esm/api/endpoint/endpoint.js +383 -0
- package/dist/esm/api/endpoint/extension.js +1096 -0
- package/dist/esm/api/endpoint/index.js +383 -0
- package/dist/esm/api/endpoint/packets.js +799 -0
- package/dist/esm/api/extension-registry.js +23 -0
- package/dist/esm/api/extension.js +278 -0
- package/dist/esm/api/http/extension.js +1420 -0
- package/dist/esm/api/http/http.js +448 -0
- package/dist/esm/api/http/index.js +1419 -0
- package/dist/esm/api/http/websocket.js +220 -0
- package/dist/esm/api/i18n/extension.js +1339 -0
- package/dist/esm/api/i18n/index.js +1337 -0
- package/dist/esm/api/index.js +295 -0
- package/dist/esm/api/logger/extension.js +856 -0
- package/dist/esm/api/logger/index.js +852 -0
- package/dist/esm/api/logger/packets.js +673 -0
- package/dist/esm/api/permission/extension.js +535 -0
- package/dist/esm/api/permission/index.js +294 -0
- package/dist/esm/api/permission/permission.js +294 -0
- package/dist/esm/api/plugin/extension.js +531 -0
- package/dist/esm/api/plugin/index.js +529 -0
- package/dist/esm/api/plugin/package-info.js +4 -0
- package/dist/esm/api/registry/extension.js +1286 -0
- package/dist/esm/api/registry/index.js +1285 -0
- package/dist/esm/api/registry/packets.js +694 -0
- package/dist/esm/api/registry/registry.js +383 -0
- package/dist/esm/api/server/extension.js +2140 -0
- package/dist/esm/api/server/index.js +2118 -0
- package/dist/esm/api/session/extension.js +2235 -0
- package/dist/esm/api/session/index.js +2235 -0
- package/dist/esm/api/signal/extension.js +1031 -0
- package/dist/esm/api/signal/index.js +379 -0
- package/dist/esm/api/signal/packets.js +690 -0
- package/dist/esm/api/signal/signal.js +379 -0
- package/dist/esm/api/table/extension.js +1553 -0
- package/dist/esm/api/table/index.js +1552 -0
- package/dist/esm/api/table/packets.js +904 -0
- package/dist/esm/api/table/table.js +383 -0
- package/dist/esm/app.js +264 -0
- package/dist/esm/const.js +11 -0
- package/dist/esm/errors.js +548 -0
- package/dist/esm/event/index.js +22 -0
- package/dist/esm/helper.js +15 -0
- package/dist/esm/identifier.js +266 -0
- package/dist/esm/index.js +5186 -0
- package/dist/esm/localization/index.js +742 -0
- package/dist/esm/localization/locale.js +742 -0
- package/dist/esm/localization/localization.js +4 -0
- package/dist/esm/lock.js +46 -0
- package/dist/esm/network/connection.js +293 -0
- package/dist/esm/network/encryption.js +986 -0
- package/dist/esm/network/frame-transport.js +531 -0
- package/dist/esm/network/index.js +1627 -0
- package/dist/esm/network/network.js +1368 -0
- package/dist/esm/network/packet/index.js +485 -0
- package/dist/esm/network/packet/packet-types.js +486 -0
- package/dist/esm/network/packet/packet.js +126 -0
- package/dist/esm/network/websocket-transport.js +493 -0
- package/dist/esm/omu.js +4945 -0
- package/dist/esm/result.js +68 -0
- package/dist/esm/serialize/bytebuffer.js +384 -0
- package/dist/esm/serialize/index.js +471 -0
- package/dist/esm/serialize/serializer.js +97 -0
- package/dist/esm/token.js +42 -0
- package/dist/esm/version.js +11 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +4 -1
- package/CHANGELOG.md +0 -1837
- package/src/api/asset/extension.ts +0 -193
- package/src/api/asset/index.ts +0 -5
- package/src/api/dashboard/extension.ts +0 -651
- package/src/api/dashboard/index.ts +0 -38
- package/src/api/dashboard/packets.ts +0 -126
- package/src/api/endpoint/endpoint.ts +0 -56
- package/src/api/endpoint/extension.ts +0 -133
- package/src/api/endpoint/packets.ts +0 -176
- package/src/api/extension-registry.ts +0 -17
- package/src/api/extension.ts +0 -19
- package/src/api/http/extension.ts +0 -401
- package/src/api/http/http.ts +0 -79
- package/src/api/http/websocket.ts +0 -283
- package/src/api/i18n/extension.ts +0 -65
- package/src/api/logger/extension.ts +0 -75
- package/src/api/logger/index.ts +0 -4
- package/src/api/logger/packets.ts +0 -38
- package/src/api/permission/extension.ts +0 -107
- package/src/api/permission/permission.ts +0 -53
- package/src/api/plugin/extension.ts +0 -100
- package/src/api/registry/extension.ts +0 -326
- package/src/api/registry/packets.ts +0 -64
- package/src/api/server/extension.ts +0 -155
- package/src/api/server/index.ts +0 -11
- package/src/api/session/extension.ts +0 -205
- package/src/api/session/index.ts +0 -7
- package/src/api/signal/extension.ts +0 -125
- package/src/api/signal/packets.ts +0 -61
- package/src/api/signal/signal.ts +0 -67
- package/src/api/table/extension.ts +0 -554
- package/src/api/table/packets.ts +0 -252
- package/src/api/table/table.ts +0 -113
- package/src/app.ts +0 -95
- package/src/const.ts +0 -2
- package/src/errors.ts +0 -70
- package/src/event/index.ts +0 -18
- package/src/helper.ts +0 -16
- package/src/identifier.ts +0 -256
- package/src/index.ts +0 -87
- package/src/localization/locale.ts +0 -737
- package/src/lock.ts +0 -43
- package/src/network/connection.ts +0 -45
- package/src/network/encryption.ts +0 -221
- package/src/network/frame-transport.ts +0 -186
- package/src/network/network.ts +0 -322
- package/src/network/packet/packet-types.ts +0 -164
- package/src/network/packet/packet.ts +0 -55
- package/src/network/websocket-transport.ts +0 -123
- package/src/omu.ts +0 -156
- package/src/result.ts +0 -78
- package/src/serialize/bytebuffer.ts +0 -432
- package/src/serialize/serializer.ts +0 -149
- package/src/token.ts +0 -39
- package/src/version.ts +0 -2
- package/tsconfig.json +0 -18
- /package/{src/address.ts → dist/dts/address.d.ts} +0 -0
- /package/{src/api/signal/index.ts → dist/dts/api/signal/index.d.ts} +0 -0
- /package/{src/serialize/index.ts → dist/dts/serialize/index.d.ts} +0 -0
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import { App, AppJson } from '../../app';
|
|
2
|
-
import { Identifier, IdentifierMap, IdentifierSet, IntoId } from '../../identifier';
|
|
3
|
-
import { PacketType } from '../../network/packet';
|
|
4
|
-
import { Omu } from '../../omu';
|
|
5
|
-
import { Serializer } from '../../serialize';
|
|
6
|
-
import { SessionParam } from '../../token';
|
|
7
|
-
import { EndpointType } from '../endpoint';
|
|
8
|
-
import { Extension, ExtensionType } from '../extension';
|
|
9
|
-
import { SessionObserver } from '../server/extension';
|
|
10
|
-
import { Table, TableType } from '../table';
|
|
11
|
-
|
|
12
|
-
export const SESSION_EXTENSION_TYPE: ExtensionType<SessionExtension> = new ExtensionType('sessions', (omu: Omu) => new SessionExtension(omu));
|
|
13
|
-
|
|
14
|
-
export const SESSIONS_READ_PERMISSION_ID: Identifier = SESSION_EXTENSION_TYPE.join('read');
|
|
15
|
-
const SESSION_TABLE_TYPE = TableType.createJson(SESSION_EXTENSION_TYPE, {
|
|
16
|
-
name: 'sessions',
|
|
17
|
-
serializer: App,
|
|
18
|
-
key: (app) => app.id.key(),
|
|
19
|
-
permissions: {
|
|
20
|
-
read: SESSIONS_READ_PERMISSION_ID,
|
|
21
|
-
},
|
|
22
|
-
});
|
|
23
|
-
const REQUIRE_APPS_PACKET_TYPE = PacketType.createJson<Identifier[]>(SESSION_EXTENSION_TYPE, {
|
|
24
|
-
name: 'require',
|
|
25
|
-
serializer: Serializer.of(Identifier).toArray(),
|
|
26
|
-
});
|
|
27
|
-
const SESSION_OBSERVE_PACKET_TYPE = PacketType.createJson<Identifier[]>(SESSION_EXTENSION_TYPE, {
|
|
28
|
-
name: 'observe',
|
|
29
|
-
serializer: Serializer.of(Identifier).toArray(),
|
|
30
|
-
});
|
|
31
|
-
const SESSION_CONNECTED_PACKET_TYPE = PacketType.createJson<App>(SESSION_EXTENSION_TYPE, {
|
|
32
|
-
name: 'session_connected',
|
|
33
|
-
serializer: App,
|
|
34
|
-
});
|
|
35
|
-
const SESSION_DISCONNECTED_PACKET_TYPE = PacketType.createJson<App>(SESSION_EXTENSION_TYPE, {
|
|
36
|
-
name: 'session_disconnected',
|
|
37
|
-
serializer: App,
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
type RemoteAppRequestPayload = {
|
|
41
|
-
app: AppJson;
|
|
42
|
-
permissions: string[];
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export type RequestRemoteAppResponse = {
|
|
46
|
-
type: 'success';
|
|
47
|
-
token: string;
|
|
48
|
-
lan_ip: string;
|
|
49
|
-
} | {
|
|
50
|
-
type: 'error';
|
|
51
|
-
message: string;
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
export const REMOTE_APP_REQUEST_PERMISSION_ID: Identifier = SESSION_EXTENSION_TYPE.join('remote_app', 'request');
|
|
55
|
-
|
|
56
|
-
const REMOTE_APP_REQUEST_ENDPOINT_TYPE = EndpointType.createJson<RemoteAppRequestPayload, RequestRemoteAppResponse>(SESSION_EXTENSION_TYPE, {
|
|
57
|
-
name: 'remote_app_request',
|
|
58
|
-
permissionId: REMOTE_APP_REQUEST_PERMISSION_ID,
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
export type GenerateTokenResponse = {
|
|
62
|
-
type: 'success';
|
|
63
|
-
token: string;
|
|
64
|
-
} | {
|
|
65
|
-
type: 'error';
|
|
66
|
-
message: string;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
export const GENERATE_TOKEN_PERMISSION_ID: Identifier = SESSION_EXTENSION_TYPE.join('generate_token');
|
|
70
|
-
|
|
71
|
-
type GenerateTokenPayload = {
|
|
72
|
-
app: AppJson;
|
|
73
|
-
permissions: string[];
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
const GENERATE_TOKEN_ENDPOINT_TYPE = EndpointType.createJson<GenerateTokenPayload, GenerateTokenResponse>(SESSION_EXTENSION_TYPE, {
|
|
77
|
-
name: 'generate_token',
|
|
78
|
-
permissionId: GENERATE_TOKEN_PERMISSION_ID,
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
export class SessionExtension implements Extension {
|
|
82
|
-
public readonly type: ExtensionType<SessionExtension> = SESSION_EXTENSION_TYPE;
|
|
83
|
-
public readonly sessions: Table<App>;
|
|
84
|
-
private readonly sessionObservers = new IdentifierMap<SessionObserver>();
|
|
85
|
-
private readonly requiredApps = new IdentifierSet();
|
|
86
|
-
|
|
87
|
-
constructor(private readonly omu: Omu) {
|
|
88
|
-
omu.network.registerPacket(
|
|
89
|
-
REQUIRE_APPS_PACKET_TYPE,
|
|
90
|
-
SESSION_OBSERVE_PACKET_TYPE,
|
|
91
|
-
SESSION_CONNECTED_PACKET_TYPE,
|
|
92
|
-
SESSION_DISCONNECTED_PACKET_TYPE,
|
|
93
|
-
);
|
|
94
|
-
omu.network.addPacketHandler(
|
|
95
|
-
SESSION_CONNECTED_PACKET_TYPE, (app) => this.handleSessionConnect(app),
|
|
96
|
-
);
|
|
97
|
-
omu.network.addPacketHandler(
|
|
98
|
-
SESSION_DISCONNECTED_PACKET_TYPE, (app) => this.handleSessionDisconnect(app),
|
|
99
|
-
);
|
|
100
|
-
this.sessions = omu.tables.get(SESSION_TABLE_TYPE);
|
|
101
|
-
omu.network.addTask(() => this.onTask());
|
|
102
|
-
omu.onReady(() => this.onReady());
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
public async has(id: IntoId): Promise<boolean> {
|
|
106
|
-
return await this.sessions.has(Identifier.from(id).key());
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
public observe(appId: IntoId, options?: {
|
|
110
|
-
onConnect?(app: App): void;
|
|
111
|
-
onDisconnect?(app: App): void;
|
|
112
|
-
}): SessionObserver {
|
|
113
|
-
const id = Identifier.from(appId);
|
|
114
|
-
if (this.omu.running) {
|
|
115
|
-
this.omu.send(SESSION_OBSERVE_PACKET_TYPE, [id]);
|
|
116
|
-
}
|
|
117
|
-
const observer = this.sessionObservers.get(id) ?? new SessionObserver([], []);
|
|
118
|
-
if (options?.onConnect) {
|
|
119
|
-
observer.onConnect(options.onConnect);
|
|
120
|
-
}
|
|
121
|
-
if (options?.onDisconnect) {
|
|
122
|
-
observer.onDisconnect(options.onDisconnect);
|
|
123
|
-
}
|
|
124
|
-
this.sessionObservers.set(id, observer);
|
|
125
|
-
return observer;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
private async handleSessionConnect(app: App): Promise<void> {
|
|
129
|
-
const observer = this.sessionObservers.get(app.id);
|
|
130
|
-
if (!observer) {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
for (const callback of observer.onConnectCallbacks) {
|
|
134
|
-
await callback(app);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
private async handleSessionDisconnect(app: App): Promise<void> {
|
|
139
|
-
const observer = this.sessionObservers.get(app.id);
|
|
140
|
-
if (!observer) {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
for (const callback of observer.onDisconnectCallbacks) {
|
|
144
|
-
await callback(app);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
public require(...appIds: IntoId[]): void {
|
|
149
|
-
if (this.omu.running) {
|
|
150
|
-
throw new Error('Cannot require apps after the client has started');
|
|
151
|
-
}
|
|
152
|
-
for (const appId of appIds) {
|
|
153
|
-
this.requiredApps.add(Identifier.from(appId));
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
private async onTask(): Promise<void> {
|
|
158
|
-
if (this.requiredApps.size > 0) {
|
|
159
|
-
this.omu.send(REQUIRE_APPS_PACKET_TYPE, Array.from(this.requiredApps.values()));
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
private async onReady(): Promise<void> {
|
|
164
|
-
if (this.sessionObservers.size > 0) {
|
|
165
|
-
this.omu.send(SESSION_OBSERVE_PACKET_TYPE, Array.from(this.sessionObservers.keys()));
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
public async requestRemoteApp(options: {
|
|
170
|
-
app: App;
|
|
171
|
-
permissions: IntoId[];
|
|
172
|
-
}): Promise<RequestRemoteAppResponse> {
|
|
173
|
-
const { app } = options;
|
|
174
|
-
if (!app.url) {
|
|
175
|
-
throw new Error('App must have a URL to request it remotely');
|
|
176
|
-
}
|
|
177
|
-
if (app.type !== 'remote') {
|
|
178
|
-
throw new Error('App must be a remote app to request it remotely');
|
|
179
|
-
}
|
|
180
|
-
if (!app.metadata) {
|
|
181
|
-
throw new Error('App must have metadata to request it remotely');
|
|
182
|
-
}
|
|
183
|
-
return this.omu.endpoints.call(REMOTE_APP_REQUEST_ENDPOINT_TYPE, {
|
|
184
|
-
app: App.serialize(options.app),
|
|
185
|
-
permissions: options.permissions.map(id => Identifier.from(id).key()),
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
public async generateToken(options: {
|
|
190
|
-
app: App;
|
|
191
|
-
permissions?: IntoId[];
|
|
192
|
-
}): Promise<SessionParam> {
|
|
193
|
-
const result = await this.omu.endpoints.call(GENERATE_TOKEN_ENDPOINT_TYPE, {
|
|
194
|
-
app: App.serialize(options.app),
|
|
195
|
-
permissions: options.permissions?.map(id => Identifier.from(id).key()),
|
|
196
|
-
});
|
|
197
|
-
if (result.type === 'error') {
|
|
198
|
-
throw new Error(result.message);
|
|
199
|
-
}
|
|
200
|
-
return {
|
|
201
|
-
token: result.token,
|
|
202
|
-
address: this.omu.address,
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
}
|
package/src/api/session/index.ts
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import type { Unlisten } from '../../event';
|
|
2
|
-
import { Identifier, IdentifierMap } from '../../identifier';
|
|
3
|
-
import { PacketType } from '../../network/packet';
|
|
4
|
-
import { Omu } from '../../omu';
|
|
5
|
-
import { JsonType, Serializable } from '../../serialize';
|
|
6
|
-
import { ExtensionType, type Extension } from '../extension.js';
|
|
7
|
-
import { SignalPacket, SignalRegisterPacket } from './packets.js';
|
|
8
|
-
import { SignalType, type Signal } from './signal.js';
|
|
9
|
-
|
|
10
|
-
export const SIGNAL_EXTENSION_TYPE: ExtensionType<SignalExtension> = new ExtensionType(
|
|
11
|
-
'signal',
|
|
12
|
-
(omu: Omu) => new SignalExtension(omu),
|
|
13
|
-
);
|
|
14
|
-
|
|
15
|
-
const SIGNAL_REGISTER_PACKET = PacketType.createJson<SignalRegisterPacket>(SIGNAL_EXTENSION_TYPE, {
|
|
16
|
-
name: 'register',
|
|
17
|
-
serializer: SignalRegisterPacket,
|
|
18
|
-
});
|
|
19
|
-
const SIGNAL_LISTEN_PACKET = PacketType.createJson<Identifier>(SIGNAL_EXTENSION_TYPE, {
|
|
20
|
-
name: 'listen',
|
|
21
|
-
serializer: Identifier,
|
|
22
|
-
});
|
|
23
|
-
const SIGNAL_NOTIFY_PACKET = PacketType.createSerialized<SignalPacket>(SIGNAL_EXTENSION_TYPE, {
|
|
24
|
-
name: 'notify',
|
|
25
|
-
serializer: SignalPacket,
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
export class SignalExtension implements Extension {
|
|
29
|
-
public readonly type: ExtensionType<SignalExtension> = SIGNAL_EXTENSION_TYPE;
|
|
30
|
-
private readonly signals = new IdentifierMap<SignalType<unknown>>();
|
|
31
|
-
|
|
32
|
-
constructor(private readonly omu: Omu) {
|
|
33
|
-
omu.network.registerPacket(
|
|
34
|
-
SIGNAL_REGISTER_PACKET,
|
|
35
|
-
SIGNAL_LISTEN_PACKET,
|
|
36
|
-
SIGNAL_NOTIFY_PACKET,
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
private createSignal<T>(signalType: SignalType<T>): Signal<T> {
|
|
41
|
-
if (this.signals.has(signalType.id)) {
|
|
42
|
-
throw new Error(`Signal for key ${signalType.id} already created`);
|
|
43
|
-
}
|
|
44
|
-
return new SignalImpl(this.omu, signalType);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
public json<T, D extends JsonType = JsonType>(name: string, options?: { serializer?: Serializable<T, D> }): Signal<T> {
|
|
48
|
-
const id = this.omu.app.id.base.join(name);
|
|
49
|
-
const type = SignalType.createJson<T>(id, {
|
|
50
|
-
name,
|
|
51
|
-
serializer: options?.serializer,
|
|
52
|
-
});
|
|
53
|
-
return this.createSignal(type);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
public serialized<T>(name: string, options: { serializer: Serializable<T, Uint8Array> }): Signal<T> {
|
|
57
|
-
const id = this.omu.app.id.base.join(name);
|
|
58
|
-
const type = SignalType.createSerialized<T>(id, {
|
|
59
|
-
name,
|
|
60
|
-
serializer: options?.serializer,
|
|
61
|
-
});
|
|
62
|
-
return this.createSignal(type);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
public get<T>(signalType: SignalType<T>): Signal<T> {
|
|
66
|
-
return this.createSignal(signalType);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
class SignalImpl<T> implements Signal<T> {
|
|
71
|
-
private readonly listeners: ((value: T) => void)[] = [];
|
|
72
|
-
private listening = false;
|
|
73
|
-
|
|
74
|
-
constructor(
|
|
75
|
-
private readonly omu: Omu,
|
|
76
|
-
private readonly type: SignalType<T>,
|
|
77
|
-
) {
|
|
78
|
-
omu.network.addPacketHandler(SIGNAL_NOTIFY_PACKET, (data) => this.handleBroadcast(data));
|
|
79
|
-
omu.network.addTask(() => this.onTask());
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
public notify(body: T): void {
|
|
83
|
-
const data = this.type.serializer.serialize(body);
|
|
84
|
-
this.omu.send(SIGNAL_NOTIFY_PACKET, {
|
|
85
|
-
id: this.type.id,
|
|
86
|
-
body: data,
|
|
87
|
-
});
|
|
88
|
-
for (const listener of this.listeners) {
|
|
89
|
-
listener(body);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
public listen(handler: (value: T) => void): Unlisten {
|
|
94
|
-
if (!this.listening) {
|
|
95
|
-
this.omu.onReady(() => {
|
|
96
|
-
this.omu.send(SIGNAL_LISTEN_PACKET, this.type.id);
|
|
97
|
-
});
|
|
98
|
-
this.listening = true;
|
|
99
|
-
}
|
|
100
|
-
this.listeners.push(handler);
|
|
101
|
-
return () => {
|
|
102
|
-
this.listeners.splice(this.listeners.indexOf(handler), 1);
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
private handleBroadcast(data: SignalPacket): void {
|
|
107
|
-
if (!data.id.isEqual(this.type.id)) {
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
const body = this.type.serializer.deserialize(data.body);
|
|
111
|
-
for (const listener of this.listeners) {
|
|
112
|
-
listener(body);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
private onTask(): void {
|
|
117
|
-
if (!this.type.id.isSubpathOf(this.omu.app.id)) {
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
this.omu.send(SIGNAL_REGISTER_PACKET, {
|
|
121
|
-
id: this.type.id,
|
|
122
|
-
permissions: this.type.permissions,
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { Identifier } from '../../identifier';
|
|
2
|
-
import { ByteReader, ByteWriter } from '../../serialize';
|
|
3
|
-
|
|
4
|
-
import { SignalPermissions, SignalPermissionsJSON } from './signal.js';
|
|
5
|
-
|
|
6
|
-
export class SignalPacket {
|
|
7
|
-
constructor(
|
|
8
|
-
public readonly id: Identifier,
|
|
9
|
-
public readonly body: Uint8Array,
|
|
10
|
-
) { }
|
|
11
|
-
|
|
12
|
-
public static serialize(packet: SignalPacket): Uint8Array {
|
|
13
|
-
const writer = new ByteWriter();
|
|
14
|
-
writer.writeString(packet.id.key());
|
|
15
|
-
writer.writeUint8Array(packet.body);
|
|
16
|
-
return writer.finish();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
public static deserialize(data: Uint8Array): SignalPacket {
|
|
20
|
-
const reader = ByteReader.fromUint8Array(data);
|
|
21
|
-
const id = Identifier.fromKey(reader.readString());
|
|
22
|
-
const body = reader.readUint8Array();
|
|
23
|
-
return new SignalPacket(id, body);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
interface SignalRegisterPacketJSON {
|
|
28
|
-
id: string;
|
|
29
|
-
permissions: SignalPermissionsJSON;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export class SignalRegisterPacket {
|
|
33
|
-
constructor(
|
|
34
|
-
public readonly id: Identifier,
|
|
35
|
-
public readonly permissions: SignalPermissions,
|
|
36
|
-
) {}
|
|
37
|
-
|
|
38
|
-
public static serialize(packet: SignalRegisterPacket): SignalRegisterPacketJSON {
|
|
39
|
-
const { permissions: perms } = packet;
|
|
40
|
-
return {
|
|
41
|
-
id: packet.id.key(),
|
|
42
|
-
permissions: {
|
|
43
|
-
all: perms.all ? Identifier.from(perms.all).key() : undefined,
|
|
44
|
-
listen: perms.listen ? Identifier.from(perms.listen).key() : undefined,
|
|
45
|
-
send: perms.send ? Identifier.from(perms.send).key() : undefined,
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
public static deserialize(data: SignalRegisterPacketJSON): SignalRegisterPacket {
|
|
51
|
-
const { permissions: perms } = data;
|
|
52
|
-
return new SignalRegisterPacket(
|
|
53
|
-
Identifier.fromKey(data.id),
|
|
54
|
-
{
|
|
55
|
-
all: perms.all ? Identifier.fromKey(perms.all) : undefined,
|
|
56
|
-
listen: perms.listen ? Identifier.fromKey(perms.listen) : undefined,
|
|
57
|
-
send: perms.send ? Identifier.fromKey(perms.send) : undefined,
|
|
58
|
-
},
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
}
|
package/src/api/signal/signal.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import type { Unlisten } from '../../event';
|
|
2
|
-
import { Identifier, IntoId } from '../../identifier';
|
|
3
|
-
import type { Serializable } from '../../serialize';
|
|
4
|
-
import { Serializer } from '../../serialize';
|
|
5
|
-
|
|
6
|
-
export interface SignalPermissionsJSON {
|
|
7
|
-
all?: string;
|
|
8
|
-
listen?: string;
|
|
9
|
-
send?: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface SignalPermissions {
|
|
13
|
-
all?: IntoId | undefined;
|
|
14
|
-
listen?: IntoId | undefined;
|
|
15
|
-
send?: IntoId | undefined;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export class SignalType<T> {
|
|
19
|
-
constructor(
|
|
20
|
-
public readonly id: Identifier,
|
|
21
|
-
public readonly serializer: Serializable<T, Uint8Array>,
|
|
22
|
-
public readonly permissions: SignalPermissions,
|
|
23
|
-
) {}
|
|
24
|
-
|
|
25
|
-
static createJson<T>(
|
|
26
|
-
identifier: IntoId,
|
|
27
|
-
{
|
|
28
|
-
name,
|
|
29
|
-
serializer,
|
|
30
|
-
permissions,
|
|
31
|
-
}: {
|
|
32
|
-
name: string;
|
|
33
|
-
serializer?: Serializable<T, any>;
|
|
34
|
-
permissions?: SignalPermissions;
|
|
35
|
-
},
|
|
36
|
-
): SignalType<T> {
|
|
37
|
-
return new SignalType(
|
|
38
|
-
Identifier.from(identifier).join(name),
|
|
39
|
-
Serializer.of<T, any>(serializer ?? Serializer.noop()).toJson(),
|
|
40
|
-
permissions ?? {},
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
static createSerialized<T>(
|
|
45
|
-
identifier: IntoId,
|
|
46
|
-
{
|
|
47
|
-
name,
|
|
48
|
-
serializer,
|
|
49
|
-
permissions,
|
|
50
|
-
}: {
|
|
51
|
-
name: string;
|
|
52
|
-
serializer: Serializable<T, Uint8Array>;
|
|
53
|
-
permissions?: SignalPermissions;
|
|
54
|
-
},
|
|
55
|
-
): SignalType<T> {
|
|
56
|
-
return new SignalType(
|
|
57
|
-
Identifier.from(identifier).join(name),
|
|
58
|
-
serializer,
|
|
59
|
-
permissions ?? {},
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface Signal<T> {
|
|
65
|
-
listen(handler: (value: T) => void): Unlisten;
|
|
66
|
-
notify(body: T): void;
|
|
67
|
-
}
|