@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,148 @@
|
|
|
1
|
+
import { ByteReader, ByteWriter } from '../../bytebuffer.js';
|
|
2
|
+
import type { Client } from '../../client.js';
|
|
3
|
+
import { Identifier } from '../../identifier.js';
|
|
4
|
+
import { Serializer } from '../../serializer.js';
|
|
5
|
+
import { EndpointType } from '../endpoint/endpoint.js';
|
|
6
|
+
import { ExtensionType } from '../extension.js';
|
|
7
|
+
|
|
8
|
+
export const ASSET_EXTENSION_TYPE = new ExtensionType(
|
|
9
|
+
'asset',
|
|
10
|
+
(client: Client) => new AssetExtension(client),
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
type File = {
|
|
14
|
+
identifier: Identifier;
|
|
15
|
+
buffer: Uint8Array;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const FILE_SERIALIZER = new Serializer<File, Uint8Array>(
|
|
19
|
+
(file) => {
|
|
20
|
+
const writer = new ByteWriter();
|
|
21
|
+
writer.writeString(file.identifier.key());
|
|
22
|
+
writer.writeByteArray(file.buffer);
|
|
23
|
+
return writer.finish();
|
|
24
|
+
},
|
|
25
|
+
(data) => {
|
|
26
|
+
const reader = new ByteReader(data);
|
|
27
|
+
const identifier = Identifier.fromKey(reader.readString());
|
|
28
|
+
const buffer = reader.readByteArray();
|
|
29
|
+
reader.finish();
|
|
30
|
+
return { identifier, buffer };
|
|
31
|
+
},
|
|
32
|
+
);
|
|
33
|
+
const FILE_ARRAY_SERIALIZER = new Serializer<File[], Uint8Array>(
|
|
34
|
+
(files) => {
|
|
35
|
+
const writer = new ByteWriter();
|
|
36
|
+
writer.writeInt(files.length);
|
|
37
|
+
for (const file of files) {
|
|
38
|
+
writer.writeString(file.identifier.key());
|
|
39
|
+
writer.writeByteArray(file.buffer);
|
|
40
|
+
}
|
|
41
|
+
return writer.finish();
|
|
42
|
+
},
|
|
43
|
+
(data) => {
|
|
44
|
+
const reader = new ByteReader(data);
|
|
45
|
+
const count = reader.readInt();
|
|
46
|
+
const files: File[] = [];
|
|
47
|
+
for (let i = 0; i < count; i++) {
|
|
48
|
+
const identifier = Identifier.fromKey(reader.readString());
|
|
49
|
+
const buffer = reader.readByteArray();
|
|
50
|
+
files.push({ identifier, buffer });
|
|
51
|
+
}
|
|
52
|
+
reader.finish();
|
|
53
|
+
return files;
|
|
54
|
+
},
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
export const ASSET_UPLOAD_PERMISSION_ID = ASSET_EXTENSION_TYPE.join('upload');
|
|
58
|
+
const ASSET_UPLOAD_ENDPOINT = EndpointType.createSerialized<File, Identifier>(
|
|
59
|
+
ASSET_EXTENSION_TYPE,
|
|
60
|
+
{
|
|
61
|
+
name: 'upload',
|
|
62
|
+
requestSerializer: FILE_SERIALIZER,
|
|
63
|
+
responseSerializer: Serializer.model(Identifier).pipe(Serializer.json()),
|
|
64
|
+
permissionId: ASSET_UPLOAD_PERMISSION_ID,
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
export const ASSET_UPLOAD_MANY_PERMISSION_ID = ASSET_EXTENSION_TYPE.join('upload', 'many');
|
|
68
|
+
const ASSET_UPLOAD_MANY_ENDPOINT = EndpointType.createSerialized<File[], Identifier[]>(
|
|
69
|
+
ASSET_EXTENSION_TYPE,
|
|
70
|
+
{
|
|
71
|
+
name: 'upload_many',
|
|
72
|
+
requestSerializer: FILE_ARRAY_SERIALIZER,
|
|
73
|
+
responseSerializer: Serializer.model(Identifier).toArray().pipe(Serializer.json()),
|
|
74
|
+
permissionId: ASSET_UPLOAD_MANY_PERMISSION_ID,
|
|
75
|
+
},
|
|
76
|
+
);
|
|
77
|
+
export const ASSET_DOWNLOAD_PERMISSION_ID = ASSET_EXTENSION_TYPE.join('download');
|
|
78
|
+
const ASSET_DOWNLOAD_ENDPOINT = EndpointType.createSerialized<Identifier, File>(
|
|
79
|
+
ASSET_EXTENSION_TYPE,
|
|
80
|
+
{
|
|
81
|
+
name: 'download',
|
|
82
|
+
requestSerializer: Serializer.model(Identifier).pipe(Serializer.json()),
|
|
83
|
+
responseSerializer: FILE_SERIALIZER,
|
|
84
|
+
permissionId: ASSET_DOWNLOAD_PERMISSION_ID,
|
|
85
|
+
},
|
|
86
|
+
);
|
|
87
|
+
export const ASSET_DOWNLOAD_MANY_PERMISSION_ID = ASSET_EXTENSION_TYPE.join('download', 'many');
|
|
88
|
+
const ASSET_DOWNLOAD_MANY_ENDPOINT = EndpointType.createSerialized<Identifier[], File[]>(
|
|
89
|
+
ASSET_EXTENSION_TYPE,
|
|
90
|
+
{
|
|
91
|
+
name: 'download_many',
|
|
92
|
+
requestSerializer: Serializer.model(Identifier).toArray().pipe(Serializer.json()),
|
|
93
|
+
responseSerializer: FILE_ARRAY_SERIALIZER,
|
|
94
|
+
permissionId: ASSET_DOWNLOAD_MANY_PERMISSION_ID,
|
|
95
|
+
},
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
export class AssetExtension {
|
|
99
|
+
constructor(private readonly client: Client) {}
|
|
100
|
+
|
|
101
|
+
public async upload(identifier: Identifier, buffer: Uint8Array): Promise<Identifier> {
|
|
102
|
+
const assetIdentifier = await this.client.endpoints.call(ASSET_UPLOAD_ENDPOINT, {
|
|
103
|
+
identifier,
|
|
104
|
+
buffer,
|
|
105
|
+
});
|
|
106
|
+
return assetIdentifier;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
public async uploadMany(...files: File[]): Promise<Identifier[]> {
|
|
110
|
+
const uploaded = await this.client.endpoints.call(ASSET_UPLOAD_MANY_ENDPOINT, files);
|
|
111
|
+
return uploaded;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public async download(identifier: Identifier): Promise<File> {
|
|
115
|
+
const downloaded = await this.client.endpoints.call(ASSET_DOWNLOAD_ENDPOINT, identifier);
|
|
116
|
+
return downloaded;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public async downloadMany(...identifiers: Identifier[]): Promise<File[]> {
|
|
120
|
+
const downloaded = await this.client.endpoints.call(
|
|
121
|
+
ASSET_DOWNLOAD_MANY_ENDPOINT,
|
|
122
|
+
identifiers,
|
|
123
|
+
);
|
|
124
|
+
return downloaded;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
public url(
|
|
128
|
+
identifier: Identifier,
|
|
129
|
+
{
|
|
130
|
+
noCache,
|
|
131
|
+
}: {
|
|
132
|
+
noCache?: boolean;
|
|
133
|
+
} = {},
|
|
134
|
+
): string {
|
|
135
|
+
const address = this.client.network.address;
|
|
136
|
+
const protocol = address.secure ? 'https' : 'http';
|
|
137
|
+
if (noCache) {
|
|
138
|
+
return `${protocol}://${address.host}:${address.port}/asset?id=${encodeURIComponent(identifier.key())}&t=${Date.now()}`;
|
|
139
|
+
}
|
|
140
|
+
return `${protocol}://${address.host}:${address.port}/asset?id=${encodeURIComponent(identifier.key())}`;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
public proxy(url: string): string {
|
|
144
|
+
const address = this.client.network.address;
|
|
145
|
+
const protocol = address.secure ? 'https' : 'http';
|
|
146
|
+
return `${protocol}://${address.host}:${address.port}/proxy?url=${encodeURIComponent(url)}`;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ASSET_DOWNLOAD_MANY_PERMISSION_ID, ASSET_DOWNLOAD_PERMISSION_ID, ASSET_EXTENSION_TYPE, ASSET_UPLOAD_MANY_PERMISSION_ID, ASSET_UPLOAD_PERMISSION_ID, AssetExtension } from './asset-extension.js';
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { App } from '../../app.js';
|
|
2
|
+
import type { Client } from '../../client.js';
|
|
3
|
+
import { Identifier } 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 { ExtensionType } from '../extension.js';
|
|
8
|
+
import type { Table } from '../table/table.js';
|
|
9
|
+
import { TableType } from '../table/table.js';
|
|
10
|
+
|
|
11
|
+
import type { DashboardHandler } from './dashboard.js';
|
|
12
|
+
import { PermissionRequestPacket, PluginRequestPacket } from './packets.js';
|
|
13
|
+
|
|
14
|
+
export const DASHBOARD_EXTENSION_TYPE = new ExtensionType(
|
|
15
|
+
'dashboard',
|
|
16
|
+
(client: Client) => new DashboardExtension(client),
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
type DashboardSetResponse = {
|
|
20
|
+
success: boolean;
|
|
21
|
+
};
|
|
22
|
+
export const DASHBOARD_SET_PERMISSION_ID = DASHBOARD_EXTENSION_TYPE.join('set');
|
|
23
|
+
const DASHBOARD_SET_ENDPOINT = EndpointType.createJson<Identifier, DashboardSetResponse>(
|
|
24
|
+
DASHBOARD_EXTENSION_TYPE,
|
|
25
|
+
{
|
|
26
|
+
name: 'set',
|
|
27
|
+
requestSerializer: Serializer.model(Identifier),
|
|
28
|
+
permissionId: DASHBOARD_SET_PERMISSION_ID,
|
|
29
|
+
},
|
|
30
|
+
);
|
|
31
|
+
const DASHBOARD_PERMISSION_REQUEST_PACKET = PacketType.createSerialized<PermissionRequestPacket>(
|
|
32
|
+
DASHBOARD_EXTENSION_TYPE,
|
|
33
|
+
{
|
|
34
|
+
name: 'permission_request',
|
|
35
|
+
serializer: PermissionRequestPacket,
|
|
36
|
+
},
|
|
37
|
+
);
|
|
38
|
+
const DASHBOARD_PERMISSION_ACCEPT_PACKET = PacketType.createJson<string>(DASHBOARD_EXTENSION_TYPE, {
|
|
39
|
+
name: 'permission_accept',
|
|
40
|
+
});
|
|
41
|
+
const DASHBOARD_PERMISSION_DENY_PACKET = PacketType.createJson<string>(DASHBOARD_EXTENSION_TYPE, {
|
|
42
|
+
name: 'permission_deny',
|
|
43
|
+
});
|
|
44
|
+
const DASHBOARD_PLUGIN_REQUEST_PACKET = PacketType.createSerialized<PluginRequestPacket>(
|
|
45
|
+
DASHBOARD_EXTENSION_TYPE,
|
|
46
|
+
{
|
|
47
|
+
name: 'plugin_request',
|
|
48
|
+
serializer: PluginRequestPacket,
|
|
49
|
+
},
|
|
50
|
+
);
|
|
51
|
+
const DASHBOARD_PLUGIN_ACCEPT_PACKET = PacketType.createJson<string>(DASHBOARD_EXTENSION_TYPE, {
|
|
52
|
+
name: 'plugin_accept',
|
|
53
|
+
});
|
|
54
|
+
const DASHBOARD_PLUGIN_DENY_PACKET = PacketType.createJson<string>(DASHBOARD_EXTENSION_TYPE, {
|
|
55
|
+
name: 'plugin_deny',
|
|
56
|
+
});
|
|
57
|
+
export const DASHBOARD_OPEN_APP_PERMISSION_ID = DASHBOARD_EXTENSION_TYPE.join('app', 'open');
|
|
58
|
+
const DASHBOARD_OPEN_APP_ENDPOINT = EndpointType.createJson<App, void>(DASHBOARD_EXTENSION_TYPE, {
|
|
59
|
+
name: 'open_app',
|
|
60
|
+
requestSerializer: Serializer.model(App),
|
|
61
|
+
permissionId: DASHBOARD_OPEN_APP_PERMISSION_ID,
|
|
62
|
+
});
|
|
63
|
+
const DASHBOARD_OPEN_APP_PACKET = PacketType.createJson<App>(DASHBOARD_EXTENSION_TYPE, {
|
|
64
|
+
name: 'open_app',
|
|
65
|
+
serializer: Serializer.model(App),
|
|
66
|
+
});
|
|
67
|
+
export const DASHOBARD_APP_READ_PERMISSION_ID = DASHBOARD_EXTENSION_TYPE.join('app', 'read');
|
|
68
|
+
export const DASHOBARD_APP_EDIT_PERMISSION_ID = DASHBOARD_EXTENSION_TYPE.join('app', 'edit');
|
|
69
|
+
const DASHBOARD_APP_TABLE_TYPE = TableType.createModel(DASHBOARD_EXTENSION_TYPE, {
|
|
70
|
+
name: 'apps',
|
|
71
|
+
model: App,
|
|
72
|
+
permissions: {
|
|
73
|
+
read: DASHOBARD_APP_READ_PERMISSION_ID,
|
|
74
|
+
write: DASHOBARD_APP_EDIT_PERMISSION_ID,
|
|
75
|
+
remove: DASHOBARD_APP_EDIT_PERMISSION_ID,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
export class DashboardExtension {
|
|
80
|
+
private dashboard: DashboardHandler | null = null;
|
|
81
|
+
public readonly apps: Table<App>;
|
|
82
|
+
|
|
83
|
+
constructor(private readonly client: Client) {
|
|
84
|
+
client.network.registerPacket(
|
|
85
|
+
DASHBOARD_PERMISSION_REQUEST_PACKET,
|
|
86
|
+
DASHBOARD_PERMISSION_ACCEPT_PACKET,
|
|
87
|
+
DASHBOARD_PERMISSION_DENY_PACKET,
|
|
88
|
+
DASHBOARD_PLUGIN_REQUEST_PACKET,
|
|
89
|
+
DASHBOARD_PLUGIN_ACCEPT_PACKET,
|
|
90
|
+
DASHBOARD_PLUGIN_DENY_PACKET,
|
|
91
|
+
DASHBOARD_OPEN_APP_PACKET,
|
|
92
|
+
);
|
|
93
|
+
client.network.addPacketHandler(DASHBOARD_PERMISSION_REQUEST_PACKET, (request) =>
|
|
94
|
+
this.handlePermissionRequest(request),
|
|
95
|
+
);
|
|
96
|
+
client.network.addPacketHandler(DASHBOARD_PLUGIN_REQUEST_PACKET, (request) =>
|
|
97
|
+
this.handlePluginRequest(request),
|
|
98
|
+
);
|
|
99
|
+
client.network.addPacketHandler(DASHBOARD_OPEN_APP_PACKET, (app) =>
|
|
100
|
+
this.handleOpenApp(app),
|
|
101
|
+
);
|
|
102
|
+
this.apps = client.tables.get(DASHBOARD_APP_TABLE_TYPE);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private async handlePermissionRequest(request: PermissionRequestPacket): Promise<void> {
|
|
106
|
+
await this.handleDashboard(async (dashboard) => {
|
|
107
|
+
const response = await dashboard.handlePermissionRequest(request);
|
|
108
|
+
if (response) {
|
|
109
|
+
this.client.send(DASHBOARD_PERMISSION_ACCEPT_PACKET, request.requestId);
|
|
110
|
+
} else {
|
|
111
|
+
this.client.send(DASHBOARD_PERMISSION_DENY_PACKET, request.requestId);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private async handlePluginRequest(request: PluginRequestPacket): Promise<void> {
|
|
117
|
+
await this.handleDashboard(async (dashboard) => {
|
|
118
|
+
const response = await dashboard.handlePluginRequest(request);
|
|
119
|
+
if (response) {
|
|
120
|
+
this.client.send(DASHBOARD_PLUGIN_ACCEPT_PACKET, request.requestId);
|
|
121
|
+
} else {
|
|
122
|
+
this.client.send(DASHBOARD_PLUGIN_DENY_PACKET, request.requestId);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private async handleOpenApp(app: App): Promise<void> {
|
|
128
|
+
await this.handleDashboard(async (dashboard) => {
|
|
129
|
+
await dashboard.handleOpenApp(app);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private async handleDashboard(
|
|
134
|
+
callback: (dashboard: DashboardHandler) => Promise<void>,
|
|
135
|
+
): Promise<void> {
|
|
136
|
+
if (this.dashboard === null) {
|
|
137
|
+
throw new Error('Dashboard not set');
|
|
138
|
+
}
|
|
139
|
+
await callback(this.dashboard);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public set(dashboard: DashboardHandler): void {
|
|
143
|
+
this.client.permissions.require(DASHBOARD_SET_PERMISSION_ID);
|
|
144
|
+
if (this.dashboard !== null) {
|
|
145
|
+
throw new Error('Dashboard already set');
|
|
146
|
+
}
|
|
147
|
+
this.dashboard = dashboard;
|
|
148
|
+
this.client.whenReady(async () => {
|
|
149
|
+
const response = await this.client.endpoints.call(
|
|
150
|
+
DASHBOARD_SET_ENDPOINT,
|
|
151
|
+
this.client.app.id,
|
|
152
|
+
);
|
|
153
|
+
if (!response.success) {
|
|
154
|
+
throw new Error('Failed to set dashboard');
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
public async openApp(app: App): Promise<void> {
|
|
160
|
+
return await this.client.endpoints.call(DASHBOARD_OPEN_APP_ENDPOINT, app);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { App } from '../../app.js';
|
|
2
|
+
|
|
3
|
+
import type { PermissionRequestPacket, PluginRequestPacket } from './packets.js';
|
|
4
|
+
|
|
5
|
+
export interface DashboardHandler {
|
|
6
|
+
handlePermissionRequest(request: PermissionRequestPacket): Promise<boolean>;
|
|
7
|
+
handlePluginRequest(request: PluginRequestPacket): Promise<boolean>;
|
|
8
|
+
handleOpenApp(app: App): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { App } from '../../app.js';
|
|
2
|
+
import { ByteReader, ByteWriter } from '../../bytebuffer.js';
|
|
3
|
+
import { PermissionType } from '../permission/permission.js';
|
|
4
|
+
import type { PackageInfo } from '../plugin/package-info.js';
|
|
5
|
+
|
|
6
|
+
export class PermissionRequestPacket {
|
|
7
|
+
constructor(
|
|
8
|
+
public readonly requestId: string,
|
|
9
|
+
public readonly app: App,
|
|
10
|
+
public readonly permissions: PermissionType[],
|
|
11
|
+
) { }
|
|
12
|
+
|
|
13
|
+
public static serialize(packet: PermissionRequestPacket): Uint8Array {
|
|
14
|
+
const writer = new ByteWriter();
|
|
15
|
+
writer.writeString(packet.requestId);
|
|
16
|
+
writer.writeString(JSON.stringify(packet.app.toJson()));
|
|
17
|
+
writer.writeString(JSON.stringify(packet.permissions.map(permission => permission.toJson())));
|
|
18
|
+
return writer.finish();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public static deserialize(data: Uint8Array): PermissionRequestPacket {
|
|
22
|
+
const reader = new ByteReader(data);
|
|
23
|
+
const requestId = reader.readString();
|
|
24
|
+
const app = App.fromJson(JSON.parse(reader.readString()));
|
|
25
|
+
const permissions = JSON.parse(reader.readString()).map(PermissionType.fromJson);
|
|
26
|
+
return new PermissionRequestPacket(requestId, app, permissions);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class PluginRequestPacket {
|
|
31
|
+
constructor(
|
|
32
|
+
public readonly requestId: string,
|
|
33
|
+
public readonly app: App,
|
|
34
|
+
public readonly packages: PackageInfo[],
|
|
35
|
+
) { }
|
|
36
|
+
|
|
37
|
+
public static serialize(packet: PluginRequestPacket): Uint8Array {
|
|
38
|
+
const writer = new ByteWriter();
|
|
39
|
+
writer.writeString(packet.requestId);
|
|
40
|
+
writer.writeString(JSON.stringify(packet.app.toJson()));
|
|
41
|
+
writer.writeString(JSON.stringify(packet.packages));
|
|
42
|
+
return writer.finish();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public static deserialize(data: Uint8Array): PluginRequestPacket {
|
|
46
|
+
const reader = new ByteReader(data);
|
|
47
|
+
const requestId = reader.readString();
|
|
48
|
+
const app = App.fromJson(JSON.parse(reader.readString()));
|
|
49
|
+
const packages = JSON.parse(reader.readString());
|
|
50
|
+
return new PluginRequestPacket(requestId, app, packages);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { Client } from '../../client.js';
|
|
2
|
+
import type { Identifier } from '../../identifier.js';
|
|
3
|
+
import { IdentifierMap } from '../../identifier.js';
|
|
4
|
+
import { PacketType } from '../../network/packet/index.js';
|
|
5
|
+
import { ExtensionType } from '../extension.js';
|
|
6
|
+
|
|
7
|
+
import { EndpointType } from './endpoint.js';
|
|
8
|
+
import { EndpointDataPacket, EndpointErrorPacket, EndpointRegisterPacket } from './packets.js';
|
|
9
|
+
|
|
10
|
+
export const ENDPOINT_EXTENSION_TYPE = new ExtensionType(
|
|
11
|
+
'endpoint',
|
|
12
|
+
(client: Client) => new EndpointExtension(client),
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
type CallPromise = {
|
|
16
|
+
resolve: (data: Uint8Array) => void;
|
|
17
|
+
reject: (error: Error) => void;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
type EndpointHandler = {
|
|
21
|
+
type: EndpointType;
|
|
22
|
+
handler: (arg: any) => Promise<any>;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export class EndpointExtension {
|
|
26
|
+
private readonly registeredEndpoints = new IdentifierMap<EndpointHandler>();
|
|
27
|
+
private readonly promiseMap: Map<number, CallPromise> = new Map();
|
|
28
|
+
private callId: number;
|
|
29
|
+
|
|
30
|
+
constructor(private readonly client: Client) {
|
|
31
|
+
this.callId = 0;
|
|
32
|
+
client.network.registerPacket(
|
|
33
|
+
ENDPOINT_REGISTER_PACKET,
|
|
34
|
+
ENDPOINT_CALL_PACKET,
|
|
35
|
+
ENDPOINT_RECEIVE_PACKET,
|
|
36
|
+
ENDPOINT_ERROR_PACKET,
|
|
37
|
+
);
|
|
38
|
+
client.network.addPacketHandler(ENDPOINT_RECEIVE_PACKET, (event) => {
|
|
39
|
+
const promise = this.promiseMap.get(event.key);
|
|
40
|
+
if (!promise) return;
|
|
41
|
+
this.promiseMap.delete(event.key);
|
|
42
|
+
promise.resolve(event.data);
|
|
43
|
+
});
|
|
44
|
+
client.network.addPacketHandler(ENDPOINT_ERROR_PACKET, (event) => {
|
|
45
|
+
const promise = this.promiseMap.get(event.key);
|
|
46
|
+
if (!promise) return;
|
|
47
|
+
this.promiseMap.delete(event.key);
|
|
48
|
+
promise.reject(new Error(event.error));
|
|
49
|
+
});
|
|
50
|
+
client.network.addTask(() => this.onTask());
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private onTask(): void {
|
|
54
|
+
const endpoints = new IdentifierMap<Identifier | undefined>();
|
|
55
|
+
for (const [key, endpoint] of this.registeredEndpoints) {
|
|
56
|
+
endpoints.set(key, endpoint.type.permissionId);
|
|
57
|
+
}
|
|
58
|
+
const packet = new EndpointRegisterPacket(endpoints);
|
|
59
|
+
this.client.send(ENDPOINT_REGISTER_PACKET, packet);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public register<Req, Res>(
|
|
63
|
+
type: EndpointType<Req, Res>,
|
|
64
|
+
handler: (data: Req) => Promise<Res>,
|
|
65
|
+
): void {
|
|
66
|
+
if (this.client.running) {
|
|
67
|
+
throw new Error('Cannot register endpoints after the client has started');
|
|
68
|
+
}
|
|
69
|
+
if (this.registeredEndpoints.has(type.id)) {
|
|
70
|
+
throw new Error(`Endpoint for key ${type.id} already registered`);
|
|
71
|
+
}
|
|
72
|
+
this.registeredEndpoints.set(type.id, { type, handler });
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public listen<Req, Res>(handler: (data: Req) => Promise<Res>, name?: string): void {
|
|
76
|
+
const type = EndpointType.createJson<Req, Res>(this.client.app.id, {
|
|
77
|
+
name: name ?? handler.name,
|
|
78
|
+
});
|
|
79
|
+
this.register(type, handler);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public async call<Req, Res>(endpoint: EndpointType<Req, Res>, data: Req): Promise<Res> {
|
|
83
|
+
const key = this.callId++;
|
|
84
|
+
const promise = new Promise<Uint8Array>((resolve, reject) => {
|
|
85
|
+
this.promiseMap.set(key, { resolve, reject });
|
|
86
|
+
});
|
|
87
|
+
this.client.send(ENDPOINT_CALL_PACKET, {
|
|
88
|
+
id: endpoint.id,
|
|
89
|
+
key,
|
|
90
|
+
data: endpoint.requestSerializer.serialize(data),
|
|
91
|
+
});
|
|
92
|
+
const response = await promise;
|
|
93
|
+
return endpoint.responseSerializer.deserialize(response);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const ENDPOINT_REGISTER_PACKET = PacketType.createSerialized<EndpointRegisterPacket>(
|
|
98
|
+
ENDPOINT_EXTENSION_TYPE,
|
|
99
|
+
{
|
|
100
|
+
name: 'register',
|
|
101
|
+
serializer: EndpointRegisterPacket,
|
|
102
|
+
},
|
|
103
|
+
);
|
|
104
|
+
const ENDPOINT_CALL_PACKET = PacketType.createSerialized<EndpointDataPacket>(
|
|
105
|
+
ENDPOINT_EXTENSION_TYPE,
|
|
106
|
+
{
|
|
107
|
+
name: 'call',
|
|
108
|
+
serializer: EndpointDataPacket,
|
|
109
|
+
},
|
|
110
|
+
);
|
|
111
|
+
const ENDPOINT_RECEIVE_PACKET = PacketType.createSerialized<EndpointDataPacket>(
|
|
112
|
+
ENDPOINT_EXTENSION_TYPE,
|
|
113
|
+
{
|
|
114
|
+
name: 'receive',
|
|
115
|
+
serializer: EndpointDataPacket,
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
const ENDPOINT_ERROR_PACKET = PacketType.createSerialized<EndpointErrorPacket>(
|
|
119
|
+
ENDPOINT_EXTENSION_TYPE,
|
|
120
|
+
{
|
|
121
|
+
name: 'error',
|
|
122
|
+
serializer: EndpointErrorPacket,
|
|
123
|
+
},
|
|
124
|
+
);
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Identifier } from '../../identifier.js';
|
|
2
|
+
import { Serializer, type Serializable } from '../../serializer.js';
|
|
3
|
+
|
|
4
|
+
export class EndpointType<Req = unknown, Res = unknown> {
|
|
5
|
+
constructor(
|
|
6
|
+
public readonly id: Identifier,
|
|
7
|
+
public readonly requestSerializer: Serializable<Req, Uint8Array>,
|
|
8
|
+
public readonly responseSerializer: Serializable<Res, Uint8Array>,
|
|
9
|
+
public readonly permissionId?: Identifier,
|
|
10
|
+
) { }
|
|
11
|
+
|
|
12
|
+
static createJson<Req, Res>(
|
|
13
|
+
identifier: Identifier,
|
|
14
|
+
{
|
|
15
|
+
name,
|
|
16
|
+
requestSerializer,
|
|
17
|
+
responseSerializer,
|
|
18
|
+
permissionId,
|
|
19
|
+
}: {
|
|
20
|
+
name: string,
|
|
21
|
+
requestSerializer?: Serializable<Req, any>,
|
|
22
|
+
responseSerializer?: Serializable<Res, any>,
|
|
23
|
+
permissionId?: Identifier,
|
|
24
|
+
},
|
|
25
|
+
): EndpointType<Req, Res> {
|
|
26
|
+
return new EndpointType<Req, Res>(
|
|
27
|
+
identifier.join(name),
|
|
28
|
+
Serializer.of<Req, any>(requestSerializer ?? Serializer.noop())
|
|
29
|
+
.pipe(Serializer.json()),
|
|
30
|
+
Serializer.of<Res, any>(responseSerializer ?? Serializer.noop())
|
|
31
|
+
.pipe(Serializer.json()),
|
|
32
|
+
permissionId,
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static createSerialized<Req, Res>(
|
|
37
|
+
identifier: Identifier,
|
|
38
|
+
{
|
|
39
|
+
name,
|
|
40
|
+
requestSerializer,
|
|
41
|
+
responseSerializer,
|
|
42
|
+
permissionId,
|
|
43
|
+
}: {
|
|
44
|
+
name: string,
|
|
45
|
+
requestSerializer: Serializable<Req, Uint8Array>,
|
|
46
|
+
responseSerializer: Serializable<Res, Uint8Array>,
|
|
47
|
+
permissionId?: Identifier,
|
|
48
|
+
},
|
|
49
|
+
): EndpointType<Req, Res> {
|
|
50
|
+
return new EndpointType<Req, Res>(
|
|
51
|
+
identifier.join(name),
|
|
52
|
+
requestSerializer,
|
|
53
|
+
responseSerializer,
|
|
54
|
+
permissionId,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ByteReader, ByteWriter } from '../../bytebuffer.js';
|
|
2
|
+
import { Identifier, IdentifierMap } from '../../identifier.js';
|
|
3
|
+
|
|
4
|
+
export class EndpointRegisterPacket {
|
|
5
|
+
constructor(
|
|
6
|
+
public endpoints: IdentifierMap<Identifier | undefined>,
|
|
7
|
+
) { }
|
|
8
|
+
|
|
9
|
+
public static serialize(item: EndpointRegisterPacket): Uint8Array {
|
|
10
|
+
const writer = new ByteWriter();
|
|
11
|
+
writer.writeInt(item.endpoints.size);
|
|
12
|
+
for (const [key, value] of item.endpoints) {
|
|
13
|
+
writer.writeString(key.key());
|
|
14
|
+
writer.writeString(value?.key() ?? '');
|
|
15
|
+
}
|
|
16
|
+
return writer.finish();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public static deserialize(item: Uint8Array): EndpointRegisterPacket {
|
|
20
|
+
const reader = new ByteReader(item);
|
|
21
|
+
const count = reader.readInt();
|
|
22
|
+
const endpoints = new IdentifierMap<Identifier | undefined>();
|
|
23
|
+
for (let i = 0; i < count; i++) {
|
|
24
|
+
const key = Identifier.fromKey(reader.readString());
|
|
25
|
+
const value = Identifier.fromKey(reader.readString());
|
|
26
|
+
endpoints.set(key, value);
|
|
27
|
+
}
|
|
28
|
+
return new EndpointRegisterPacket(endpoints);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class EndpointDataPacket {
|
|
33
|
+
constructor(
|
|
34
|
+
public id: Identifier,
|
|
35
|
+
public key: number,
|
|
36
|
+
public data: Uint8Array,
|
|
37
|
+
) { }
|
|
38
|
+
|
|
39
|
+
public static serialize(item: EndpointDataPacket): Uint8Array {
|
|
40
|
+
const writer = new ByteWriter();
|
|
41
|
+
writer.writeString(item.id.key());
|
|
42
|
+
writer.writeInt(item.key);
|
|
43
|
+
writer.writeByteArray(item.data);
|
|
44
|
+
return writer.finish();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public static deserialize(item: Uint8Array): EndpointDataPacket {
|
|
48
|
+
const reader = new ByteReader(item);
|
|
49
|
+
const id = Identifier.fromKey(reader.readString());
|
|
50
|
+
const key = reader.readInt();
|
|
51
|
+
const data = reader.readByteArray();
|
|
52
|
+
return new EndpointDataPacket(id, key, data);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export class EndpointErrorPacket {
|
|
57
|
+
constructor(
|
|
58
|
+
public id: Identifier,
|
|
59
|
+
public key: number,
|
|
60
|
+
public error: string,
|
|
61
|
+
) { }
|
|
62
|
+
|
|
63
|
+
public static serialize(item: EndpointErrorPacket): Uint8Array {
|
|
64
|
+
const writer = new ByteWriter();
|
|
65
|
+
writer.writeString(item.id.key());
|
|
66
|
+
writer.writeInt(item.key);
|
|
67
|
+
writer.writeString(item.error);
|
|
68
|
+
return writer.finish();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public static deserialize(item: Uint8Array): EndpointErrorPacket {
|
|
72
|
+
const reader = new ByteReader(item);
|
|
73
|
+
const id = Identifier.fromKey(reader.readString());
|
|
74
|
+
const key = reader.readInt();
|
|
75
|
+
const error = reader.readString();
|
|
76
|
+
return new EndpointErrorPacket(id, key, error);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Client } from '../client.js';
|
|
2
|
+
|
|
3
|
+
import type { Extension, ExtensionType } from './extension.js';
|
|
4
|
+
|
|
5
|
+
export class ExtensionRegistry {
|
|
6
|
+
private readonly extensionMap: Map<string, Extension> = new Map();
|
|
7
|
+
constructor(private readonly client: Client) {}
|
|
8
|
+
register<T extends Extension>(type: ExtensionType<T>): T {
|
|
9
|
+
if (this.has(type)) {
|
|
10
|
+
throw new Error(`Extension type ${type.name} already registered`);
|
|
11
|
+
}
|
|
12
|
+
type.dependencies?.().forEach((dependency) => {
|
|
13
|
+
if (!this.has(dependency)) {
|
|
14
|
+
throw new Error(
|
|
15
|
+
`Extension type ${type.name} depends on ${dependency.name} which is not registered`,
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const extension = type.create(this.client);
|
|
20
|
+
this.extensionMap.set(type.name, extension);
|
|
21
|
+
return extension;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
registerAll(types: ExtensionType[]): void {
|
|
25
|
+
types.forEach((type) => this.register(type));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
get<Ext extends Extension>(extensionType: ExtensionType<Ext>): Ext {
|
|
29
|
+
const extension = this.extensionMap.get(extensionType.name);
|
|
30
|
+
if (!extension) {
|
|
31
|
+
throw new Error(`Extension type ${extensionType.name} not registered`);
|
|
32
|
+
}
|
|
33
|
+
return extension as Ext;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
has<T extends Extension>(extensionType: ExtensionType<T>): boolean {
|
|
37
|
+
return this.extensionMap.has(extensionType.name);
|
|
38
|
+
}
|
|
39
|
+
}
|