@omujs/omu 0.1.22
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/.eslintignore +13 -0
- package/.eslintrc.cjs +6 -0
- package/.prettierignore +1 -0
- package/CHANGELOG.md +268 -0
- package/LICENSE +21 -0
- package/README.md +1 -0
- package/built/dts/address.d.ts +6 -0
- package/built/dts/address.d.ts.map +1 -0
- package/built/dts/app.d.ts +38 -0
- package/built/dts/app.d.ts.map +1 -0
- package/built/dts/bytebuffer.d.ts +46 -0
- package/built/dts/bytebuffer.d.ts.map +1 -0
- package/built/dts/client/client.d.ts +47 -0
- package/built/dts/client/client.d.ts.map +1 -0
- package/built/dts/client/index.d.ts +2 -0
- package/built/dts/client/index.d.ts.map +1 -0
- package/built/dts/client/omu.d.ts +53 -0
- package/built/dts/client/omu.d.ts.map +1 -0
- package/built/dts/client/omuclient.d.ts +50 -0
- package/built/dts/client/omuclient.d.ts.map +1 -0
- package/built/dts/client/token.d.ts +14 -0
- package/built/dts/client/token.d.ts.map +1 -0
- package/built/dts/client.d.ts +48 -0
- package/built/dts/client.d.ts.map +1 -0
- package/built/dts/const.d.ts +3 -0
- package/built/dts/const.d.ts.map +1 -0
- package/built/dts/errors.d.ts +29 -0
- package/built/dts/errors.d.ts.map +1 -0
- package/built/dts/event-emitter.d.ts +7 -0
- package/built/dts/event-emitter.d.ts.map +1 -0
- package/built/dts/extension/asset/asset-extension.d.ts +26 -0
- package/built/dts/extension/asset/asset-extension.d.ts.map +1 -0
- package/built/dts/extension/asset/index.d.ts +2 -0
- package/built/dts/extension/asset/index.d.ts.map +1 -0
- package/built/dts/extension/dashboard/dashboard-extension.d.ts +24 -0
- package/built/dts/extension/dashboard/dashboard-extension.d.ts.map +1 -0
- package/built/dts/extension/dashboard/dashboard.d.ts +8 -0
- package/built/dts/extension/dashboard/dashboard.d.ts.map +1 -0
- package/built/dts/extension/dashboard/index.d.ts +3 -0
- package/built/dts/extension/dashboard/index.d.ts.map +1 -0
- package/built/dts/extension/dashboard/packets.d.ts +20 -0
- package/built/dts/extension/dashboard/packets.d.ts.map +1 -0
- package/built/dts/extension/endpoint/endpoint-extension.d.ts +16 -0
- package/built/dts/extension/endpoint/endpoint-extension.d.ts.map +1 -0
- package/built/dts/extension/endpoint/endpoint.d.ts +22 -0
- package/built/dts/extension/endpoint/endpoint.d.ts.map +1 -0
- package/built/dts/extension/endpoint/index.d.ts +3 -0
- package/built/dts/extension/endpoint/index.d.ts.map +1 -0
- package/built/dts/extension/endpoint/packets.d.ts +24 -0
- package/built/dts/extension/endpoint/packets.d.ts.map +1 -0
- package/built/dts/extension/extension-registry.d.ts +12 -0
- package/built/dts/extension/extension-registry.d.ts.map +1 -0
- package/built/dts/extension/extension.d.ts +12 -0
- package/built/dts/extension/extension.d.ts.map +1 -0
- package/built/dts/extension/i18n/i18n-extension.d.ts +19 -0
- package/built/dts/extension/i18n/i18n-extension.d.ts.map +1 -0
- package/built/dts/extension/i18n/index.d.ts +2 -0
- package/built/dts/extension/i18n/index.d.ts.map +1 -0
- package/built/dts/extension/index.d.ts +3 -0
- package/built/dts/extension/index.d.ts.map +1 -0
- package/built/dts/extension/logger/index.d.ts +2 -0
- package/built/dts/extension/logger/index.d.ts.map +1 -0
- package/built/dts/extension/logger/logger-extension.d.ts +25 -0
- package/built/dts/extension/logger/logger-extension.d.ts.map +1 -0
- package/built/dts/extension/logger/packets.d.ts +19 -0
- package/built/dts/extension/logger/packets.d.ts.map +1 -0
- package/built/dts/extension/permission/index.d.ts +3 -0
- package/built/dts/extension/permission/index.d.ts.map +1 -0
- package/built/dts/extension/permission/permission-extension.d.ts +18 -0
- package/built/dts/extension/permission/permission-extension.d.ts.map +1 -0
- package/built/dts/extension/permission/permission.d.ts +29 -0
- package/built/dts/extension/permission/permission.d.ts.map +1 -0
- package/built/dts/extension/plugin/index.d.ts +2 -0
- package/built/dts/extension/plugin/index.d.ts.map +1 -0
- package/built/dts/extension/plugin/package-info.d.ts +85 -0
- package/built/dts/extension/plugin/package-info.d.ts.map +1 -0
- package/built/dts/extension/plugin/plugin-extension.d.ts +11 -0
- package/built/dts/extension/plugin/plugin-extension.d.ts.map +1 -0
- package/built/dts/extension/registry/index.d.ts +3 -0
- package/built/dts/extension/registry/index.d.ts.map +1 -0
- package/built/dts/extension/registry/packets.d.ts +17 -0
- package/built/dts/extension/registry/packets.d.ts.map +1 -0
- package/built/dts/extension/registry/registry-extension.d.ts +15 -0
- package/built/dts/extension/registry/registry-extension.d.ts.map +1 -0
- package/built/dts/extension/registry/registry.d.ts +39 -0
- package/built/dts/extension/registry/registry.d.ts.map +1 -0
- package/built/dts/extension/server/index.d.ts +2 -0
- package/built/dts/extension/server/index.d.ts.map +1 -0
- package/built/dts/extension/server/packets.d.ts +8 -0
- package/built/dts/extension/server/packets.d.ts.map +1 -0
- package/built/dts/extension/server/server-extension.d.ts +19 -0
- package/built/dts/extension/server/server-extension.d.ts.map +1 -0
- package/built/dts/extension/signal/index.d.ts +3 -0
- package/built/dts/extension/signal/index.d.ts.map +1 -0
- package/built/dts/extension/signal/packets.d.ts +17 -0
- package/built/dts/extension/signal/packets.d.ts.map +1 -0
- package/built/dts/extension/signal/signal-extension.d.ts +14 -0
- package/built/dts/extension/signal/signal-extension.d.ts.map +1 -0
- package/built/dts/extension/signal/signal.d.ts +32 -0
- package/built/dts/extension/signal/signal.d.ts.map +1 -0
- package/built/dts/extension/table/index.d.ts +3 -0
- package/built/dts/extension/table/index.d.ts.map +1 -0
- package/built/dts/extension/table/packets.d.ts +58 -0
- package/built/dts/extension/table/packets.d.ts.map +1 -0
- package/built/dts/extension/table/table-extension.d.ts +24 -0
- package/built/dts/extension/table/table-extension.d.ts.map +1 -0
- package/built/dts/extension/table/table.d.ts +64 -0
- package/built/dts/extension/table/table.d.ts.map +1 -0
- package/built/dts/identifier.d.ts +43 -0
- package/built/dts/identifier.d.ts.map +1 -0
- package/built/dts/index.d.ts +5 -0
- package/built/dts/index.d.ts.map +1 -0
- package/built/dts/interface.d.ts +7 -0
- package/built/dts/interface.d.ts.map +1 -0
- package/built/dts/localization/index.d.ts +3 -0
- package/built/dts/localization/index.d.ts.map +1 -0
- package/built/dts/localization/locale.d.ts +736 -0
- package/built/dts/localization/locale.d.ts.map +1 -0
- package/built/dts/localization/localization.d.ts +8 -0
- package/built/dts/localization/localization.d.ts.map +1 -0
- package/built/dts/model.d.ts +5 -0
- package/built/dts/model.d.ts.map +1 -0
- package/built/dts/network/connection.d.ts +17 -0
- package/built/dts/network/connection.d.ts.map +1 -0
- package/built/dts/network/index.d.ts +4 -0
- package/built/dts/network/index.d.ts.map +1 -0
- package/built/dts/network/network.d.ts +45 -0
- package/built/dts/network/network.d.ts.map +1 -0
- package/built/dts/network/packet/index.d.ts +3 -0
- package/built/dts/network/packet/index.d.ts.map +1 -0
- package/built/dts/network/packet/packet-types.d.ts +52 -0
- package/built/dts/network/packet/packet-types.d.ts.map +1 -0
- package/built/dts/network/packet/packet.d.ts +24 -0
- package/built/dts/network/packet/packet.d.ts.map +1 -0
- package/built/dts/network/websocket-connection.d.ts +20 -0
- package/built/dts/network/websocket-connection.d.ts.map +1 -0
- package/built/dts/omu.d.ts +50 -0
- package/built/dts/omu.d.ts.map +1 -0
- package/built/dts/serializer.d.ts +21 -0
- package/built/dts/serializer.d.ts.map +1 -0
- package/built/dts/token.d.ts +14 -0
- package/built/dts/token.d.ts.map +1 -0
- package/built/esm/address.js +2 -0
- package/built/esm/address.js.map +1 -0
- package/built/esm/app.js +33 -0
- package/built/esm/app.js.map +1 -0
- package/built/esm/bytebuffer.js +191 -0
- package/built/esm/bytebuffer.js.map +1 -0
- package/built/esm/client/client.js +2 -0
- package/built/esm/client/client.js.map +1 -0
- package/built/esm/client/index.js +2 -0
- package/built/esm/client/index.js.map +1 -0
- package/built/esm/client/omu.js +96 -0
- package/built/esm/client/omu.js.map +1 -0
- package/built/esm/client/omuclient.js +96 -0
- package/built/esm/client/omuclient.js.map +1 -0
- package/built/esm/client/token.js +21 -0
- package/built/esm/client/token.js.map +1 -0
- package/built/esm/client.js +2 -0
- package/built/esm/client.js.map +1 -0
- package/built/esm/const.js +3 -0
- package/built/esm/const.js.map +1 -0
- package/built/esm/errors.js +46 -0
- package/built/esm/errors.js.map +1 -0
- package/built/esm/event-emitter.js +15 -0
- package/built/esm/event-emitter.js.map +1 -0
- package/built/esm/extension/asset/asset-extension.js +105 -0
- package/built/esm/extension/asset/asset-extension.js.map +1 -0
- package/built/esm/extension/asset/index.js +2 -0
- package/built/esm/extension/asset/index.js.map +1 -0
- package/built/esm/extension/dashboard/dashboard-extension.js +119 -0
- package/built/esm/extension/dashboard/dashboard-extension.js.map +1 -0
- package/built/esm/extension/dashboard/dashboard.js +2 -0
- package/built/esm/extension/dashboard/dashboard.js.map +1 -0
- package/built/esm/extension/dashboard/index.js +2 -0
- package/built/esm/extension/dashboard/index.js.map +1 -0
- package/built/esm/extension/dashboard/packets.js +52 -0
- package/built/esm/extension/dashboard/packets.js.map +1 -0
- package/built/esm/extension/endpoint/endpoint-extension.js +85 -0
- package/built/esm/extension/endpoint/endpoint-extension.js.map +1 -0
- package/built/esm/extension/endpoint/endpoint.js +22 -0
- package/built/esm/extension/endpoint/endpoint.js.map +1 -0
- package/built/esm/extension/endpoint/index.js +2 -0
- package/built/esm/extension/endpoint/index.js.map +1 -0
- package/built/esm/extension/endpoint/packets.js +77 -0
- package/built/esm/extension/endpoint/packets.js.map +1 -0
- package/built/esm/extension/extension-registry.js +34 -0
- package/built/esm/extension/extension-registry.js.map +1 -0
- package/built/esm/extension/extension.js +16 -0
- package/built/esm/extension/extension.js.map +1 -0
- package/built/esm/extension/i18n/i18n-extension.js +59 -0
- package/built/esm/extension/i18n/i18n-extension.js.map +1 -0
- package/built/esm/extension/i18n/index.js +2 -0
- package/built/esm/extension/i18n/index.js.map +1 -0
- package/built/esm/extension/index.js +3 -0
- package/built/esm/extension/index.js.map +1 -0
- package/built/esm/extension/logger/index.js +2 -0
- package/built/esm/extension/logger/index.js.map +1 -0
- package/built/esm/extension/logger/logger-extension.js +59 -0
- package/built/esm/extension/logger/logger-extension.js.map +1 -0
- package/built/esm/extension/logger/packets.js +33 -0
- package/built/esm/extension/logger/packets.js.map +1 -0
- package/built/esm/extension/permission/index.js +3 -0
- package/built/esm/extension/permission/index.js.map +1 -0
- package/built/esm/extension/permission/permission-extension.js +73 -0
- package/built/esm/extension/permission/permission-extension.js.map +1 -0
- package/built/esm/extension/permission/permission.js +28 -0
- package/built/esm/extension/permission/permission.js.map +1 -0
- package/built/esm/extension/plugin/index.js +2 -0
- package/built/esm/extension/plugin/index.js.map +1 -0
- package/built/esm/extension/plugin/package-info.js +2 -0
- package/built/esm/extension/plugin/package-info.js.map +1 -0
- package/built/esm/extension/plugin/plugin-extension.js +27 -0
- package/built/esm/extension/plugin/plugin-extension.js.map +1 -0
- package/built/esm/extension/registry/index.js +3 -0
- package/built/esm/extension/registry/index.js.map +1 -0
- package/built/esm/extension/registry/packets.js +48 -0
- package/built/esm/extension/registry/packets.js.map +1 -0
- package/built/esm/extension/registry/registry-extension.js +123 -0
- package/built/esm/extension/registry/registry-extension.js.map +1 -0
- package/built/esm/extension/registry/registry.js +55 -0
- package/built/esm/extension/registry/registry.js.map +1 -0
- package/built/esm/extension/server/index.js +2 -0
- package/built/esm/extension/server/index.js.map +1 -0
- package/built/esm/extension/server/packets.js +25 -0
- package/built/esm/extension/server/packets.js.map +1 -0
- package/built/esm/extension/server/server-extension.js +52 -0
- package/built/esm/extension/server/server-extension.js.map +1 -0
- package/built/esm/extension/signal/index.js +3 -0
- package/built/esm/extension/signal/index.js.map +1 -0
- package/built/esm/extension/signal/packets.js +44 -0
- package/built/esm/extension/signal/packets.js.map +1 -0
- package/built/esm/extension/signal/signal-extension.js +91 -0
- package/built/esm/extension/signal/signal-extension.js.map +1 -0
- package/built/esm/extension/signal/signal.js +53 -0
- package/built/esm/extension/signal/signal.js.map +1 -0
- package/built/esm/extension/table/index.js +3 -0
- package/built/esm/extension/table/index.js.map +1 -0
- package/built/esm/extension/table/packets.js +230 -0
- package/built/esm/extension/table/packets.js.map +1 -0
- package/built/esm/extension/table/table-extension.js +384 -0
- package/built/esm/extension/table/table-extension.js.map +1 -0
- package/built/esm/extension/table/table.js +17 -0
- package/built/esm/extension/table/table.js.map +1 -0
- package/built/esm/identifier.js +160 -0
- package/built/esm/identifier.js.map +1 -0
- package/built/esm/index.js +5 -0
- package/built/esm/index.js.map +1 -0
- package/built/esm/interface.js +2 -0
- package/built/esm/interface.js.map +1 -0
- package/built/esm/localization/index.js +2 -0
- package/built/esm/localization/index.js.map +1 -0
- package/built/esm/localization/locale.js +736 -0
- package/built/esm/localization/locale.js.map +1 -0
- package/built/esm/localization/localization.js +2 -0
- package/built/esm/localization/localization.js.map +1 -0
- package/built/esm/model.js +2 -0
- package/built/esm/model.js.map +1 -0
- package/built/esm/network/connection.js +29 -0
- package/built/esm/network/connection.js.map +1 -0
- package/built/esm/network/index.js +2 -0
- package/built/esm/network/index.js.map +1 -0
- package/built/esm/network/network.js +190 -0
- package/built/esm/network/network.js.map +1 -0
- package/built/esm/network/packet/index.js +2 -0
- package/built/esm/network/packet/index.js.map +1 -0
- package/built/esm/network/packet/packet-types.js +75 -0
- package/built/esm/network/packet/packet-types.js.map +1 -0
- package/built/esm/network/packet/packet.js +17 -0
- package/built/esm/network/packet/packet.js.map +1 -0
- package/built/esm/network/websocket-connection.js +88 -0
- package/built/esm/network/websocket-connection.js.map +1 -0
- package/built/esm/omu.js +96 -0
- package/built/esm/omu.js.map +1 -0
- package/built/esm/serializer.js +52 -0
- package/built/esm/serializer.js.map +1 -0
- package/built/esm/token.js +21 -0
- package/built/esm/token.js.map +1 -0
- package/package.json +49 -0
- package/src/address.ts +5 -0
- package/src/app.ts +65 -0
- package/src/bytebuffer.ts +219 -0
- package/src/client.ts +53 -0
- package/src/const.ts +2 -0
- package/src/errors.ts +52 -0
- package/src/event-emitter.ts +18 -0
- package/src/extension/asset/asset-extension.ts +148 -0
- package/src/extension/asset/index.ts +1 -0
- package/src/extension/dashboard/dashboard-extension.ts +162 -0
- package/src/extension/dashboard/dashboard.ts +9 -0
- package/src/extension/dashboard/index.ts +3 -0
- package/src/extension/dashboard/packets.ts +52 -0
- package/src/extension/endpoint/endpoint-extension.ts +124 -0
- package/src/extension/endpoint/endpoint.ts +58 -0
- package/src/extension/endpoint/index.ts +3 -0
- package/src/extension/endpoint/packets.ts +78 -0
- package/src/extension/extension-registry.ts +39 -0
- package/src/extension/extension.ts +18 -0
- package/src/extension/i18n/i18n-extension.ts +73 -0
- package/src/extension/i18n/index.ts +2 -0
- package/src/extension/index.ts +3 -0
- package/src/extension/logger/index.ts +5 -0
- package/src/extension/logger/logger-extension.ts +75 -0
- package/src/extension/logger/packets.ts +38 -0
- package/src/extension/permission/index.ts +3 -0
- package/src/extension/permission/permission-extension.ts +98 -0
- package/src/extension/permission/permission.ts +56 -0
- package/src/extension/plugin/index.ts +2 -0
- package/src/extension/plugin/package-info.ts +91 -0
- package/src/extension/plugin/plugin-extension.ts +37 -0
- package/src/extension/registry/index.ts +3 -0
- package/src/extension/registry/packets.ts +50 -0
- package/src/extension/registry/registry-extension.ts +154 -0
- package/src/extension/registry/registry.ts +97 -0
- package/src/extension/server/index.ts +6 -0
- package/src/extension/server/server-extension.ts +63 -0
- package/src/extension/signal/index.ts +3 -0
- package/src/extension/signal/packets.ts +46 -0
- package/src/extension/signal/signal-extension.ts +114 -0
- package/src/extension/signal/signal.ts +85 -0
- package/src/extension/table/index.ts +3 -0
- package/src/extension/table/packets.ts +237 -0
- package/src/extension/table/table-extension.ts +503 -0
- package/src/extension/table/table.ts +87 -0
- package/src/identifier.ts +197 -0
- package/src/index.ts +4 -0
- package/src/interface.ts +8 -0
- package/src/localization/index.ts +3 -0
- package/src/localization/locale.ts +737 -0
- package/src/localization/localization.ts +9 -0
- package/src/model.ts +4 -0
- package/src/network/connection.ts +43 -0
- package/src/network/index.ts +3 -0
- package/src/network/network.ts +225 -0
- package/src/network/packet/index.ts +2 -0
- package/src/network/packet/packet-types.ts +101 -0
- package/src/network/packet/packet.ts +46 -0
- package/src/network/websocket-connection.ts +102 -0
- package/src/omu.ts +123 -0
- package/src/serializer.ts +82 -0
- package/src/token.ts +29 -0
- package/tsconfig.json +12 -0
package/src/model.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Identifier, IdentifierMap } from '../identifier.js';
|
|
2
|
+
import type { Serializable } from '../serializer.js';
|
|
3
|
+
|
|
4
|
+
import type { PacketData, PacketType } from './packet/index.js';
|
|
5
|
+
import type { Packet } from './packet/packet.js';
|
|
6
|
+
|
|
7
|
+
export class PacketMapper implements Serializable<Packet, PacketData> {
|
|
8
|
+
private readonly packetMap = new IdentifierMap<PacketType<unknown>>();
|
|
9
|
+
|
|
10
|
+
public register(...packetTypes: PacketType<unknown>[]): void {
|
|
11
|
+
for (const type of packetTypes) {
|
|
12
|
+
if (this.packetMap.has(type.id)) {
|
|
13
|
+
throw new Error(`Packet id ${type.id.key()} already registered`);
|
|
14
|
+
}
|
|
15
|
+
this.packetMap.set(type.id, type);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
serialize(packet: Packet): PacketData {
|
|
20
|
+
return {
|
|
21
|
+
type: packet.type.id.key(),
|
|
22
|
+
data: packet.type.serializer.serialize(packet.data),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
deserialize(data: PacketData): Packet {
|
|
27
|
+
const identifier = Identifier.fromKey(data.type);
|
|
28
|
+
const type = this.packetMap.get(identifier);
|
|
29
|
+
if (!type) throw new Error(`Packet type ${data.type} not registered`);
|
|
30
|
+
return {
|
|
31
|
+
type,
|
|
32
|
+
data: type.serializer.deserialize(data.data),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface Connection {
|
|
38
|
+
connect(): Promise<void>;
|
|
39
|
+
send(packet: Packet, serializer: Serializable<Packet, PacketData>): void;
|
|
40
|
+
receive(serializer: Serializable<Packet, PacketData>): Promise<Packet | null>;
|
|
41
|
+
close(): void;
|
|
42
|
+
closed: boolean;
|
|
43
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import type { Address } from '../address.js';
|
|
2
|
+
import type { Client } from '../client.js';
|
|
3
|
+
import type { OmuError } from '../errors.js';
|
|
4
|
+
import {
|
|
5
|
+
AnotherConnection,
|
|
6
|
+
InvalidOrigin,
|
|
7
|
+
InvalidPacket,
|
|
8
|
+
InvalidToken,
|
|
9
|
+
InvalidVersion,
|
|
10
|
+
PermissionDenied,
|
|
11
|
+
} from '../errors.js';
|
|
12
|
+
import { EventEmitter } from '../event-emitter.js';
|
|
13
|
+
import { IdentifierMap } from '../identifier.js';
|
|
14
|
+
import type { TokenProvider } from '../token.js';
|
|
15
|
+
|
|
16
|
+
import type { Connection } from './connection.js';
|
|
17
|
+
import { PacketMapper } from './connection.js';
|
|
18
|
+
import { ConnectPacket, DisconnectType, PACKET_TYPES } from './packet/packet-types.js';
|
|
19
|
+
import type { Packet, PacketType } from './packet/packet.js';
|
|
20
|
+
|
|
21
|
+
type PacketHandler<T> = {
|
|
22
|
+
readonly type: PacketType<T>;
|
|
23
|
+
event: EventEmitter<(packet: T) => void>;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export enum NetworkStatus {
|
|
27
|
+
DISCONNECTED = 'disconnected',
|
|
28
|
+
CONNECTING = 'connecting',
|
|
29
|
+
CONNECTED = 'connected',
|
|
30
|
+
READY = 'ready',
|
|
31
|
+
ERROR = 'error',
|
|
32
|
+
CLOSED = 'closed',
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class Network {
|
|
36
|
+
public status: NetworkStatus = NetworkStatus.DISCONNECTED;
|
|
37
|
+
public readonly event = {
|
|
38
|
+
connected: new EventEmitter<() => void>(),
|
|
39
|
+
disconnected: new EventEmitter<() => void>(),
|
|
40
|
+
packet: new EventEmitter<(packet: Packet) => void>(),
|
|
41
|
+
status: new EventEmitter<(status: NetworkStatus) => void>(),
|
|
42
|
+
};
|
|
43
|
+
private readonly tasks: Array<() => Promise<void> | void> = [];
|
|
44
|
+
private readonly packetMapper = new PacketMapper();
|
|
45
|
+
private readonly packetHandlers = new IdentifierMap<PacketHandler<unknown>>();
|
|
46
|
+
|
|
47
|
+
constructor(
|
|
48
|
+
private readonly client: Client,
|
|
49
|
+
public readonly address: Address,
|
|
50
|
+
private readonly tokenProvider: TokenProvider,
|
|
51
|
+
private connection: Connection,
|
|
52
|
+
) {
|
|
53
|
+
this.registerPacket(
|
|
54
|
+
PACKET_TYPES.CONNECT,
|
|
55
|
+
PACKET_TYPES.DISCONNECT,
|
|
56
|
+
PACKET_TYPES.TOKEN,
|
|
57
|
+
PACKET_TYPES.READY,
|
|
58
|
+
);
|
|
59
|
+
this.addPacketHandler(PACKET_TYPES.TOKEN, async (token: string) => {
|
|
60
|
+
await this.tokenProvider.set(this.address, this.client.app, token);
|
|
61
|
+
});
|
|
62
|
+
this.addPacketHandler(PACKET_TYPES.DISCONNECT, (reason) => {
|
|
63
|
+
if (reason.type === DisconnectType.SHUTDOWN || reason.type === DisconnectType.CLOSE) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.setStatus(NetworkStatus.ERROR);
|
|
67
|
+
const ERROR_MAP: Record<DisconnectType, typeof OmuError | undefined> = {
|
|
68
|
+
[DisconnectType.ANOTHER_CONNECTION]: AnotherConnection,
|
|
69
|
+
[DisconnectType.PERMISSION_DENIED]: PermissionDenied,
|
|
70
|
+
[DisconnectType.INVALID_TOKEN]: InvalidToken,
|
|
71
|
+
[DisconnectType.INVALID_ORIGIN]: InvalidOrigin,
|
|
72
|
+
[DisconnectType.INVALID_VERSION]: InvalidVersion,
|
|
73
|
+
[DisconnectType.INVALID_PACKET]: InvalidPacket,
|
|
74
|
+
[DisconnectType.INVALID_PACKET_TYPE]: InvalidPacket,
|
|
75
|
+
[DisconnectType.INVALID_PACKET_DATA]: InvalidPacket,
|
|
76
|
+
[DisconnectType.CLOSE]: undefined,
|
|
77
|
+
[DisconnectType.SHUTDOWN]: undefined,
|
|
78
|
+
};
|
|
79
|
+
const error = ERROR_MAP[reason.type];
|
|
80
|
+
if (error) {
|
|
81
|
+
throw new error(reason.message);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
this.addPacketHandler(PACKET_TYPES.READY, () => {
|
|
85
|
+
if (this.status === NetworkStatus.READY) {
|
|
86
|
+
throw new Error('Received READY packet when already ready');
|
|
87
|
+
}
|
|
88
|
+
this.setStatus(NetworkStatus.READY);
|
|
89
|
+
this.event.status.emit(NetworkStatus.READY);
|
|
90
|
+
this.client.event.ready.emit();
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public setConnection(connection: Connection): void {
|
|
95
|
+
if (this.status !== NetworkStatus.DISCONNECTED) {
|
|
96
|
+
throw new Error('Cannot change connection while connected');
|
|
97
|
+
}
|
|
98
|
+
this.connection = connection;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
public registerPacket(...packetTypes: PacketType<unknown>[]): void {
|
|
102
|
+
this.packetMapper.register(...packetTypes);
|
|
103
|
+
for (const type of packetTypes) {
|
|
104
|
+
this.packetHandlers.set(type.id, {
|
|
105
|
+
type,
|
|
106
|
+
event: new EventEmitter(),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public addPacketHandler<T>(type: PacketType<T>, handler: (packet: T) => void): void {
|
|
112
|
+
const listeners = this.packetHandlers.get(type.id) as PacketHandler<unknown> | undefined;
|
|
113
|
+
if (!listeners) {
|
|
114
|
+
throw new Error(`Packet type ${type.id.key()} not registered`);
|
|
115
|
+
}
|
|
116
|
+
listeners.event.listen(handler as (packet: unknown) => void);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public async connect(recconect = true): Promise<void> {
|
|
120
|
+
if (this.status !== NetworkStatus.DISCONNECTED) {
|
|
121
|
+
throw new Error(`Cannot connect while ${this.status}`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
try {
|
|
125
|
+
await this.connection.connect();
|
|
126
|
+
} catch (error) {
|
|
127
|
+
if (recconect) {
|
|
128
|
+
await this.tryReconnect();
|
|
129
|
+
} else {
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
this.setStatus(NetworkStatus.CONNECTING);
|
|
134
|
+
const token = await this.tokenProvider.get(this.address, this.client.app);
|
|
135
|
+
this.send({
|
|
136
|
+
type: PACKET_TYPES.CONNECT,
|
|
137
|
+
data: new ConnectPacket({
|
|
138
|
+
app: this.client.app,
|
|
139
|
+
token,
|
|
140
|
+
}),
|
|
141
|
+
});
|
|
142
|
+
const listenPromise = this.listen();
|
|
143
|
+
await this.event.status.emit(NetworkStatus.CONNECTED);
|
|
144
|
+
await this.event.connected.emit();
|
|
145
|
+
await this.dispatchTasks();
|
|
146
|
+
this.send({
|
|
147
|
+
type: PACKET_TYPES.READY,
|
|
148
|
+
data: null,
|
|
149
|
+
});
|
|
150
|
+
await listenPromise;
|
|
151
|
+
|
|
152
|
+
if (recconect) {
|
|
153
|
+
await this.tryReconnect();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private async tryReconnect(): Promise<void> {
|
|
158
|
+
if (this.status === NetworkStatus.CLOSED) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
162
|
+
await this.connect();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
public disconnect(): void {
|
|
166
|
+
if (this.status === NetworkStatus.CLOSED) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
this.setStatus(NetworkStatus.DISCONNECTED);
|
|
170
|
+
this.event.status.emit(NetworkStatus.DISCONNECTED);
|
|
171
|
+
this.connection.close();
|
|
172
|
+
this.event.disconnected.emit();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
public send(packet: Packet): void {
|
|
176
|
+
if (this.connection.closed) {
|
|
177
|
+
throw new Error('Cannot send packet while connection is closed');
|
|
178
|
+
}
|
|
179
|
+
this.connection.send(packet, this.packetMapper);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
private async listen(): Promise<void> {
|
|
183
|
+
while (!this.connection.closed) {
|
|
184
|
+
const packet = await this.connection.receive(this.packetMapper);
|
|
185
|
+
if (!packet) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
this.dispatchPacket(packet);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
private async dispatchPacket(packet: Packet): Promise<void> {
|
|
193
|
+
await this.event.packet.emit(packet);
|
|
194
|
+
const packetHandler = this.packetHandlers.get(packet.type.id);
|
|
195
|
+
if (!packetHandler) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
await packetHandler.event.emit(packet.data);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
public addTask(task: () => Promise<void> | void): void {
|
|
202
|
+
if (this.client.running) {
|
|
203
|
+
throw new Error('Cannot add task after client is ready');
|
|
204
|
+
}
|
|
205
|
+
this.tasks.push(task);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
public removeTask(task: () => Promise<void> | void): void {
|
|
209
|
+
this.tasks.splice(this.tasks.indexOf(task), 1);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
private async dispatchTasks(): Promise<void> {
|
|
213
|
+
for (const task of this.tasks) {
|
|
214
|
+
await task();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
private setStatus(status: NetworkStatus): void {
|
|
219
|
+
if (this.status === status) {
|
|
220
|
+
throw new Error(`Cannot set status to ${status} when already ${status}`);
|
|
221
|
+
}
|
|
222
|
+
this.status = status;
|
|
223
|
+
this.event.status.emit(status);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { AppJson } from '../../app.js';
|
|
2
|
+
import { App } from '../../app.js';
|
|
3
|
+
import { Identifier } from '../../identifier.js';
|
|
4
|
+
import type { Model } from '../../model.js';
|
|
5
|
+
import { Serializer } from '../../serializer.js';
|
|
6
|
+
|
|
7
|
+
import { PacketType } from './packet.js';
|
|
8
|
+
|
|
9
|
+
const IDENTIFIER = new Identifier('core', 'packet');
|
|
10
|
+
|
|
11
|
+
type ConnectPacketJson = {
|
|
12
|
+
app: AppJson,
|
|
13
|
+
token?: string,
|
|
14
|
+
};
|
|
15
|
+
export class ConnectPacket implements Model<ConnectPacketJson> {
|
|
16
|
+
public readonly app: App;
|
|
17
|
+
public readonly token?: string;
|
|
18
|
+
constructor(options: {
|
|
19
|
+
app: App,
|
|
20
|
+
token?: string,
|
|
21
|
+
}) {
|
|
22
|
+
this.app = options.app;
|
|
23
|
+
this.token = options.token;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
static fromJson(data: ConnectPacketJson): ConnectPacket {
|
|
27
|
+
return new ConnectPacket({
|
|
28
|
+
app: App.fromJson(data.app),
|
|
29
|
+
token: data.token,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
toJson(): ConnectPacketJson {
|
|
34
|
+
return {
|
|
35
|
+
app: this.app.toJson(),
|
|
36
|
+
token: this.token,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export enum DisconnectType {
|
|
42
|
+
INVALID_TOKEN = 'invalid_token',
|
|
43
|
+
INVALID_ORIGIN = 'invalid_origin',
|
|
44
|
+
INVALID_VERSION = 'invalid_version',
|
|
45
|
+
INVALID_PACKET_TYPE = 'invalid_packet_type',
|
|
46
|
+
INVALID_PACKET_DATA = 'invalid_packet_data',
|
|
47
|
+
INVALID_PACKET = 'invalid_packet',
|
|
48
|
+
ANOTHER_CONNECTION = 'another_connection',
|
|
49
|
+
PERMISSION_DENIED = 'permission_denied',
|
|
50
|
+
SHUTDOWN = 'shutdown',
|
|
51
|
+
CLOSE = 'close',
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
type DisconnectPacketJson = {
|
|
55
|
+
type: DisconnectType,
|
|
56
|
+
message: string | null,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export class DisconnectPacket implements Model<DisconnectPacketJson> {
|
|
60
|
+
public readonly type: DisconnectType;
|
|
61
|
+
public readonly message: string | null;
|
|
62
|
+
|
|
63
|
+
constructor(options: {
|
|
64
|
+
type: DisconnectType,
|
|
65
|
+
message?: string | null,
|
|
66
|
+
}) {
|
|
67
|
+
this.type = options.type;
|
|
68
|
+
this.message = options.message ?? null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
static fromJson(data: DisconnectPacketJson): DisconnectPacket {
|
|
72
|
+
return new DisconnectPacket({
|
|
73
|
+
type: data.type,
|
|
74
|
+
message: data.message,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
toJson(): DisconnectPacketJson {
|
|
79
|
+
return {
|
|
80
|
+
type: this.type,
|
|
81
|
+
message: this.message,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export const PACKET_TYPES = {
|
|
87
|
+
CONNECT: PacketType.createJson<ConnectPacket>(IDENTIFIER, {
|
|
88
|
+
name: 'connect',
|
|
89
|
+
serializer: Serializer.model(ConnectPacket),
|
|
90
|
+
}),
|
|
91
|
+
DISCONNECT: PacketType.createJson<DisconnectPacket>(IDENTIFIER, {
|
|
92
|
+
name: 'disconnect',
|
|
93
|
+
serializer: Serializer.model(DisconnectPacket),
|
|
94
|
+
}),
|
|
95
|
+
TOKEN: PacketType.createJson<string>(IDENTIFIER, {
|
|
96
|
+
name: 'token',
|
|
97
|
+
}),
|
|
98
|
+
READY: PacketType.createJson<undefined>(IDENTIFIER, {
|
|
99
|
+
name: 'ready',
|
|
100
|
+
}),
|
|
101
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Identifier } from '../../identifier.js';
|
|
2
|
+
import { Serializer, type Serializable } from '../../serializer.js';
|
|
3
|
+
|
|
4
|
+
export interface PacketData {
|
|
5
|
+
readonly type: string;
|
|
6
|
+
readonly data: Uint8Array;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface Packet<T = unknown> {
|
|
10
|
+
readonly type: PacketType<T>;
|
|
11
|
+
readonly data: T;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class PacketType<T> {
|
|
15
|
+
constructor(
|
|
16
|
+
public readonly id: Identifier,
|
|
17
|
+
public readonly serializer: Serializable<T, Uint8Array>,
|
|
18
|
+
) { }
|
|
19
|
+
|
|
20
|
+
static createJson<T>(identifier: Identifier, {
|
|
21
|
+
name,
|
|
22
|
+
serializer,
|
|
23
|
+
}: {
|
|
24
|
+
name: string;
|
|
25
|
+
serializer?: Serializable<T, any>;
|
|
26
|
+
}): PacketType<T> {
|
|
27
|
+
return new PacketType(
|
|
28
|
+
identifier.join(name),
|
|
29
|
+
Serializer.of<T, any>(serializer ?? Serializer.noop())
|
|
30
|
+
.pipe(Serializer.json()),
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static createSerialized<T>(identifier: Identifier, {
|
|
35
|
+
name,
|
|
36
|
+
serializer,
|
|
37
|
+
}: {
|
|
38
|
+
name: string;
|
|
39
|
+
serializer: Serializable<T, Uint8Array>;
|
|
40
|
+
}): PacketType<T> {
|
|
41
|
+
return new PacketType(
|
|
42
|
+
identifier.join(name),
|
|
43
|
+
serializer,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
|
|
2
|
+
import type { Address } from '../address.js';
|
|
3
|
+
import { ByteReader, ByteWriter } from '../bytebuffer.js';
|
|
4
|
+
import type { Serializable } from '../serializer.js';
|
|
5
|
+
|
|
6
|
+
import type { Connection } from './connection.js';
|
|
7
|
+
import type { Packet, PacketData } from './packet/packet.js';
|
|
8
|
+
|
|
9
|
+
export class WebsocketConnection implements Connection {
|
|
10
|
+
public connected: boolean;
|
|
11
|
+
private socket: WebSocket | null;
|
|
12
|
+
private readonly packetQueue: Array<PacketData> = [];
|
|
13
|
+
private receiveWaiter: (() => void) | null = null;
|
|
14
|
+
|
|
15
|
+
constructor(
|
|
16
|
+
private readonly address: Address,
|
|
17
|
+
) {
|
|
18
|
+
this.connected = false;
|
|
19
|
+
this.socket = null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private get wsEndpoint(): string {
|
|
23
|
+
const protocol = this.address.secure ? 'wss' : 'ws';
|
|
24
|
+
const { host, port } = this.address;
|
|
25
|
+
return `${protocol}://${host}:${port}/ws`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public connect(): Promise<void> {
|
|
29
|
+
if (this.socket && !this.connected) {
|
|
30
|
+
throw new Error('Already connecting');
|
|
31
|
+
}
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
this.close();
|
|
34
|
+
this.socket = new WebSocket(this.wsEndpoint);
|
|
35
|
+
this.socket.onerror = reject;
|
|
36
|
+
this.socket.onclose = (): void => { this.close(); };
|
|
37
|
+
this.socket.onmessage = (event): void => { this.onMessage(event); };
|
|
38
|
+
this.socket.onopen = (): void => {
|
|
39
|
+
this.connected = true;
|
|
40
|
+
resolve();
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private async onMessage(event: MessageEvent<string | Blob>): Promise<void> {
|
|
46
|
+
if (typeof event.data === 'string') {
|
|
47
|
+
throw new Error('Received string data');
|
|
48
|
+
}
|
|
49
|
+
const reader = new ByteReader(await event.data.arrayBuffer());
|
|
50
|
+
this.packetQueue.push({
|
|
51
|
+
type: reader.readString(),
|
|
52
|
+
data: reader.readByteArray(),
|
|
53
|
+
});
|
|
54
|
+
reader.finish();
|
|
55
|
+
if (this.receiveWaiter) {
|
|
56
|
+
this.receiveWaiter();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public async receive(serializer: Serializable<Packet<unknown>, PacketData>): Promise<Packet | null> {
|
|
61
|
+
if (this.receiveWaiter) {
|
|
62
|
+
throw new Error('Already receiving');
|
|
63
|
+
}
|
|
64
|
+
if (!this.connected || !this.socket) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
while (this.packetQueue.length === 0) {
|
|
68
|
+
await new Promise<void>((resolve) => {
|
|
69
|
+
this.receiveWaiter = (): void => resolve();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const packet = serializer.deserialize(this.packetQueue.shift()!);
|
|
73
|
+
this.receiveWaiter = null;
|
|
74
|
+
return packet;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
get closed(): boolean {
|
|
78
|
+
if (this.socket) {
|
|
79
|
+
return this.socket.readyState === WebSocket.CLOSED;
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
close(): void {
|
|
85
|
+
this.connected = false;
|
|
86
|
+
if (this.socket) {
|
|
87
|
+
this.socket.close();
|
|
88
|
+
this.socket = null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
send(packet: Packet, serializer: Serializable<Packet<unknown>, PacketData>): void {
|
|
93
|
+
if (!this.connected || !this.socket) {
|
|
94
|
+
throw new Error('Not connected');
|
|
95
|
+
}
|
|
96
|
+
const packetData = serializer.serialize(packet);
|
|
97
|
+
const writer = new ByteWriter();
|
|
98
|
+
writer.writeString(packetData.type);
|
|
99
|
+
writer.writeByteArray(packetData.data);
|
|
100
|
+
this.socket.send(writer.finish());
|
|
101
|
+
}
|
|
102
|
+
}
|
package/src/omu.ts
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { App } from './app.js';
|
|
2
|
+
import type { Client, ClientEvents } from './client.js';
|
|
3
|
+
import type { Unlisten } from './event-emitter.js';
|
|
4
|
+
import { EventEmitter } from './event-emitter.js';
|
|
5
|
+
import { ASSET_EXTENSION_TYPE, type AssetExtension } from './extension/asset/index.js';
|
|
6
|
+
import { DASHBOARD_EXTENSION_TYPE, type DashboardExtension } from './extension/dashboard/index.js';
|
|
7
|
+
import { ENDPOINT_EXTENSION_TYPE, type EndpointExtension } from './extension/endpoint/index.js';
|
|
8
|
+
import { I18N_EXTENSION_TYPE, type I18nExtension } from './extension/i18n/index.js';
|
|
9
|
+
import { ExtensionRegistry } from './extension/index.js';
|
|
10
|
+
import {
|
|
11
|
+
LOGGER_EXTENSION_TYPE,
|
|
12
|
+
type LoggerExtension,
|
|
13
|
+
} from './extension/logger/logger-extension.js';
|
|
14
|
+
import {
|
|
15
|
+
PERMISSION_EXTENSION_TYPE,
|
|
16
|
+
type PermissionExtension,
|
|
17
|
+
} from './extension/permission/index.js';
|
|
18
|
+
import { PLUGIN_EXTENSION_TYPE, type PluginExtension } from './extension/plugin/index.js';
|
|
19
|
+
import { REGISTRY_EXTENSION_TYPE, type RegistryExtension } from './extension/registry/index.js';
|
|
20
|
+
import { SERVER_EXTENSION_TYPE, type ServerExtension } from './extension/server/index.js';
|
|
21
|
+
import { SIGNAL_EXTENSION_TYPE, type SignalExtension } from './extension/signal/index.js';
|
|
22
|
+
import { TABLE_EXTENSION_TYPE, type TableExtension } from './extension/table/index.js';
|
|
23
|
+
import type { Connection, Address } from './network/index.js';
|
|
24
|
+
import { Network } from './network/index.js';
|
|
25
|
+
import type { PacketType } from './network/packet/packet.js';
|
|
26
|
+
import { WebsocketConnection } from './network/websocket-connection.js';
|
|
27
|
+
import { BrowserTokenProvider, type TokenProvider } from './token.js';
|
|
28
|
+
|
|
29
|
+
export class Omu implements Client {
|
|
30
|
+
public ready: boolean;
|
|
31
|
+
public running: boolean;
|
|
32
|
+
readonly event: ClientEvents = {
|
|
33
|
+
started: new EventEmitter(),
|
|
34
|
+
stopped: new EventEmitter(),
|
|
35
|
+
ready: new EventEmitter(),
|
|
36
|
+
};
|
|
37
|
+
readonly token: TokenProvider;
|
|
38
|
+
readonly address: Address;
|
|
39
|
+
readonly network: Network;
|
|
40
|
+
readonly endpoints: EndpointExtension;
|
|
41
|
+
readonly permissions: PermissionExtension;
|
|
42
|
+
readonly plugins: PluginExtension;
|
|
43
|
+
readonly dashboard: DashboardExtension;
|
|
44
|
+
readonly extensions: ExtensionRegistry;
|
|
45
|
+
readonly tables: TableExtension;
|
|
46
|
+
readonly registry: RegistryExtension;
|
|
47
|
+
readonly signal: SignalExtension;
|
|
48
|
+
readonly assets: AssetExtension;
|
|
49
|
+
readonly i18n: I18nExtension;
|
|
50
|
+
readonly server: ServerExtension;
|
|
51
|
+
readonly logger: LoggerExtension;
|
|
52
|
+
|
|
53
|
+
constructor(
|
|
54
|
+
public readonly app: App,
|
|
55
|
+
options?: {
|
|
56
|
+
address?: Address;
|
|
57
|
+
token?: TokenProvider;
|
|
58
|
+
connection?: Connection;
|
|
59
|
+
},
|
|
60
|
+
) {
|
|
61
|
+
this.ready = false;
|
|
62
|
+
this.running = false;
|
|
63
|
+
this.token = options?.token ?? new BrowserTokenProvider('omu-token');
|
|
64
|
+
this.address = options?.address ?? {
|
|
65
|
+
host: '127.0.0.1',
|
|
66
|
+
port: 26423,
|
|
67
|
+
secure: false,
|
|
68
|
+
};
|
|
69
|
+
this.network = new Network(
|
|
70
|
+
this,
|
|
71
|
+
this.address,
|
|
72
|
+
this.token,
|
|
73
|
+
options?.connection ?? new WebsocketConnection(this.address),
|
|
74
|
+
);
|
|
75
|
+
this.extensions = new ExtensionRegistry(this);
|
|
76
|
+
|
|
77
|
+
this.endpoints = this.extensions.register(ENDPOINT_EXTENSION_TYPE);
|
|
78
|
+
this.permissions = this.extensions.register(PERMISSION_EXTENSION_TYPE);
|
|
79
|
+
this.plugins = this.extensions.register(PLUGIN_EXTENSION_TYPE);
|
|
80
|
+
this.tables = this.extensions.register(TABLE_EXTENSION_TYPE);
|
|
81
|
+
this.dashboard = this.extensions.register(DASHBOARD_EXTENSION_TYPE);
|
|
82
|
+
this.registry = this.extensions.register(REGISTRY_EXTENSION_TYPE);
|
|
83
|
+
this.signal = this.extensions.register(SIGNAL_EXTENSION_TYPE);
|
|
84
|
+
this.assets = this.extensions.register(ASSET_EXTENSION_TYPE);
|
|
85
|
+
this.i18n = this.extensions.register(I18N_EXTENSION_TYPE);
|
|
86
|
+
this.server = this.extensions.register(SERVER_EXTENSION_TYPE);
|
|
87
|
+
this.logger = this.extensions.register(LOGGER_EXTENSION_TYPE);
|
|
88
|
+
this.event.ready.listen(() => {
|
|
89
|
+
this.ready = true;
|
|
90
|
+
});
|
|
91
|
+
this.network.event.disconnected.listen(() => {
|
|
92
|
+
this.ready = false;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public send<T>(packetType: PacketType<T>, data: T): void {
|
|
97
|
+
this.network.send({
|
|
98
|
+
type: packetType,
|
|
99
|
+
data,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public start(): void {
|
|
104
|
+
if (this.running) {
|
|
105
|
+
throw new Error('Client already running');
|
|
106
|
+
}
|
|
107
|
+
this.running = true;
|
|
108
|
+
this.network.connect();
|
|
109
|
+
this.event.started.emit();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public stop(): void {
|
|
113
|
+
this.running = false;
|
|
114
|
+
this.event.stopped.emit();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
public whenReady(callback: () => void): Unlisten {
|
|
118
|
+
if (this.ready) {
|
|
119
|
+
callback();
|
|
120
|
+
}
|
|
121
|
+
return this.event.ready.listen(callback);
|
|
122
|
+
}
|
|
123
|
+
}
|