···11{
22 "name": "snowflake",
33 "version": "0.0.1",
44- "description": "Simple, single-user event aggregation platform, for use in personal websites and other related places.",
44+ "description": "Simple, single-user event aggregation platform, for use in personal websites, analytics and other related places.",
55 "keywords": [
66 "event-aggregation",
77 "event-streaming",
+4-50
src/lib/stores.ts
···11-// ------------------------------------------------------------
22-// Snowflake
33-// ------------------------------------------------------------
44-55-export interface ISnowflake<
66- Type extends string,
77- Template extends object = object,
88-> {
99- id: string;
1010- type: Type;
1111- data: Template;
1212- createdAt: number;
1313-}
1414-1515-export class Snowflake<
1616- Type extends string,
1717- Template extends object = object,
1818-> implements ISnowflake<Type, Template> {
1919- constructor(
2020- public id: string,
2121- public type: Type,
2222- public data: Template,
2323- public createdAt: number = Date.now(),
2424- ) {}
2525-}
2626-2727-// ------------------------------------------------------------
2828-// Event
2929-// ------------------------------------------------------------
3030-3131-export interface IEvent<T extends object = object> {
3232- source: string;
3333- name: string;
3434- data: T;
3535-}
11+import type { Event } from "$lib/utils/Event";
22+import type { State } from "$lib/utils/State";
3633737-export class Event<T extends object = object> implements IEvent<T> {
3838- constructor(
3939- public source: string,
4040- public name: string,
4141- public data: T = {} as T,
4242- ) {}
4343-}
4444-4545-export const events: Snowflake<"event", IEvent>[] = [];
4646-4747-// ------------------------------------------------------------
4848-// State
4949-// ------------------------------------------------------------
5050-5151-export const states: Snowflake<"state", object>[] = [];
44+export const events: Event[] = [];
55+export const states: State[] = [];
+10
src/lib/utils/Event.ts
···11+export class Event<T extends object = object> {
22+ public id: string = crypto.randomUUID();
33+ public createdAt: number = Date.now();
44+55+ constructor(
66+ public source: string, // The service name, such as "hytale"
77+ public name: string, // The event name, such as "server.connected"
88+ public data: T = {} as T, // Event specific data, such as { server: { id, name }, user: { id, name } }
99+ ) {}
1010+}
+11
src/lib/utils/State.ts
···11+export class State {
22+ public id: string = crypto.randomUUID();
33+ public createdAt: number = Date.now();
44+ public updatedAt: number = Date.now();
55+66+ constructor(
77+ public source: string, // The service name this state connects to, such as "hytale"
88+ public key: string, // The key of the state, such as "current.status", "current.gamemode" or "current.server.name"
99+ public value: string, // The value of the state, such as "online", "offline", "survival", "creative", "server1", "server2"
1010+ ) {}
1111+}
+10-16
src/routes/events/index.ts
···33// ------------------------------------------------------------
4455import { Hono } from "hono";
66-import { Snowflake, Event, events } from "../../lib/stores";
66+import { events } from "$lib/stores";
77+import { Event } from "$lib/utils/Event";
7889const app = new Hono();
910···1213// ------------------------------------------------------------
13141415app.get("/", async (c) => {
1515- events.push(
1616- new Snowflake(
1717- crypto.randomUUID(),
1818- "event",
1919- new Event("internal", "endpoint.events.get"),
2020- ),
2121- );
1616+ events.push(new Event("internal", "endpoint.events.get"));
22172318 return c.json(events);
2419});
25202621app.post("/", async (c) => {
2722 const body = await c.req.json();
2828- if (!body.source || !body.name || !body.data) {
2929- return c.json({ error: "Invalid event" }, 400);
2323+ if (!body.source || !body.name) {
2424+ return c.json(
2525+ { error: "Missing required parameter 'source' or 'name'" },
2626+ 422,
2727+ );
3028 }
31293232- // Build event and wrap it in a snowflake
3333- const event = new Snowflake(
3434- crypto.randomUUID(),
3535- "event",
3636- new Event(body.source, body.name, body.data),
3737- );
3030+ // Build event
3131+ const event = new Event(body.source, body.name, body.data ?? {});
38323933 events.push(event);
4034 return c.json(body);