@omujs/omu 0.9.48 → 0.9.49

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