feat: lots of stuff

This commit is contained in:
Morten Olsen
2025-10-16 00:23:18 +02:00
parent 521ffd395f
commit 8e594d59fd
30 changed files with 1739 additions and 31 deletions

View File

@@ -0,0 +1,73 @@
import mqtt, { connectAsync, MqttClient } from 'mqtt';
import getPort from 'get-port';
import { AccessHandler } from '#root/access/access.handler.ts';
import { type Statement } from '#root/access/access.schemas.ts';
import { AccessTokens } from '#root/access/access.token.ts';
import { MqttServer } from '#root/server/server.ts';
import type { TopicDefinition } from '#root/topics/topcis.schemas.ts';
import { TopicsHandler } from '#root/topics/topics.handler.ts';
import { TopicsStore } from '#root/topics/topics.store.ts';
type CreateSocketOptions = {
port: number;
token: string;
};
const createSocket = async (options: CreateSocketOptions) => {
const { port, token } = options;
const mqttClient = await connectAsync(`ws://localhost:${port}/ws`, {
username: 'token',
password: token,
reconnectOnConnackError: false,
});
return mqttClient;
};
type WorldOptions = {
topics?: TopicDefinition[];
};
const createWorld = async (options: WorldOptions) => {
const { topics = [] } = options;
const secret = 'test';
const accessHandler = new AccessHandler();
const accessTokens = new AccessTokens({
secret,
});
accessHandler.register('token', accessTokens);
const topicsHandler = new TopicsHandler();
const topicsStore = new TopicsStore();
topicsStore.register(...topics);
topicsHandler.register(topicsStore);
const server = new MqttServer({ topicsHandler, accessHandler });
const fastify = await server.getHttpServer();
const port = await getPort();
await fastify.listen({ port });
const sockets: MqttClient[] = [];
return {
connect: async (...clients: Statement[][]) => {
const newSockets = await Promise.all(
clients.map((statements) =>
createSocket({
port,
token: accessTokens.generate({
statements,
}),
}),
),
);
sockets.push(...newSockets);
return newSockets;
},
destroy: async () => {
await Promise.all(sockets.map((s) => s.endAsync()));
await fastify.close();
},
};
};
type World = Awaited<ReturnType<typeof createWorld>>;
export type { World };
export { createWorld };