@mine-scripters/minecraft-rmi 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MinecraftRMI.js +12 -16
- package/dist/MinecraftRMI.js.map +1 -1
- package/package.json +1 -1
package/dist/MinecraftRMI.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { system } from '@minecraft/server';
|
|
2
2
|
|
|
3
3
|
const MINESCRIPTERS_NAMESPACE = 'minescripters';
|
|
4
4
|
const buildServerNamespace = (namespace) => `${MINESCRIPTERS_NAMESPACE}_${namespace}`;
|
|
5
5
|
const inputMessageEvent = (namespace) => `${buildServerNamespace(namespace)}:rmi.event-payload`;
|
|
6
|
-
const sendEvent = (event) => {
|
|
7
|
-
|
|
8
|
-
return world.getDimension(dt.typeId)?.runCommand(`scriptevent ${event}`).successCount;
|
|
9
|
-
});
|
|
6
|
+
const sendEvent = (event, message) => {
|
|
7
|
+
system.sendScriptEvent(event, message);
|
|
10
8
|
};
|
|
11
9
|
|
|
12
10
|
var SchemaEntryType;
|
|
@@ -34,6 +32,7 @@ const validate = (schema, obj) => {
|
|
|
34
32
|
schema = normalize(schema);
|
|
35
33
|
if (Array.isArray(schema)) {
|
|
36
34
|
let passed = false;
|
|
35
|
+
const errors = [];
|
|
37
36
|
for (const subSchema of schema) {
|
|
38
37
|
try {
|
|
39
38
|
validate(subSchema, obj);
|
|
@@ -41,11 +40,11 @@ const validate = (schema, obj) => {
|
|
|
41
40
|
break;
|
|
42
41
|
}
|
|
43
42
|
catch (e) {
|
|
44
|
-
|
|
43
|
+
errors.push(e);
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
if (!passed) {
|
|
48
|
-
throw new
|
|
47
|
+
throw new AggregateError(errors, 'Invalid schema, none of the schemas matched');
|
|
49
48
|
}
|
|
50
49
|
return;
|
|
51
50
|
}
|
|
@@ -147,8 +146,6 @@ const makeId = () => {
|
|
|
147
146
|
};
|
|
148
147
|
|
|
149
148
|
const RMI_NAMESPACE = 'minescripters_rmi';
|
|
150
|
-
// Prevents the scriptevent parser from identifying it as a json object an failing to parse
|
|
151
|
-
const CHUNK_PADDING = '-';
|
|
152
149
|
const receiverScriptEvent = (id) => `${RMI_NAMESPACE}:${id}.receiver`;
|
|
153
150
|
const senderScriptEvent = (id) => `${RMI_NAMESPACE}:${id}.sender`;
|
|
154
151
|
const promiseResolver = () => {
|
|
@@ -178,7 +175,7 @@ const internalSendMessage = async (header, data, scriptevent, maxMessageSize = 2
|
|
|
178
175
|
const chunks = [];
|
|
179
176
|
if (data !== undefined) {
|
|
180
177
|
const dataString = JSON.stringify(data);
|
|
181
|
-
for (let i = 0; i <
|
|
178
|
+
for (let i = 0; i < dataString.length; i += maxMessageSize) {
|
|
182
179
|
chunks.push(dataString.slice(i, i + maxMessageSize));
|
|
183
180
|
}
|
|
184
181
|
}
|
|
@@ -195,12 +192,12 @@ const internalSendMessage = async (header, data, scriptevent, maxMessageSize = 2
|
|
|
195
192
|
console.error('Transport header is bigger than 2048 characters:', rawTransportHeader);
|
|
196
193
|
throw new Error('Transport header is bigger than 2048');
|
|
197
194
|
}
|
|
198
|
-
sendEvent(
|
|
195
|
+
sendEvent(scriptevent, rawTransportHeader);
|
|
199
196
|
await initialAck;
|
|
200
197
|
if (chunks.length > 0) {
|
|
201
198
|
const chunksAck = ackWaiter(senderScriptEvent(id));
|
|
202
199
|
for (const chunk of chunks) {
|
|
203
|
-
sendEvent(
|
|
200
|
+
sendEvent(receiverScriptEvent(id), chunk);
|
|
204
201
|
}
|
|
205
202
|
await chunksAck;
|
|
206
203
|
}
|
|
@@ -219,8 +216,7 @@ const internalMessageReceived = async (rawHeader) => {
|
|
|
219
216
|
const [acked, ack] = promiseResolver();
|
|
220
217
|
const listener = system.afterEvents.scriptEventReceive.subscribe((event) => {
|
|
221
218
|
if (event.id === receiverScriptEvent(id)) {
|
|
222
|
-
|
|
223
|
-
chunks.push(event.message.slice(1));
|
|
219
|
+
chunks.push(event.message);
|
|
224
220
|
if (chunks.length === chunkCount) {
|
|
225
221
|
ack();
|
|
226
222
|
}
|
|
@@ -228,12 +224,12 @@ const internalMessageReceived = async (rawHeader) => {
|
|
|
228
224
|
}, {
|
|
229
225
|
namespaces: [RMI_NAMESPACE],
|
|
230
226
|
});
|
|
231
|
-
sendEvent(`${senderScriptEvent(id)}
|
|
227
|
+
sendEvent(`${senderScriptEvent(id)}`, '');
|
|
232
228
|
await acked;
|
|
233
229
|
system.afterEvents.scriptEventReceive.unsubscribe(listener);
|
|
234
230
|
const rawData = chunks.join('');
|
|
235
231
|
data = JSON.parse(rawData);
|
|
236
|
-
sendEvent(`${senderScriptEvent(id)}
|
|
232
|
+
sendEvent(`${senderScriptEvent(id)}`, '');
|
|
237
233
|
}
|
|
238
234
|
return {
|
|
239
235
|
header: header.header,
|
package/dist/MinecraftRMI.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MinecraftRMI.js","sources":["../src/Communication.ts","../src/Schema.ts","../src/Utils.ts","../src/Transport.ts","../src/Server.ts","../src/Client.ts"],"sourcesContent":["import { DimensionTypes, world } from '@minecraft/server';\n\ninterface Message {\n id: string;\n endpoint: string;\n}\n\nexport interface InputMessage extends Message {\n timeout: number;\n}\n\nexport interface OutputMessage extends Message {\n isError: boolean;\n hasReturn: boolean;\n}\n\nconst MINESCRIPTERS_NAMESPACE = 'minescripters';\n\nexport const buildServerNamespace = (namespace: string) => `${MINESCRIPTERS_NAMESPACE}_${namespace}`;\n\nexport const inputMessageEvent = (namespace: string) => `${buildServerNamespace(namespace)}:rmi.event-payload`;\n\nexport const sendEvent = (event: string) => {\n DimensionTypes.getAll().some((dt) => {\n return world.getDimension(dt.typeId)?.runCommand(`scriptevent ${event}`).successCount;\n });\n};\n","export enum SchemaEntryType {\n OBJECT,\n NUMBER,\n STRING,\n ARRAY,\n BOOL,\n ANY,\n}\n\ninterface SchemaEntryBase {\n isOptional?: boolean;\n allowNull?: boolean;\n}\n\nexport interface SchemaEntryNumber extends SchemaEntryBase {\n type: SchemaEntryType.NUMBER;\n}\n\nexport interface SchemaEntryString extends SchemaEntryBase {\n type: SchemaEntryType.STRING;\n}\n\nexport interface SchemaEntryObject extends SchemaEntryBase {\n type: SchemaEntryType.OBJECT;\n extraKeys?: SchemaEntry;\n entries?: {\n [key: string]: SchemaEntry;\n };\n}\n\nexport interface SchemaEntryBool extends SchemaEntryBase {\n type: SchemaEntryType.BOOL;\n}\n\nexport interface SchemaEntryArray extends SchemaEntryBase {\n type: SchemaEntryType.ARRAY;\n items?: SchemaEntry;\n}\n\nexport type SchemaEntry =\n | SchemaEntryNumber\n | SchemaEntryString\n | SchemaEntryBool\n | SchemaEntryObject\n | SchemaEntryArray\n | SchemaEntryType\n | Array<SchemaEntry>;\n\ntype InternalSchema =\n | SchemaEntryNumber\n | SchemaEntryString\n | SchemaEntryBool\n | SchemaEntryObject\n | SchemaEntryArray\n | SchemaEntryType.ANY\n | Array<SchemaEntry>;\n\nconst validateBase = (schema: SchemaEntryBase, obj: unknown) => {\n if (!schema.isOptional) {\n if (obj === undefined) {\n throw new Error('Invalid schema, undefined but not optional');\n }\n }\n\n if (!schema.allowNull) {\n if (obj === null) {\n throw new Error('Invalid schema, null but does not allow null');\n }\n }\n};\n\nexport const validate = (schema: SchemaEntry, obj: unknown) => {\n schema = normalize(schema);\n\n if (Array.isArray(schema)) {\n let passed = false;\n for (const subSchema of schema) {\n try {\n validate(subSchema, obj);\n passed = true;\n break;\n } catch (e) {\n console.error(e);\n }\n }\n\n if (!passed) {\n throw new Error('Invalid schema');\n }\n return;\n }\n\n if (schema === SchemaEntryType.ANY) {\n return;\n }\n\n validateBase(schema, obj);\n\n if (obj === null || obj === undefined) {\n return;\n }\n\n if (schema.type === SchemaEntryType.NUMBER) {\n if (typeof obj !== 'number' && typeof obj !== 'bigint') {\n throw new Error('Invalid schema, not a number (or bigint)');\n }\n } else if (schema.type === SchemaEntryType.ARRAY) {\n if (!Array.isArray(obj)) {\n throw new Error('Invalid schema, not an array');\n }\n\n if (schema.items) {\n for (const entry of obj) {\n validate(schema.items, entry);\n }\n }\n } else if (schema.type === SchemaEntryType.STRING) {\n if (typeof obj !== 'string') {\n throw new Error('Invalid schema, not a string');\n }\n } else if (schema.type === SchemaEntryType.BOOL) {\n if (typeof obj !== 'boolean') {\n throw new Error('Invalid schema, not a bool');\n }\n } else if (schema.type === SchemaEntryType.OBJECT) {\n if (typeof obj !== 'object' || Array.isArray(obj)) {\n throw new Error('Invalid schema, not an object');\n }\n\n if (schema.entries) {\n for (const key of Object.keys(obj)) {\n if (key in schema.entries) {\n validate(schema.entries[key], (obj as { [key]: unknown })[key]);\n } else {\n if (!schema.extraKeys) {\n throw new Error('Invalid schema, invalid key: ' + key);\n }\n\n validate(schema.extraKeys, (obj as { [key]: unknown })[key]);\n }\n }\n } else if (schema.extraKeys) {\n const extraKeys = schema.extraKeys;\n Object.values(obj).forEach((o) => validate(extraKeys, o));\n }\n }\n};\n\nexport const validateArray = (schemas: Array<SchemaEntry>, objs: Array<unknown>) => {\n objs = [...objs];\n while (schemas.length > objs.length) {\n objs.push(undefined);\n }\n\n for (let i = 0; i < schemas.length; i++) {\n validate(schemas[i], objs[i]);\n }\n};\n\nconst normalize = (schema: SchemaEntry): InternalSchema => {\n if (schema === SchemaEntryType.NUMBER) {\n return {\n type: SchemaEntryType.NUMBER,\n };\n } else if (schema === SchemaEntryType.STRING) {\n return {\n type: SchemaEntryType.STRING,\n };\n } else if (schema === SchemaEntryType.OBJECT) {\n return {\n type: SchemaEntryType.OBJECT,\n };\n } else if (schema === SchemaEntryType.ARRAY) {\n return {\n type: SchemaEntryType.ARRAY,\n };\n } else if (schema === SchemaEntryType.BOOL) {\n return {\n type: SchemaEntryType.BOOL,\n };\n }\n\n return schema;\n};\n","export const makeId = (): string => {\n return Math.random().toString(36).substring(2);\n};\n","import { system } from '@minecraft/server';\nimport { makeId } from './Utils';\nimport { sendEvent } from './Communication';\n\ninterface TransportHeader {\n id: string;\n chunkCount?: number;\n header: unknown;\n}\n\nexport interface Received {\n header: unknown;\n data?: unknown;\n}\n\nconst RMI_NAMESPACE = 'minescripters_rmi';\n// Prevents the scriptevent parser from identifying it as a json object an failing to parse\nconst CHUNK_PADDING = '-';\n\nconst receiverScriptEvent = (id: string) => `${RMI_NAMESPACE}:${id}.receiver`;\nconst senderScriptEvent = (id: string) => `${RMI_NAMESPACE}:${id}.sender`;\n\nconst promiseResolver = (): [Promise<void>, () => void] => {\n let resolver: () => void = () => {};\n return [\n new Promise((resolve) => {\n resolver = resolve;\n }),\n resolver,\n ];\n};\n\nconst ackWaiter = async (scriptEvent: string) => {\n const [acked, ack] = promiseResolver();\n\n const namespace = scriptEvent.split(':')[0];\n const listener = system.afterEvents.scriptEventReceive.subscribe(\n (event) => {\n if (event.id === scriptEvent) {\n ack();\n }\n },\n {\n namespaces: [namespace],\n }\n );\n\n await acked;\n\n system.afterEvents.scriptEventReceive.unsubscribe(listener);\n};\n\nexport const internalSendMessage = async (\n header: unknown,\n data: unknown,\n scriptevent: string,\n maxMessageSize = 2048\n) => {\n const id = makeId();\n\n const chunks: Array<string> = [];\n\n if (data !== undefined) {\n const dataString = JSON.stringify(data);\n for (let i = 0; i < maxMessageSize; i += maxMessageSize) {\n chunks.push(dataString.slice(i, i + maxMessageSize));\n }\n }\n\n const transportHeader: TransportHeader = {\n id,\n header,\n };\n\n if (chunks.length > 0) {\n transportHeader.chunkCount = chunks.length;\n }\n\n const initialAck = ackWaiter(senderScriptEvent(id));\n const rawTransportHeader = JSON.stringify(transportHeader);\n if (rawTransportHeader.length > 2048) {\n console.error('Transport header is bigger than 2048 characters:', rawTransportHeader);\n throw new Error('Transport header is bigger than 2048');\n }\n\n sendEvent(`${scriptevent} ${rawTransportHeader}`);\n\n await initialAck;\n if (chunks.length > 0) {\n const chunksAck = ackWaiter(senderScriptEvent(id));\n\n for (const chunk of chunks) {\n sendEvent(`${receiverScriptEvent(id)} ${CHUNK_PADDING}${chunk}`);\n }\n\n await chunksAck;\n }\n};\n\nexport const internalMessageReceived = async (rawHeader: string): Promise<Received> => {\n const header = JSON.parse(rawHeader) as Partial<TransportHeader>;\n const id = header.id;\n\n if (!id) {\n console.error('Unknown data received:', header);\n throw new Error('Unknow data received');\n }\n\n const chunkCount = header.chunkCount;\n const chunks: Array<string> = [];\n let data = undefined;\n\n if (chunkCount && chunkCount > 0) {\n const [acked, ack] = promiseResolver();\n\n const listener = system.afterEvents.scriptEventReceive.subscribe(\n (event) => {\n if (event.id === receiverScriptEvent(id)) {\n // Removes CHUNK_PADDING\n chunks.push(event.message.slice(1));\n\n if (chunks.length === chunkCount) {\n ack();\n }\n }\n },\n {\n namespaces: [RMI_NAMESPACE],\n }\n );\n\n sendEvent(`${senderScriptEvent(id)}`);\n\n await acked;\n system.afterEvents.scriptEventReceive.unsubscribe(listener);\n\n const rawData = chunks.join('');\n\n data = JSON.parse(rawData);\n sendEvent(`${senderScriptEvent(id)}`);\n }\n\n return {\n header: header.header,\n data,\n };\n};\n","import { system } from '@minecraft/server';\nimport { buildServerNamespace, sendEvent, InputMessage, OutputMessage, inputMessageEvent } from './Communication';\nimport { SchemaEntry, validate, validateArray } from './Schema';\nimport { internalMessageReceived, internalSendMessage } from './Transport';\n\nexport interface Server {\n namespace: string;\n endpoints: Record<string, Endpoint>;\n}\n\nexport interface Endpoint {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handler: (...params: Array<any>) => unknown;\n schema?: EndpointSchema;\n}\n\nexport type EndpointSchema = {\n arguments?: Array<SchemaEntry>;\n returnValue?: SchemaEntry;\n};\n\nconst serverStopEvent = (server: Server) => `${buildServerNamespace(server.namespace)}:rmi.event-stop`;\nconst serverReturnEvent = (namespace: string, message: OutputMessage) => {\n const localNamespace = `${buildServerNamespace(namespace)}_${message.id}`;\n return `${localNamespace}:${message.endpoint}`;\n};\n\nconst returnError = (server: Server, payload: InputMessage, error: string) => {\n const message: OutputMessage = {\n id: payload.id,\n endpoint: payload.endpoint,\n hasReturn: false,\n isError: true,\n };\n\n internalSendMessage(message, error, serverReturnEvent(server.namespace, message));\n};\n\nconst returnValue = (server: Server, payload: InputMessage, value: unknown) => {\n const message: OutputMessage = {\n id: payload.id,\n endpoint: payload.endpoint,\n hasReturn: value !== undefined,\n isError: false,\n };\n\n internalSendMessage(message, value, serverReturnEvent(server.namespace, message));\n};\n\nconst start = (server: Server) => {\n const stopEvent = serverStopEvent(server);\n const payloadEvent = inputMessageEvent(server.namespace);\n const handler = system.afterEvents.scriptEventReceive.subscribe(\n async (event) => {\n if (event.id === stopEvent) {\n system.afterEvents.scriptEventReceive.unsubscribe(handler);\n } else if (event.id === payloadEvent) {\n const messageReceived = await internalMessageReceived(event.message);\n const payload = messageReceived.header as InputMessage;\n\n if (!(payload.endpoint in server.endpoints)) {\n returnError(server, payload, `Endpoint ${payload.endpoint} not found`);\n return;\n }\n\n const params = (messageReceived.data === undefined ? [] : messageReceived.data) as Array<unknown>;\n\n const endpoint = server.endpoints[payload.endpoint];\n if (endpoint.schema?.arguments) {\n try {\n validateArray(endpoint.schema.arguments, params);\n } catch (e) {\n returnError(server, payload, `Failed schema validation for arguments: ${e}`);\n }\n }\n\n const response = await endpoint.handler(...params);\n\n if (endpoint.schema?.returnValue) {\n try {\n validate(endpoint.schema.returnValue, response);\n } catch (e) {\n returnError(server, payload, `Failed schema validation for return value: ${e}`);\n }\n }\n\n returnValue(server, payload, response);\n }\n },\n {\n namespaces: [buildServerNamespace(server.namespace)],\n }\n );\n};\n\nexport const stopServer = (server: Server) => {\n sendEvent(serverStopEvent(server));\n};\n\nexport const startServer = (_server: Server) => {\n if (_server.namespace.includes(':')) {\n throw new Error('`:` is not a legal character for a namespace in: ' + _server.namespace);\n }\n\n const server = {\n ..._server,\n endpoints: { ..._server.endpoints },\n };\n\n start(server);\n};\n","import { system } from '@minecraft/server';\nimport { buildServerNamespace, InputMessage, OutputMessage, inputMessageEvent } from './Communication';\nimport { makeId } from './Utils';\nimport { internalMessageReceived, internalSendMessage } from './Transport';\n\ninterface ResponseListenerInput {\n timeout: number;\n endpoint: string;\n namespace: string;\n localNamespace: string;\n eventKey: string;\n}\n\nconst responseListener = (input: ResponseListenerInput): [() => void, Promise<unknown>] => {\n let handler: ReturnType<typeof system.afterEvents.scriptEventReceive.subscribe>;\n const promise = new Promise<unknown>((resolve, reject) => {\n const cancelHandler = system.runTimeout(() => {\n reject(new Error(`Timeout: Timed out trying to run ${input.endpoint} of ${input.namespace}`));\n }, input.timeout);\n\n handler = system.afterEvents.scriptEventReceive.subscribe(\n async (event) => {\n if (event.id === input.eventKey) {\n try {\n const response = await internalMessageReceived(event.message);\n const returnMessage: OutputMessage = response.header as OutputMessage;\n if (returnMessage.isError) {\n reject(new Error(response.data as string));\n } else {\n if (returnMessage.hasReturn) {\n resolve(response.data);\n } else {\n resolve(undefined);\n }\n }\n } catch (e) {\n reject(e);\n } finally {\n system.clearRun(cancelHandler);\n }\n }\n },\n {\n namespaces: [input.localNamespace],\n }\n );\n });\n\n const clean = () => {\n system.afterEvents.scriptEventReceive.unsubscribe(handler);\n };\n\n return [clean, promise];\n};\n\nexport const sendMessage = async (\n namespace: string,\n endpoint: string,\n args: Array<unknown> | undefined,\n timeout: number = 60\n): Promise<unknown> => {\n const messageId = makeId();\n const localNamespace = `${buildServerNamespace(namespace)}_${messageId}`;\n const eventKey = `${localNamespace}:${endpoint}`;\n\n const message: InputMessage = {\n id: messageId,\n endpoint: endpoint,\n timeout,\n };\n\n const [clean, promise] = responseListener({\n endpoint,\n eventKey,\n localNamespace,\n namespace,\n timeout,\n });\n\n try {\n internalSendMessage(message, args, inputMessageEvent(namespace));\n\n return await promise;\n } finally {\n clean();\n }\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MinecraftRMI.js","sources":["../src/Communication.ts","../src/Schema.ts","../src/Utils.ts","../src/Transport.ts","../src/Server.ts","../src/Client.ts"],"sourcesContent":["import { system } from '@minecraft/server';\n\ninterface Message {\n id: string;\n endpoint: string;\n}\n\nexport interface InputMessage extends Message {\n timeout: number;\n}\n\nexport interface OutputMessage extends Message {\n isError: boolean;\n hasReturn: boolean;\n}\n\nconst MINESCRIPTERS_NAMESPACE = 'minescripters';\n\nexport const buildServerNamespace = (namespace: string) => `${MINESCRIPTERS_NAMESPACE}_${namespace}`;\n\nexport const inputMessageEvent = (namespace: string) => `${buildServerNamespace(namespace)}:rmi.event-payload`;\n\nexport const sendEvent = (event: string, message: string) => {\n system.sendScriptEvent(event, message);\n};\n","export enum SchemaEntryType {\n OBJECT,\n NUMBER,\n STRING,\n ARRAY,\n BOOL,\n ANY,\n}\n\ninterface SchemaEntryBase {\n isOptional?: boolean;\n allowNull?: boolean;\n}\n\nexport interface SchemaEntryNumber extends SchemaEntryBase {\n type: SchemaEntryType.NUMBER;\n}\n\nexport interface SchemaEntryString extends SchemaEntryBase {\n type: SchemaEntryType.STRING;\n}\n\nexport interface SchemaEntryObject extends SchemaEntryBase {\n type: SchemaEntryType.OBJECT;\n extraKeys?: SchemaEntry;\n entries?: {\n [key: string]: SchemaEntry;\n };\n}\n\nexport interface SchemaEntryBool extends SchemaEntryBase {\n type: SchemaEntryType.BOOL;\n}\n\nexport interface SchemaEntryArray extends SchemaEntryBase {\n type: SchemaEntryType.ARRAY;\n items?: SchemaEntry;\n}\n\nexport type SchemaEntry =\n | SchemaEntryNumber\n | SchemaEntryString\n | SchemaEntryBool\n | SchemaEntryObject\n | SchemaEntryArray\n | SchemaEntryType\n | Array<SchemaEntry>;\n\ntype InternalSchema =\n | SchemaEntryNumber\n | SchemaEntryString\n | SchemaEntryBool\n | SchemaEntryObject\n | SchemaEntryArray\n | SchemaEntryType.ANY\n | Array<SchemaEntry>;\n\nconst validateBase = (schema: SchemaEntryBase, obj: unknown) => {\n if (!schema.isOptional) {\n if (obj === undefined) {\n throw new Error('Invalid schema, undefined but not optional');\n }\n }\n\n if (!schema.allowNull) {\n if (obj === null) {\n throw new Error('Invalid schema, null but does not allow null');\n }\n }\n};\n\nexport const validate = (schema: SchemaEntry, obj: unknown) => {\n schema = normalize(schema);\n\n if (Array.isArray(schema)) {\n let passed = false;\n const errors = [];\n for (const subSchema of schema) {\n try {\n validate(subSchema, obj);\n passed = true;\n break;\n } catch (e) {\n errors.push(e);\n }\n }\n\n if (!passed) {\n throw new AggregateError(errors, 'Invalid schema, none of the schemas matched');\n }\n return;\n }\n\n if (schema === SchemaEntryType.ANY) {\n return;\n }\n\n validateBase(schema, obj);\n\n if (obj === null || obj === undefined) {\n return;\n }\n\n if (schema.type === SchemaEntryType.NUMBER) {\n if (typeof obj !== 'number' && typeof obj !== 'bigint') {\n throw new Error('Invalid schema, not a number (or bigint)');\n }\n } else if (schema.type === SchemaEntryType.ARRAY) {\n if (!Array.isArray(obj)) {\n throw new Error('Invalid schema, not an array');\n }\n\n if (schema.items) {\n for (const entry of obj) {\n validate(schema.items, entry);\n }\n }\n } else if (schema.type === SchemaEntryType.STRING) {\n if (typeof obj !== 'string') {\n throw new Error('Invalid schema, not a string');\n }\n } else if (schema.type === SchemaEntryType.BOOL) {\n if (typeof obj !== 'boolean') {\n throw new Error('Invalid schema, not a bool');\n }\n } else if (schema.type === SchemaEntryType.OBJECT) {\n if (typeof obj !== 'object' || Array.isArray(obj)) {\n throw new Error('Invalid schema, not an object');\n }\n\n if (schema.entries) {\n for (const key of Object.keys(obj)) {\n if (key in schema.entries) {\n validate(schema.entries[key], (obj as { [key]: unknown })[key]);\n } else {\n if (!schema.extraKeys) {\n throw new Error('Invalid schema, invalid key: ' + key);\n }\n\n validate(schema.extraKeys, (obj as { [key]: unknown })[key]);\n }\n }\n } else if (schema.extraKeys) {\n const extraKeys = schema.extraKeys;\n Object.values(obj).forEach((o) => validate(extraKeys, o));\n }\n }\n};\n\nexport const validateArray = (schemas: Array<SchemaEntry>, objs: Array<unknown>) => {\n objs = [...objs];\n while (schemas.length > objs.length) {\n objs.push(undefined);\n }\n\n for (let i = 0; i < schemas.length; i++) {\n validate(schemas[i], objs[i]);\n }\n};\n\nconst normalize = (schema: SchemaEntry): InternalSchema => {\n if (schema === SchemaEntryType.NUMBER) {\n return {\n type: SchemaEntryType.NUMBER,\n };\n } else if (schema === SchemaEntryType.STRING) {\n return {\n type: SchemaEntryType.STRING,\n };\n } else if (schema === SchemaEntryType.OBJECT) {\n return {\n type: SchemaEntryType.OBJECT,\n };\n } else if (schema === SchemaEntryType.ARRAY) {\n return {\n type: SchemaEntryType.ARRAY,\n };\n } else if (schema === SchemaEntryType.BOOL) {\n return {\n type: SchemaEntryType.BOOL,\n };\n }\n\n return schema;\n};\n","export const makeId = (): string => {\n return Math.random().toString(36).substring(2);\n};\n","import { system } from '@minecraft/server';\nimport { makeId } from './Utils';\nimport { sendEvent } from './Communication';\n\ninterface TransportHeader {\n id: string;\n chunkCount?: number;\n header: unknown;\n}\n\nexport interface Received {\n header: unknown;\n data?: unknown;\n}\n\nconst RMI_NAMESPACE = 'minescripters_rmi';\n\nconst receiverScriptEvent = (id: string) => `${RMI_NAMESPACE}:${id}.receiver`;\nconst senderScriptEvent = (id: string) => `${RMI_NAMESPACE}:${id}.sender`;\n\nconst promiseResolver = (): [Promise<void>, () => void] => {\n let resolver: () => void = () => {};\n return [\n new Promise((resolve) => {\n resolver = resolve;\n }),\n resolver,\n ];\n};\n\nconst ackWaiter = async (scriptEvent: string) => {\n const [acked, ack] = promiseResolver();\n\n const namespace = scriptEvent.split(':')[0];\n const listener = system.afterEvents.scriptEventReceive.subscribe(\n (event) => {\n if (event.id === scriptEvent) {\n ack();\n }\n },\n {\n namespaces: [namespace],\n }\n );\n\n await acked;\n\n system.afterEvents.scriptEventReceive.unsubscribe(listener);\n};\n\nexport const internalSendMessage = async (\n header: unknown,\n data: unknown,\n scriptevent: string,\n maxMessageSize = 2048\n) => {\n const id = makeId();\n\n const chunks: Array<string> = [];\n\n if (data !== undefined) {\n const dataString = JSON.stringify(data);\n for (let i = 0; i < dataString.length; i += maxMessageSize) {\n chunks.push(dataString.slice(i, i + maxMessageSize));\n }\n }\n\n const transportHeader: TransportHeader = {\n id,\n header,\n };\n\n if (chunks.length > 0) {\n transportHeader.chunkCount = chunks.length;\n }\n\n const initialAck = ackWaiter(senderScriptEvent(id));\n const rawTransportHeader = JSON.stringify(transportHeader);\n if (rawTransportHeader.length > 2048) {\n console.error('Transport header is bigger than 2048 characters:', rawTransportHeader);\n throw new Error('Transport header is bigger than 2048');\n }\n\n sendEvent(scriptevent, rawTransportHeader);\n\n await initialAck;\n if (chunks.length > 0) {\n const chunksAck = ackWaiter(senderScriptEvent(id));\n\n for (const chunk of chunks) {\n sendEvent(receiverScriptEvent(id), chunk);\n }\n\n await chunksAck;\n }\n};\n\nexport const internalMessageReceived = async (rawHeader: string): Promise<Received> => {\n const header = JSON.parse(rawHeader) as Partial<TransportHeader>;\n const id = header.id;\n\n if (!id) {\n console.error('Unknown data received:', header);\n throw new Error('Unknow data received');\n }\n\n const chunkCount = header.chunkCount;\n const chunks: Array<string> = [];\n let data = undefined;\n\n if (chunkCount && chunkCount > 0) {\n const [acked, ack] = promiseResolver();\n\n const listener = system.afterEvents.scriptEventReceive.subscribe(\n (event) => {\n if (event.id === receiverScriptEvent(id)) {\n chunks.push(event.message);\n\n if (chunks.length === chunkCount) {\n ack();\n }\n }\n },\n {\n namespaces: [RMI_NAMESPACE],\n }\n );\n\n sendEvent(`${senderScriptEvent(id)}`, '');\n\n await acked;\n system.afterEvents.scriptEventReceive.unsubscribe(listener);\n\n const rawData = chunks.join('');\n data = JSON.parse(rawData);\n sendEvent(`${senderScriptEvent(id)}`, '');\n }\n\n return {\n header: header.header,\n data,\n };\n};\n","import { system } from '@minecraft/server';\nimport { buildServerNamespace, sendEvent, InputMessage, OutputMessage, inputMessageEvent } from './Communication';\nimport { SchemaEntry, validate, validateArray } from './Schema';\nimport { internalMessageReceived, internalSendMessage } from './Transport';\n\nexport interface Server {\n namespace: string;\n endpoints: Record<string, Endpoint>;\n}\n\nexport interface Endpoint {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handler: (...params: Array<any>) => unknown;\n schema?: EndpointSchema;\n}\n\nexport type EndpointSchema = {\n arguments?: Array<SchemaEntry>;\n returnValue?: SchemaEntry;\n};\n\nconst serverStopEvent = (server: Server) => `${buildServerNamespace(server.namespace)}:rmi.event-stop`;\nconst serverReturnEvent = (namespace: string, message: OutputMessage) => {\n const localNamespace = `${buildServerNamespace(namespace)}_${message.id}`;\n return `${localNamespace}:${message.endpoint}`;\n};\n\nconst returnError = (server: Server, payload: InputMessage, error: string) => {\n const message: OutputMessage = {\n id: payload.id,\n endpoint: payload.endpoint,\n hasReturn: false,\n isError: true,\n };\n\n internalSendMessage(message, error, serverReturnEvent(server.namespace, message));\n};\n\nconst returnValue = (server: Server, payload: InputMessage, value: unknown) => {\n const message: OutputMessage = {\n id: payload.id,\n endpoint: payload.endpoint,\n hasReturn: value !== undefined,\n isError: false,\n };\n\n internalSendMessage(message, value, serverReturnEvent(server.namespace, message));\n};\n\nconst start = (server: Server) => {\n const stopEvent = serverStopEvent(server);\n const payloadEvent = inputMessageEvent(server.namespace);\n const handler = system.afterEvents.scriptEventReceive.subscribe(\n async (event) => {\n if (event.id === stopEvent) {\n system.afterEvents.scriptEventReceive.unsubscribe(handler);\n } else if (event.id === payloadEvent) {\n const messageReceived = await internalMessageReceived(event.message);\n const payload = messageReceived.header as InputMessage;\n\n if (!(payload.endpoint in server.endpoints)) {\n returnError(server, payload, `Endpoint ${payload.endpoint} not found`);\n return;\n }\n\n const params = (messageReceived.data === undefined ? [] : messageReceived.data) as Array<unknown>;\n\n const endpoint = server.endpoints[payload.endpoint];\n if (endpoint.schema?.arguments) {\n try {\n validateArray(endpoint.schema.arguments, params);\n } catch (e) {\n returnError(server, payload, `Failed schema validation for arguments: ${e}`);\n }\n }\n\n const response = await endpoint.handler(...params);\n\n if (endpoint.schema?.returnValue) {\n try {\n validate(endpoint.schema.returnValue, response);\n } catch (e) {\n returnError(server, payload, `Failed schema validation for return value: ${e}`);\n }\n }\n\n returnValue(server, payload, response);\n }\n },\n {\n namespaces: [buildServerNamespace(server.namespace)],\n }\n );\n};\n\nexport const stopServer = (server: Server) => {\n sendEvent(serverStopEvent(server), '');\n};\n\nexport const startServer = (_server: Server) => {\n if (_server.namespace.includes(':')) {\n throw new Error('`:` is not a legal character for a namespace in: ' + _server.namespace);\n }\n\n const server = {\n ..._server,\n endpoints: { ..._server.endpoints },\n };\n\n start(server);\n};\n","import { system } from '@minecraft/server';\nimport { buildServerNamespace, InputMessage, OutputMessage, inputMessageEvent } from './Communication';\nimport { makeId } from './Utils';\nimport { internalMessageReceived, internalSendMessage } from './Transport';\n\ninterface ResponseListenerInput {\n timeout: number;\n endpoint: string;\n namespace: string;\n localNamespace: string;\n eventKey: string;\n}\n\nconst responseListener = (input: ResponseListenerInput): [() => void, Promise<unknown>] => {\n let handler: ReturnType<typeof system.afterEvents.scriptEventReceive.subscribe>;\n const promise = new Promise<unknown>((resolve, reject) => {\n const cancelHandler = system.runTimeout(() => {\n reject(new Error(`Timeout: Timed out trying to run ${input.endpoint} of ${input.namespace}`));\n }, input.timeout);\n\n handler = system.afterEvents.scriptEventReceive.subscribe(\n async (event) => {\n if (event.id === input.eventKey) {\n try {\n const response = await internalMessageReceived(event.message);\n const returnMessage: OutputMessage = response.header as OutputMessage;\n if (returnMessage.isError) {\n reject(new Error(response.data as string));\n } else {\n if (returnMessage.hasReturn) {\n resolve(response.data);\n } else {\n resolve(undefined);\n }\n }\n } catch (e) {\n reject(e);\n } finally {\n system.clearRun(cancelHandler);\n }\n }\n },\n {\n namespaces: [input.localNamespace],\n }\n );\n });\n\n const clean = () => {\n system.afterEvents.scriptEventReceive.unsubscribe(handler);\n };\n\n return [clean, promise];\n};\n\nexport const sendMessage = async (\n namespace: string,\n endpoint: string,\n args: Array<unknown> | undefined,\n timeout: number = 60\n): Promise<unknown> => {\n const messageId = makeId();\n const localNamespace = `${buildServerNamespace(namespace)}_${messageId}`;\n const eventKey = `${localNamespace}:${endpoint}`;\n\n const message: InputMessage = {\n id: messageId,\n endpoint: endpoint,\n timeout,\n };\n\n const [clean, promise] = responseListener({\n endpoint,\n eventKey,\n localNamespace,\n namespace,\n timeout,\n });\n\n try {\n internalSendMessage(message, args, inputMessageEvent(namespace));\n\n return await promise;\n } finally {\n clean();\n }\n};\n"],"names":[],"mappings":";;AAgBA,MAAM,uBAAuB,GAAG,eAAe;AAExC,MAAM,oBAAoB,GAAG,CAAC,SAAiB,KAAK,CAAG,EAAA,uBAAuB,CAAI,CAAA,EAAA,SAAS,EAAE;AAE7F,MAAM,iBAAiB,GAAG,CAAC,SAAiB,KAAK,GAAG,oBAAoB,CAAC,SAAS,CAAC,oBAAoB;AAEvG,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,OAAe,KAAI;AAC1D,IAAA,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC;AACxC,CAAC;;ICxBW;AAAZ,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,eAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM;AACN,IAAA,eAAA,CAAA,eAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM;AACN,IAAA,eAAA,CAAA,eAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM;AACN,IAAA,eAAA,CAAA,eAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAK;AACL,IAAA,eAAA,CAAA,eAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI;AACJ,IAAA,eAAA,CAAA,eAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAG;AACL,CAAC,EAPW,eAAe,KAAf,eAAe,GAO1B,EAAA,CAAA,CAAA;AAkDD,MAAM,YAAY,GAAG,CAAC,MAAuB,EAAE,GAAY,KAAI;AAC7D,IAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AACtB,QAAA,IAAI,GAAG,KAAK,SAAS,EAAE;AACrB,YAAA,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC;;;AAIjE,IAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AACrB,QAAA,IAAI,GAAG,KAAK,IAAI,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;;;AAGrE,CAAC;MAEY,QAAQ,GAAG,CAAC,MAAmB,EAAE,GAAY,KAAI;AAC5D,IAAA,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;AAE1B,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACzB,IAAI,MAAM,GAAG,KAAK;QAClB,MAAM,MAAM,GAAG,EAAE;AACjB,QAAA,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE;AAC9B,YAAA,IAAI;AACF,gBAAA,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC;gBACxB,MAAM,GAAG,IAAI;gBACb;;YACA,OAAO,CAAC,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;;;QAIlB,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,6CAA6C,CAAC;;QAEjF;;AAGF,IAAA,IAAI,MAAM,KAAK,eAAe,CAAC,GAAG,EAAE;QAClC;;AAGF,IAAA,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC;IAEzB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE;QACrC;;IAGF,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,EAAE;QAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACtD,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;;;SAExD,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,KAAK,EAAE;QAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;;AAGjD,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE;AACvB,gBAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;;;;SAG5B,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,EAAE;AACjD,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3B,YAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;;;SAE5C,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,EAAE;AAC/C,QAAA,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;;;SAE1C,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,EAAE;AACjD,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACjD,YAAA,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC;;AAGlD,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;YAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAClC,gBAAA,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE;AACzB,oBAAA,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAG,GAA0B,CAAC,GAAG,CAAC,CAAC;;qBAC1D;AACL,oBAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AACrB,wBAAA,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,GAAG,CAAC;;oBAGxD,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAG,GAA0B,CAAC,GAAG,CAAC,CAAC;;;;AAG3D,aAAA,IAAI,MAAM,CAAC,SAAS,EAAE;AAC3B,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;YAClC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;;;AAG/D;MAEa,aAAa,GAAG,CAAC,OAA2B,EAAE,IAAoB,KAAI;AACjF,IAAA,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;IAChB,OAAO,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;;AAGtB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;;AAEjC;AAEA,MAAM,SAAS,GAAG,CAAC,MAAmB,KAAoB;AACxD,IAAA,IAAI,MAAM,KAAK,eAAe,CAAC,MAAM,EAAE;QACrC,OAAO;YACL,IAAI,EAAE,eAAe,CAAC,MAAM;SAC7B;;AACI,SAAA,IAAI,MAAM,KAAK,eAAe,CAAC,MAAM,EAAE;QAC5C,OAAO;YACL,IAAI,EAAE,eAAe,CAAC,MAAM;SAC7B;;AACI,SAAA,IAAI,MAAM,KAAK,eAAe,CAAC,MAAM,EAAE;QAC5C,OAAO;YACL,IAAI,EAAE,eAAe,CAAC,MAAM;SAC7B;;AACI,SAAA,IAAI,MAAM,KAAK,eAAe,CAAC,KAAK,EAAE;QAC3C,OAAO;YACL,IAAI,EAAE,eAAe,CAAC,KAAK;SAC5B;;AACI,SAAA,IAAI,MAAM,KAAK,eAAe,CAAC,IAAI,EAAE;QAC1C,OAAO;YACL,IAAI,EAAE,eAAe,CAAC,IAAI;SAC3B;;AAGH,IAAA,OAAO,MAAM;AACf,CAAC;;ACxLM,MAAM,MAAM,GAAG,MAAa;AACjC,IAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAChD,CAAC;;ACaD,MAAM,aAAa,GAAG,mBAAmB;AAEzC,MAAM,mBAAmB,GAAG,CAAC,EAAU,KAAK,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,EAAE,CAAA,SAAA,CAAW;AAC7E,MAAM,iBAAiB,GAAG,CAAC,EAAU,KAAK,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,EAAE,CAAA,OAAA,CAAS;AAEzE,MAAM,eAAe,GAAG,MAAkC;AACxD,IAAA,IAAI,QAAQ,GAAe,MAAK,GAAG;IACnC,OAAO;AACL,QAAA,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YACtB,QAAQ,GAAG,OAAO;AACpB,SAAC,CAAC;QACF,QAAQ;KACT;AACH,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,WAAmB,KAAI;IAC9C,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,eAAe,EAAE;IAEtC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3C,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAC9D,CAAC,KAAK,KAAI;AACR,QAAA,IAAI,KAAK,CAAC,EAAE,KAAK,WAAW,EAAE;AAC5B,YAAA,GAAG,EAAE;;AAET,KAAC,EACD;QACE,UAAU,EAAE,CAAC,SAAS,CAAC;AACxB,KAAA,CACF;AAED,IAAA,MAAM,KAAK;IAEX,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC7D,CAAC;AAEM,MAAM,mBAAmB,GAAG,OACjC,MAAe,EACf,IAAa,EACb,WAAmB,EACnB,cAAc,GAAG,IAAI,KACnB;AACF,IAAA,MAAM,EAAE,GAAG,MAAM,EAAE;IAEnB,MAAM,MAAM,GAAkB,EAAE;AAEhC,IAAA,IAAI,IAAI,KAAK,SAAS,EAAE;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,cAAc,EAAE;AAC1D,YAAA,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC;;;AAIxD,IAAA,MAAM,eAAe,GAAoB;QACvC,EAAE;QACF,MAAM;KACP;AAED,IAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,QAAA,eAAe,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM;;IAG5C,MAAM,UAAU,GAAG,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;AAC1D,IAAA,IAAI,kBAAkB,CAAC,MAAM,GAAG,IAAI,EAAE;AACpC,QAAA,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,kBAAkB,CAAC;AACrF,QAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;;AAGzD,IAAA,SAAS,CAAC,WAAW,EAAE,kBAAkB,CAAC;AAE1C,IAAA,MAAM,UAAU;AAChB,IAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACrB,MAAM,SAAS,GAAG,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;AAElD,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,SAAS,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;;AAG3C,QAAA,MAAM,SAAS;;AAEnB,CAAC;AAEM,MAAM,uBAAuB,GAAG,OAAO,SAAiB,KAAuB;IACpF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAA6B;AAChE,IAAA,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE;IAEpB,IAAI,CAAC,EAAE,EAAE;AACP,QAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,CAAC;AAC/C,QAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;;AAGzC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU;IACpC,MAAM,MAAM,GAAkB,EAAE;IAChC,IAAI,IAAI,GAAG,SAAS;AAEpB,IAAA,IAAI,UAAU,IAAI,UAAU,GAAG,CAAC,EAAE;QAChC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,eAAe,EAAE;AAEtC,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAC9D,CAAC,KAAK,KAAI;YACR,IAAI,KAAK,CAAC,EAAE,KAAK,mBAAmB,CAAC,EAAE,CAAC,EAAE;AACxC,gBAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAE1B,gBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE;AAChC,oBAAA,GAAG,EAAE;;;AAGX,SAAC,EACD;YACE,UAAU,EAAE,CAAC,aAAa,CAAC;AAC5B,SAAA,CACF;QAED,SAAS,CAAC,CAAG,EAAA,iBAAiB,CAAC,EAAE,CAAC,CAAE,CAAA,EAAE,EAAE,CAAC;AAEzC,QAAA,MAAM,KAAK;QACX,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC,QAAQ,CAAC;QAE3D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/B,QAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1B,SAAS,CAAC,CAAG,EAAA,iBAAiB,CAAC,EAAE,CAAC,CAAE,CAAA,EAAE,EAAE,CAAC;;IAG3C,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI;KACL;AACH,CAAC;;ACzHD,MAAM,eAAe,GAAG,CAAC,MAAc,KAAK,CAAG,EAAA,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB;AACtG,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAE,OAAsB,KAAI;AACtE,IAAA,MAAM,cAAc,GAAG,CAAG,EAAA,oBAAoB,CAAC,SAAS,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,EAAE,CAAA,CAAE;AACzE,IAAA,OAAO,GAAG,cAAc,CAAA,CAAA,EAAI,OAAO,CAAC,QAAQ,EAAE;AAChD,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,OAAqB,EAAE,KAAa,KAAI;AAC3E,IAAA,MAAM,OAAO,GAAkB;QAC7B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;AAC1B,QAAA,SAAS,EAAE,KAAK;AAChB,QAAA,OAAO,EAAE,IAAI;KACd;AAED,IAAA,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,OAAqB,EAAE,KAAc,KAAI;AAC5E,IAAA,MAAM,OAAO,GAAkB;QAC7B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,KAAK,KAAK,SAAS;AAC9B,QAAA,OAAO,EAAE,KAAK;KACf;AAED,IAAA,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,MAAc,KAAI;AAC/B,IAAA,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC;IACzC,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC;AACxD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAC7D,OAAO,KAAK,KAAI;AACd,QAAA,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,EAAE;YAC1B,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC;;AACrD,aAAA,IAAI,KAAK,CAAC,EAAE,KAAK,YAAY,EAAE;YACpC,MAAM,eAAe,GAAG,MAAM,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC;AACpE,YAAA,MAAM,OAAO,GAAG,eAAe,CAAC,MAAsB;YAEtD,IAAI,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE;gBAC3C,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,CAAY,SAAA,EAAA,OAAO,CAAC,QAAQ,CAAY,UAAA,CAAA,CAAC;gBACtE;;AAGF,YAAA,MAAM,MAAM,IAAI,eAAe,CAAC,IAAI,KAAK,SAAS,GAAG,EAAE,GAAG,eAAe,CAAC,IAAI,CAAmB;YAEjG,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;AACnD,YAAA,IAAI,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE;AAC9B,gBAAA,IAAI;oBACF,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;;gBAChD,OAAO,CAAC,EAAE;oBACV,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,CAA2C,wCAAA,EAAA,CAAC,CAAE,CAAA,CAAC;;;YAIhF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;AAElD,YAAA,IAAI,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE;AAChC,gBAAA,IAAI;oBACF,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC;;gBAC/C,OAAO,CAAC,EAAE;oBACV,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,CAA8C,2CAAA,EAAA,CAAC,CAAE,CAAA,CAAC;;;AAInF,YAAA,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;;AAE1C,KAAC,EACD;QACE,UAAU,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACrD,KAAA,CACF;AACH,CAAC;AAMY,MAAA,WAAW,GAAG,CAAC,OAAe,KAAI;IAC7C,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACnC,MAAM,IAAI,KAAK,CAAC,mDAAmD,GAAG,OAAO,CAAC,SAAS,CAAC;;AAG1F,IAAA,MAAM,MAAM,GAAG;AACb,QAAA,GAAG,OAAO;AACV,QAAA,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE;KACpC;IAED,KAAK,CAAC,MAAM,CAAC;AACf;;ACjGA,MAAM,gBAAgB,GAAG,CAAC,KAA4B,KAAoC;AACxF,IAAA,IAAI,OAA2E;IAC/E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,KAAI;AACvD,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;AAC3C,YAAA,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,KAAK,CAAC,QAAQ,CAAA,IAAA,EAAO,KAAK,CAAC,SAAS,CAAE,CAAA,CAAC,CAAC;AAC/F,SAAC,EAAE,KAAK,CAAC,OAAO,CAAC;AAEjB,QAAA,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,CACvD,OAAO,KAAK,KAAI;YACd,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE;AAC/B,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC;AAC7D,oBAAA,MAAM,aAAa,GAAkB,QAAQ,CAAC,MAAuB;AACrE,oBAAA,IAAI,aAAa,CAAC,OAAO,EAAE;wBACzB,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAc,CAAC,CAAC;;yBACrC;AACL,wBAAA,IAAI,aAAa,CAAC,SAAS,EAAE;AAC3B,4BAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;;6BACjB;4BACL,OAAO,CAAC,SAAS,CAAC;;;;gBAGtB,OAAO,CAAC,EAAE;oBACV,MAAM,CAAC,CAAC,CAAC;;wBACD;AACR,oBAAA,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;;;AAGpC,SAAC,EACD;AACE,YAAA,UAAU,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;AACnC,SAAA,CACF;AACH,KAAC,CAAC;IAEF,MAAM,KAAK,GAAG,MAAK;QACjB,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC;AAC5D,KAAC;AAED,IAAA,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;AACzB,CAAC;AAEM,MAAM,WAAW,GAAG,OACzB,SAAiB,EACjB,QAAgB,EAChB,IAAgC,EAChC,OAAkB,GAAA,EAAE,KACA;AACpB,IAAA,MAAM,SAAS,GAAG,MAAM,EAAE;IAC1B,MAAM,cAAc,GAAG,CAAA,EAAG,oBAAoB,CAAC,SAAS,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE;AACxE,IAAA,MAAM,QAAQ,GAAG,CAAA,EAAG,cAAc,CAAI,CAAA,EAAA,QAAQ,EAAE;AAEhD,IAAA,MAAM,OAAO,GAAiB;AAC5B,QAAA,EAAE,EAAE,SAAS;AACb,QAAA,QAAQ,EAAE,QAAQ;QAClB,OAAO;KACR;AAED,IAAA,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAAC;QACxC,QAAQ;QACR,QAAQ;QACR,cAAc;QACd,SAAS;QACT,OAAO;AACR,KAAA,CAAC;AAEF,IAAA,IAAI;QACF,mBAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEhE,OAAO,MAAM,OAAO;;YACZ;AACR,QAAA,KAAK,EAAE;;AAEX;;;;"}
|