@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
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import type { Client } from '../../client.js';
|
|
2
|
+
import type { Unlisten } from '../../event-emitter.js';
|
|
3
|
+
import { EventEmitter } from '../../event-emitter.js';
|
|
4
|
+
import { Identifier, IdentifierMap } from '../../identifier.js';
|
|
5
|
+
import { PacketType } from '../../network/packet/index.js';
|
|
6
|
+
import { Serializer } from '../../serializer.js';
|
|
7
|
+
import { EndpointType } from '../endpoint/endpoint.js';
|
|
8
|
+
import { ExtensionType, type Extension } from '../extension.js';
|
|
9
|
+
|
|
10
|
+
import { RegistryPacket, RegistryRegisterPacket } from './packets.js';
|
|
11
|
+
import { RegistryType, type Registry } from './registry.js';
|
|
12
|
+
|
|
13
|
+
export class RegistryExtension implements Extension {
|
|
14
|
+
private readonly registries = new IdentifierMap<Registry<unknown>>();
|
|
15
|
+
|
|
16
|
+
constructor(private readonly client: Client) {
|
|
17
|
+
client.network.registerPacket(
|
|
18
|
+
REGISTRY_REGISTER_PACKET,
|
|
19
|
+
REGISTRY_UPDATE_PACKET,
|
|
20
|
+
REGISTRY_LISTEN_PACKET,
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private createRegistry<T>(registryType: RegistryType<T>): Registry<T> {
|
|
25
|
+
this.client.permissions.require(REGISTRY_PERMISSION_ID);
|
|
26
|
+
if (this.registries.has(registryType.id)) {
|
|
27
|
+
throw new Error(`Registry with identifier '${registryType.id}' already exists`);
|
|
28
|
+
}
|
|
29
|
+
return new RegistryImpl(this.client, registryType);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public get<T>(registryType: RegistryType<T>): Registry<T> {
|
|
33
|
+
const identifier = registryType.id;
|
|
34
|
+
let registry = this.registries.get(identifier);
|
|
35
|
+
if (registry === undefined) {
|
|
36
|
+
registry = this.createRegistry(registryType);
|
|
37
|
+
this.registries.set(identifier, registry);
|
|
38
|
+
}
|
|
39
|
+
return registry as Registry<T>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public create<T>(name: string, defaultValue: T): Registry<T> {
|
|
43
|
+
const identifier = this.client.app.id.join(name);
|
|
44
|
+
if (this.registries.has(identifier)) {
|
|
45
|
+
throw new Error(`Registry with name '${name}' already exists`);
|
|
46
|
+
}
|
|
47
|
+
const tableType = RegistryType.createJson(identifier, {
|
|
48
|
+
name,
|
|
49
|
+
defaultValue,
|
|
50
|
+
});
|
|
51
|
+
return this.createRegistry(tableType);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
class RegistryImpl<T> implements Registry<T> {
|
|
56
|
+
private readonly eventEmitter: EventEmitter<(value: T) => void> = new EventEmitter();
|
|
57
|
+
private listening = false;
|
|
58
|
+
public value: T;
|
|
59
|
+
|
|
60
|
+
constructor(
|
|
61
|
+
private readonly client: Client,
|
|
62
|
+
public readonly type: RegistryType<T>,
|
|
63
|
+
) {
|
|
64
|
+
this.value = type.defaultValue;
|
|
65
|
+
client.network.addPacketHandler(REGISTRY_UPDATE_PACKET, (packet) =>
|
|
66
|
+
this.handleUpdate(packet),
|
|
67
|
+
);
|
|
68
|
+
client.network.addTask(() => this.onTask());
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public async get(): Promise<T> {
|
|
72
|
+
const result = await this.client.endpoints.call(REGISTRY_GET_ENDPOINT, this.type.id);
|
|
73
|
+
if (result.value === null) {
|
|
74
|
+
return this.type.defaultValue;
|
|
75
|
+
}
|
|
76
|
+
return this.type.serializer.deserialize(result.value);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public async set(value: T): Promise<void> {
|
|
80
|
+
this.client.send(REGISTRY_UPDATE_PACKET, {
|
|
81
|
+
id: this.type.id,
|
|
82
|
+
value: this.type.serializer.serialize(value),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public async update(fn: (value: T) => T): Promise<void> {
|
|
87
|
+
const value = await this.get();
|
|
88
|
+
const newValue = await fn(value);
|
|
89
|
+
await this.set(newValue);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public listen(handler: (value: T) => void): Unlisten {
|
|
93
|
+
if (!this.listening) {
|
|
94
|
+
this.client.whenReady(() => {
|
|
95
|
+
this.client.send(REGISTRY_LISTEN_PACKET, this.type.id);
|
|
96
|
+
});
|
|
97
|
+
this.listening = true;
|
|
98
|
+
}
|
|
99
|
+
return this.eventEmitter.listen(handler);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private handleUpdate(data: RegistryPacket): void {
|
|
103
|
+
if (!data.id.isEqual(this.type.id)) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (data.value !== null) {
|
|
107
|
+
this.value = this.type.serializer.deserialize(data.value);
|
|
108
|
+
}
|
|
109
|
+
this.eventEmitter.emit(this.value);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private onTask(): void {
|
|
113
|
+
if (!this.type.id.isSubpathOf(this.client.app.id)) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.client.send(REGISTRY_REGISTER_PACKET, {
|
|
117
|
+
id: this.type.id,
|
|
118
|
+
permissions: this.type.permissions,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export const REGISTRY_EXTENSION_TYPE = new ExtensionType(
|
|
124
|
+
'registry',
|
|
125
|
+
(client: Client) => new RegistryExtension(client),
|
|
126
|
+
);
|
|
127
|
+
export const REGISTRY_PERMISSION_ID = REGISTRY_EXTENSION_TYPE.join('permission');
|
|
128
|
+
const REGISTRY_REGISTER_PACKET = PacketType.createSerialized<RegistryRegisterPacket>(
|
|
129
|
+
REGISTRY_EXTENSION_TYPE,
|
|
130
|
+
{
|
|
131
|
+
name: 'register',
|
|
132
|
+
serializer: RegistryRegisterPacket,
|
|
133
|
+
},
|
|
134
|
+
);
|
|
135
|
+
const REGISTRY_UPDATE_PACKET = PacketType.createSerialized<RegistryPacket>(
|
|
136
|
+
REGISTRY_EXTENSION_TYPE,
|
|
137
|
+
{
|
|
138
|
+
name: 'update',
|
|
139
|
+
serializer: RegistryPacket,
|
|
140
|
+
},
|
|
141
|
+
);
|
|
142
|
+
const REGISTRY_LISTEN_PACKET = PacketType.createJson<Identifier>(REGISTRY_EXTENSION_TYPE, {
|
|
143
|
+
name: 'listen',
|
|
144
|
+
serializer: Serializer.model(Identifier),
|
|
145
|
+
});
|
|
146
|
+
const REGISTRY_GET_ENDPOINT = EndpointType.createSerialized<Identifier, RegistryPacket>(
|
|
147
|
+
REGISTRY_EXTENSION_TYPE,
|
|
148
|
+
{
|
|
149
|
+
name: 'get',
|
|
150
|
+
requestSerializer: Serializer.model(Identifier).toJson(),
|
|
151
|
+
responseSerializer: RegistryPacket,
|
|
152
|
+
permissionId: REGISTRY_PERMISSION_ID,
|
|
153
|
+
},
|
|
154
|
+
);
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { ByteReader, ByteWriter } from '../../bytebuffer.js';
|
|
2
|
+
import { Flags } from '../../bytebuffer.js';
|
|
3
|
+
import type { Unlisten } from '../../event-emitter.js';
|
|
4
|
+
import { Identifier } from '../../identifier.js';
|
|
5
|
+
import type { Serializable } from '../../serializer.js';
|
|
6
|
+
import { Serializer } from '../../serializer.js';
|
|
7
|
+
|
|
8
|
+
export class RegistryPermissions {
|
|
9
|
+
constructor(
|
|
10
|
+
public readonly all?: Identifier,
|
|
11
|
+
public readonly read?: Identifier,
|
|
12
|
+
public readonly write?: Identifier,
|
|
13
|
+
) { }
|
|
14
|
+
|
|
15
|
+
public serialize(writer: ByteWriter): void {
|
|
16
|
+
const flags = new Flags(0, 3);
|
|
17
|
+
flags.set(0, this.all !== undefined);
|
|
18
|
+
flags.set(1, this.read !== undefined);
|
|
19
|
+
flags.set(2, this.write !== undefined);
|
|
20
|
+
writer.writeFlags(flags);
|
|
21
|
+
if (this.all !== undefined) {
|
|
22
|
+
writer.writeString(this.all.key());
|
|
23
|
+
}
|
|
24
|
+
if (this.read !== undefined) {
|
|
25
|
+
writer.writeString(this.read.key());
|
|
26
|
+
}
|
|
27
|
+
if (this.write !== undefined) {
|
|
28
|
+
writer.writeString(this.write.key());
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public static deserialize(reader: ByteReader): RegistryPermissions {
|
|
33
|
+
const flags = reader.readFlags(3);
|
|
34
|
+
const all = flags.has(0) ? Identifier.fromKey(reader.readString()) : undefined;
|
|
35
|
+
const read = flags.has(1) ? Identifier.fromKey(reader.readString()) : undefined;
|
|
36
|
+
const write = flags.has(2) ? Identifier.fromKey(reader.readString()) : undefined;
|
|
37
|
+
return new RegistryPermissions(
|
|
38
|
+
all,
|
|
39
|
+
read,
|
|
40
|
+
write,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class RegistryType<T> {
|
|
46
|
+
constructor(
|
|
47
|
+
public readonly id: Identifier,
|
|
48
|
+
public readonly defaultValue: T,
|
|
49
|
+
public readonly serializer: Serializable<T, Uint8Array>,
|
|
50
|
+
public readonly permissions: RegistryPermissions,
|
|
51
|
+
) { }
|
|
52
|
+
|
|
53
|
+
public static createJson<T>(identifier: Identifier, {
|
|
54
|
+
name,
|
|
55
|
+
defaultValue,
|
|
56
|
+
permissions,
|
|
57
|
+
}: {
|
|
58
|
+
name: string;
|
|
59
|
+
defaultValue: T;
|
|
60
|
+
permissions?: RegistryPermissions;
|
|
61
|
+
}): RegistryType<T> {
|
|
62
|
+
return new RegistryType(
|
|
63
|
+
identifier.join(name),
|
|
64
|
+
defaultValue,
|
|
65
|
+
Serializer.json(),
|
|
66
|
+
permissions ?? new RegistryPermissions(),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public static createSerialized<T>(identifier: Identifier, {
|
|
71
|
+
name,
|
|
72
|
+
defaultValue,
|
|
73
|
+
serializer,
|
|
74
|
+
permissions,
|
|
75
|
+
}: {
|
|
76
|
+
name: string;
|
|
77
|
+
defaultValue: T;
|
|
78
|
+
serializer: Serializable<T, Uint8Array>;
|
|
79
|
+
permissions?: RegistryPermissions;
|
|
80
|
+
}): RegistryType<T> {
|
|
81
|
+
return new RegistryType(
|
|
82
|
+
identifier.join(name),
|
|
83
|
+
defaultValue,
|
|
84
|
+
serializer,
|
|
85
|
+
permissions ?? new RegistryPermissions(),
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface Registry<T> {
|
|
91
|
+
readonly type: RegistryType<T>;
|
|
92
|
+
readonly value: T;
|
|
93
|
+
get(): Promise<T>;
|
|
94
|
+
set(value: T): Promise<void>;
|
|
95
|
+
update(fn: (value: T) => T): Promise<void>;
|
|
96
|
+
listen(fn: (value: T) => void): Unlisten;
|
|
97
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { App } from '../../app.js';
|
|
2
|
+
import type { Client } from '../../client.js';
|
|
3
|
+
import { Identifier, IdentifierSet } from '../../identifier.js';
|
|
4
|
+
import { PacketType } from '../../network/packet/packet.js';
|
|
5
|
+
import { Serializer } from '../../serializer.js';
|
|
6
|
+
import { EndpointType } from '../endpoint/endpoint.js';
|
|
7
|
+
import type { Extension } from '../extension.js';
|
|
8
|
+
import { ExtensionType } from '../extension.js';
|
|
9
|
+
import type { Table } from '../table/index.js';
|
|
10
|
+
import { TABLE_EXTENSION_TYPE } from '../table/table-extension.js';
|
|
11
|
+
import { TableType } from '../table/table.js';
|
|
12
|
+
|
|
13
|
+
export const SERVER_EXTENSION_TYPE: ExtensionType<ServerExtension> = new ExtensionType(
|
|
14
|
+
'server',
|
|
15
|
+
(client: Client) => new ServerExtension(client),
|
|
16
|
+
() => [TABLE_EXTENSION_TYPE],
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
export const SERVER_APPS_READ_PERMISSION_ID = SERVER_EXTENSION_TYPE.join('apps', 'read');
|
|
20
|
+
const APP_TABLE_TYPE = TableType.createModel(SERVER_EXTENSION_TYPE, {
|
|
21
|
+
name: 'apps',
|
|
22
|
+
model: App,
|
|
23
|
+
permissions: {
|
|
24
|
+
read: SERVER_APPS_READ_PERMISSION_ID,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
export const SERVER_SHUTDOWN_PERMISSION_ID = SERVER_EXTENSION_TYPE.join('shutdown');
|
|
28
|
+
const SHUTDOWN_ENDPOINT_TYPE = EndpointType.createJson<boolean, boolean>(SERVER_EXTENSION_TYPE, {
|
|
29
|
+
name: 'shutdown',
|
|
30
|
+
permissionId: SERVER_SHUTDOWN_PERMISSION_ID,
|
|
31
|
+
});
|
|
32
|
+
const REQUIRE_APPS_PACKET_TYPE = PacketType.createJson<Identifier[]>(SERVER_EXTENSION_TYPE, {
|
|
33
|
+
name: 'require_apps',
|
|
34
|
+
serializer: Serializer.model(Identifier).toArray(),
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export class ServerExtension implements Extension {
|
|
38
|
+
public readonly apps: Table<App>;
|
|
39
|
+
private requiredApps = new IdentifierSet();
|
|
40
|
+
|
|
41
|
+
constructor(private readonly client: Client) {
|
|
42
|
+
client.network.registerPacket(REQUIRE_APPS_PACKET_TYPE);
|
|
43
|
+
this.apps = client.tables.get(APP_TABLE_TYPE);
|
|
44
|
+
client.network.addTask(() => this.onTask());
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private async onTask(): Promise<void> {
|
|
48
|
+
this.client.send(REQUIRE_APPS_PACKET_TYPE, Array.from(this.requiredApps.values()));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public async shutdown(restart?: boolean): Promise<boolean> {
|
|
52
|
+
return await this.client.endpoints.call(SHUTDOWN_ENDPOINT_TYPE, restart ?? false);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public require(...appIds: Identifier[]): void {
|
|
56
|
+
if (this.client.running) {
|
|
57
|
+
throw new Error('Cannot require apps after the client has started');
|
|
58
|
+
}
|
|
59
|
+
for (const appId of appIds) {
|
|
60
|
+
this.requiredApps.add(appId);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ByteReader, ByteWriter } from '../../bytebuffer.js';
|
|
2
|
+
import { Identifier } from '../../identifier.js';
|
|
3
|
+
|
|
4
|
+
import { SignalPermissions } 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.writeByteArray(packet.body);
|
|
16
|
+
return writer.finish();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public static deserialize(data: Uint8Array): SignalPacket {
|
|
20
|
+
const reader = new ByteReader(data);
|
|
21
|
+
const id = Identifier.fromKey(reader.readString());
|
|
22
|
+
const body = reader.readByteArray();
|
|
23
|
+
return new SignalPacket(id, body);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class SignalRegisterPacket {
|
|
28
|
+
constructor(
|
|
29
|
+
public readonly id: Identifier,
|
|
30
|
+
public readonly permissions: SignalPermissions,
|
|
31
|
+
) { }
|
|
32
|
+
|
|
33
|
+
public static serialize(packet: SignalRegisterPacket): Uint8Array {
|
|
34
|
+
const writer = new ByteWriter();
|
|
35
|
+
writer.writeString(packet.id.key());
|
|
36
|
+
packet.permissions.serialize(writer);
|
|
37
|
+
return writer.finish();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public static deserialize(data: Uint8Array): SignalRegisterPacket {
|
|
41
|
+
const reader = new ByteReader(data);
|
|
42
|
+
const id = Identifier.fromKey(reader.readString());
|
|
43
|
+
const permissions = SignalPermissions.deserialize(reader);
|
|
44
|
+
return new SignalRegisterPacket(id, permissions);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { Client } from '../../client.js';
|
|
2
|
+
import type { Unlisten } from '../../event-emitter.js';
|
|
3
|
+
import { Identifier, IdentifierMap } from '../../identifier.js';
|
|
4
|
+
import { PacketType } from '../../network/packet/index.js';
|
|
5
|
+
import { Serializer } from '../../serializer.js';
|
|
6
|
+
import { ExtensionType, type Extension } from '../extension.js';
|
|
7
|
+
|
|
8
|
+
import { SignalPacket, SignalRegisterPacket } from './packets.js';
|
|
9
|
+
import type { Signal } from './signal.js';
|
|
10
|
+
import { SignalType } from './signal.js';
|
|
11
|
+
|
|
12
|
+
export const SIGNAL_EXTENSION_TYPE = new ExtensionType(
|
|
13
|
+
'signal',
|
|
14
|
+
(client: Client) => new SignalExtension(client),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
const SIGNAL_REGISTER_PACKET = PacketType.createSerialized<SignalRegisterPacket>(
|
|
18
|
+
SIGNAL_EXTENSION_TYPE,
|
|
19
|
+
{
|
|
20
|
+
name: 'register',
|
|
21
|
+
serializer: SignalRegisterPacket,
|
|
22
|
+
},
|
|
23
|
+
);
|
|
24
|
+
const SIGNAL_LISTEN_PACKET = PacketType.createJson<Identifier>(SIGNAL_EXTENSION_TYPE, {
|
|
25
|
+
name: 'listen',
|
|
26
|
+
serializer: Serializer.model(Identifier),
|
|
27
|
+
});
|
|
28
|
+
const SIGNAL_NOTIFY_PACKET = PacketType.createSerialized<SignalPacket>(SIGNAL_EXTENSION_TYPE, {
|
|
29
|
+
name: 'notify',
|
|
30
|
+
serializer: SignalPacket,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export class SignalExtension implements Extension {
|
|
34
|
+
private readonly signals = new IdentifierMap<SignalType<unknown>>();
|
|
35
|
+
|
|
36
|
+
constructor(private readonly client: Client) {
|
|
37
|
+
client.network.registerPacket(
|
|
38
|
+
SIGNAL_REGISTER_PACKET,
|
|
39
|
+
SIGNAL_LISTEN_PACKET,
|
|
40
|
+
SIGNAL_NOTIFY_PACKET,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private createSignal<T>(signalType: SignalType<T>): Signal<T> {
|
|
45
|
+
if (this.signals.has(signalType.id)) {
|
|
46
|
+
throw new Error(`Signal for key ${signalType.id} already created`);
|
|
47
|
+
}
|
|
48
|
+
return new SignalImpl(this.client, signalType);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public create<T>(name: string): Signal<T> {
|
|
52
|
+
const id = this.client.app.id.join(name);
|
|
53
|
+
const type = SignalType.createJson<T>(id, { name });
|
|
54
|
+
return this.createSignal(type);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public get<T>(signalType: SignalType<T>): Signal<T> {
|
|
58
|
+
return this.createSignal(signalType);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
class SignalImpl<T> implements Signal<T> {
|
|
63
|
+
private readonly listeners: ((value: T) => void)[] = [];
|
|
64
|
+
private listening = false;
|
|
65
|
+
|
|
66
|
+
constructor(
|
|
67
|
+
private readonly client: Client,
|
|
68
|
+
private readonly type: SignalType<T>,
|
|
69
|
+
) {
|
|
70
|
+
client.network.addPacketHandler(SIGNAL_NOTIFY_PACKET, (data) => this.handleBroadcast(data));
|
|
71
|
+
client.network.addTask(() => this.onTask());
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public notify(body: T): void {
|
|
75
|
+
const data = this.type.serializer.serialize(body);
|
|
76
|
+
this.client.send(SIGNAL_NOTIFY_PACKET, {
|
|
77
|
+
id: this.type.id,
|
|
78
|
+
body: data,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public listen(handler: (value: T) => void): Unlisten {
|
|
83
|
+
if (!this.listening) {
|
|
84
|
+
this.client.whenReady(() => {
|
|
85
|
+
this.client.send(SIGNAL_LISTEN_PACKET, this.type.id);
|
|
86
|
+
});
|
|
87
|
+
this.listening = true;
|
|
88
|
+
}
|
|
89
|
+
this.listeners.push(handler);
|
|
90
|
+
return () => {
|
|
91
|
+
this.listeners.splice(this.listeners.indexOf(handler), 1);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private handleBroadcast(data: SignalPacket): void {
|
|
96
|
+
if (!data.id.isEqual(this.type.id)) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const body = this.type.serializer.deserialize(data.body);
|
|
100
|
+
for (const listener of this.listeners) {
|
|
101
|
+
listener(body);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private onTask(): void {
|
|
106
|
+
if (!this.type.id.isSubpathOf(this.client.app.id)) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.client.send(SIGNAL_REGISTER_PACKET, {
|
|
110
|
+
id: this.type.id,
|
|
111
|
+
permissions: this.type.permissions,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { ByteReader, ByteWriter } from '../../bytebuffer.js';
|
|
2
|
+
import { Flags } from '../../bytebuffer.js';
|
|
3
|
+
import type { Unlisten } from '../../event-emitter.js';
|
|
4
|
+
import { Identifier } from '../../identifier.js';
|
|
5
|
+
import type { Serializable } from '../../serializer.js';
|
|
6
|
+
import { Serializer } from '../../serializer.js';
|
|
7
|
+
|
|
8
|
+
export class SignalPermissions {
|
|
9
|
+
constructor(
|
|
10
|
+
public readonly all?: Identifier,
|
|
11
|
+
public readonly listen?: Identifier,
|
|
12
|
+
public readonly send?: Identifier,
|
|
13
|
+
) { }
|
|
14
|
+
|
|
15
|
+
public serialize(writer: ByteWriter): void {
|
|
16
|
+
const flags = new Flags(0, 3);
|
|
17
|
+
flags.set(0, this.all !== undefined);
|
|
18
|
+
flags.set(1, this.listen !== undefined);
|
|
19
|
+
flags.set(2, this.send !== undefined);
|
|
20
|
+
writer.writeFlags(flags);
|
|
21
|
+
if (this.all !== undefined) {
|
|
22
|
+
writer.writeString(this.all.key());
|
|
23
|
+
}
|
|
24
|
+
if (this.listen !== undefined) {
|
|
25
|
+
writer.writeString(this.listen.key());
|
|
26
|
+
}
|
|
27
|
+
if (this.send !== undefined) {
|
|
28
|
+
writer.writeString(this.send.key());
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public static deserialize(reader: ByteReader): SignalPermissions {
|
|
33
|
+
const flags = reader.readFlags(3);
|
|
34
|
+
const all = flags.ifSet(0, () => Identifier.fromKey(reader.readString()));
|
|
35
|
+
const listen = flags.ifSet(1, () => Identifier.fromKey(reader.readString()));
|
|
36
|
+
const send = flags.ifSet(2, () => Identifier.fromKey(reader.readString()));
|
|
37
|
+
return new SignalPermissions(
|
|
38
|
+
all,
|
|
39
|
+
listen,
|
|
40
|
+
send,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class SignalType<T> {
|
|
45
|
+
constructor(
|
|
46
|
+
public readonly id: Identifier,
|
|
47
|
+
public readonly serializer: Serializable<T, Uint8Array>,
|
|
48
|
+
public readonly permissions: SignalPermissions,
|
|
49
|
+
) { }
|
|
50
|
+
|
|
51
|
+
static createJson<T>(identifier: Identifier, {
|
|
52
|
+
name,
|
|
53
|
+
permissions,
|
|
54
|
+
}: {
|
|
55
|
+
name: string
|
|
56
|
+
permissions?: SignalPermissions
|
|
57
|
+
}): SignalType<T> {
|
|
58
|
+
return new SignalType(
|
|
59
|
+
identifier.join(name),
|
|
60
|
+
Serializer.json(),
|
|
61
|
+
permissions ?? new SignalPermissions(),
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static createSerialized<T>(identifier: Identifier, {
|
|
66
|
+
name,
|
|
67
|
+
serializer,
|
|
68
|
+
permissions,
|
|
69
|
+
}: {
|
|
70
|
+
name: string,
|
|
71
|
+
serializer: Serializable<T, Uint8Array>
|
|
72
|
+
permissions?: SignalPermissions
|
|
73
|
+
}): SignalType<T> {
|
|
74
|
+
return new SignalType(
|
|
75
|
+
identifier.join(name),
|
|
76
|
+
serializer,
|
|
77
|
+
permissions ?? new SignalPermissions(),
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface Signal<T> {
|
|
83
|
+
listen(handler: (value: T) => void): Unlisten;
|
|
84
|
+
notify(body: T): void;
|
|
85
|
+
}
|