decentralised message store

Compare changes

Choose any two refs to compare.

Changed files
+701 -57
.github
workflows
drizzle
src
lib
routes
xrpc
_health
systems.gmstn.development.shard.getOwner
server
+4 -2
src/lib/sessions.ts
···
import type { Result } from "@/lib/utils/result";
import type { AtUri, Did } from "@/lib/types/atproto";
import { atUriSchema, didSchema } from "@/lib/types/atproto";
-
import { SERVICE_DID } from "@/lib/env";
+
import { SERVER_PORT, SERVICE_DID } from "@/lib/env";
export const sessionInfoSchema = z.object({
id: z.string(),
···
hmac.update(`${token}:${sessionId}`);
const fingerprint = hmac.digest("hex");
-
const shardDid = SERVICE_DID;
+
const shardDid: Did = SERVICE_DID.includes("localhost")
+
? `${SERVICE_DID}%3A${SERVER_PORT.toString()}`
+
: SERVICE_DID;
return {
id: sessionId,
drizzle/0000_powerful_professor_monster.sql drizzle/0000_cute_maginty.sql
+1 -1
drizzle/meta/0000_snapshot.json
···
{
"version": "6",
"dialect": "sqlite",
-
"id": "0313582b-1157-40b9-a307-168f53b51012",
+
"id": "86ec75bd-9ac5-453e-a223-8c0b5ee135d4",
"prevId": "00000000-0000-0000-0000-000000000000",
"tables": {
"messages": {
+2 -2
drizzle/meta/_journal.json
···
{
"idx": 0,
"version": "6",
-
"when": 1760861619063,
-
"tag": "0000_powerful_professor_monster",
+
"when": 1761759684737,
+
"tag": "0000_cute_maginty",
"breakpoints": true
}
]
-40
src/lib/types/ws/index.ts
···
-
import { shardMessagesInsertSchema } from "@/db/schema/messages";
-
import { verificationRequestSchema } from "@/lib/types/ws/verify";
-
import { z } from "zod";
-
-
export const WebSocketMessageType = {
-
SHARD_VERIFY: "shard/verify",
-
SHARD_MESSAGE: "shard/message",
-
} as const;
-
export const webSocketMessageTypeSchema = z.enum(WebSocketMessageType);
-
export type WebSocketMessageType = z.infer<typeof webSocketMessageTypeSchema>;
-
-
const webSocketMessageBase = z.object({
-
type: webSocketMessageTypeSchema,
-
data: z.unknown(),
-
});
-
-
export const verificationMessageSchema = webSocketMessageBase.safeExtend({
-
type: z.literal("shard/verify"),
-
data: verificationRequestSchema,
-
});
-
export type VerificationMessage = z.infer<typeof verificationMessageSchema>;
-
-
// there are only two difficult things in programming.
-
// 1. naming things
-
// 2. cache invalidation
-
// 3. off-by-one errors
-
export const shardMessageMessageSchema = webSocketMessageBase.safeExtend({
-
type: z.literal("shard/message"),
-
data: z.object({
-
message: shardMessagesInsertSchema,
-
sessionId: z.string(),
-
}),
-
});
-
export type ShardMessage = z.infer<typeof shardMessageMessageSchema>;
-
-
export const webSocketMessageSchema = z.union([
-
verificationMessageSchema,
-
shardMessageMessageSchema,
-
]);
-
export type WebSocketMessage = z.infer<typeof webSocketMessageSchema>;
-8
src/lib/types/ws/verify.ts
···
-
import { atUriSchema } from "@/lib/types/atproto";
-
import { z } from "zod";
-
-
export const verificationRequestSchema = z.object({
-
interServiceJwt: z.unknown(),
-
channelAtUris: z.array(atUriSchema),
-
});
-
export type VerificationRequest = z.infer<typeof verificationRequestSchema>;
+45
src/lib/utils/ws/validate.ts
···
+
import type { WebsocketMessage } from "@/lib/types/messages";
+
import { websocketMessageSchema } from "@/lib/types/messages";
+
import type { Result } from "@/lib/utils/result";
+
import { z } from "zod";
+
import type { RawData } from "ws";
+
+
export const rawDataToString = (data: RawData): string => {
+
if (Buffer.isBuffer(data)) {
+
return data.toString("utf-8");
+
}
+
if (Array.isArray(data)) {
+
return Buffer.concat(data).toString("utf-8");
+
}
+
return new TextDecoder().decode(data);
+
};
+
+
export const validateWsMessageString = (
+
data: unknown,
+
): Result<string, unknown> => {
+
const { success, error, data: message } = z.string().safeParse(data);
+
if (!success) {
+
console.error("Error decoding websocket message");
+
console.error(error);
+
return { ok: false, error: z.treeifyError(error) };
+
}
+
return { ok: true, data: message };
+
};
+
+
export const validateWsMessageType = (
+
data: unknown,
+
): Result<WebsocketMessage, unknown> => {
+
const {
+
success: wsMessageSuccess,
+
error: wsMessageError,
+
data: wsMessage,
+
} = websocketMessageSchema.safeParse(data);
+
if (!wsMessageSuccess) {
+
console.error(
+
"Error parsing websocket message. The data might be the wrong shape.",
+
);
+
console.error(wsMessageError);
+
return { ok: false, error: z.treeifyError(wsMessageError) };
+
}
+
return { ok: true, data: wsMessage };
+
};
+2
src/lib/types/messages.ts
···
type: z.literal("shard/history"),
messages: z.optional(z.array(shardMessageSchema)),
channel: z.string(),
+
forClient: didSchema,
})
.strict();
export type HistoryMessage = z.infer<typeof historyMessageSchema>;
···
.safeExtend({
type: z.literal("shard/requestHistory"),
channel: z.string(),
+
requestedBy: didSchema,
})
.strict();
export type RequestHistoryMessage = z.infer<typeof requestHistoryMessageSchema>;
+9
src/lib/handlers/getOwnerDid.ts
···
+
import { OWNER_DID } from "@/lib/env";
+
import { getRegistrationState } from "@/lib/state";
+
import type { RouteHandler } from "@/lib/types/routes";
+
import { newSuccessResponse } from "@/lib/utils/http/responses";
+
+
export const getOwnerHandler: RouteHandler = () => {
+
const { registered } = getRegistrationState();
+
return newSuccessResponse({ registered, ownerDid: OWNER_DID });
+
};
+11 -1
src/lib/types/http/responses.ts
···
import { sessionInfoSchema } from "@/lib/sessions";
+
import { didSchema } from "@/lib/types/atproto";
import { httpResponseErrorInfoSchema } from "@/lib/types/http/errors";
import { z } from "zod";
···
});
export type HandshakeResponse = z.infer<typeof handshakeResponseSchema>;
-
export const httpResponseDataSchema = z.union([handshakeResponseSchema]);
+
export const getOwnerDidResponseSchema = z.object({
+
registered: z.boolean(),
+
ownerDid: didSchema,
+
});
+
export type GetOwnerDidResponse = z.infer<typeof getOwnerDidResponseSchema>;
+
+
export const httpResponseDataSchema = z.union([
+
handshakeResponseSchema,
+
getOwnerDidResponseSchema,
+
]);
export type HttpResponseData = z.infer<typeof httpResponseDataSchema>;
const httpResponseBaseSchema = z.object({
+5
src/routes/index.ts
···
import { didWebDocRoute } from "@/routes/dot-well-known/did-dot-json/route";
import { handshakeRoute } from "@/routes/handshake/route";
import { indexRoute } from "@/routes/route";
+
import { healthRoute } from "@/routes/xrpc/_health/route";
+
import { systemsGmstnDevelopmentShardGetOwnerRoute } from "@/routes/xrpc/systems.gmstn.development.shard.getOwner/route";
export const routes: Record<string, Route | WsRoute> = {
"/": indexRoute,
"/.well-known/did.json": didWebDocRoute,
"/handshake": handshakeRoute,
"/connect": connectRoute,
+
"/xrpc/_health": healthRoute,
+
"/xrpc/systems.gmstn.development.shard.getOwner":
+
systemsGmstnDevelopmentShardGetOwnerRoute,
};
+10
src/routes/xrpc/_health/route.ts
···
+
import type { Route } from "@/lib/types/routes";
+
+
export const healthRoute: Route = {
+
method: "GET",
+
handler: () => {
+
return new Response("this shard is running at 0.0.1", {
+
headers: { "content-type": "text/plain; charset=utf-8" },
+
});
+
},
+
};
+7
src/routes/xrpc/systems.gmstn.development.shard.getOwner/route.ts
···
+
import { getOwnerHandler } from "@/lib/handlers/getOwnerDid";
+
import type { Route } from "@/lib/types/routes";
+
+
export const systemsGmstnDevelopmentShardGetOwnerRoute: Route = {
+
method: "GET",
+
handler: getOwnerHandler,
+
};
+5
src/server/index.ts
···
import websocket from "@fastify/websocket";
+
import cors from "@fastify/cors";
import Fastify from "fastify";
export const setupServer = async () => {
···
logger: true,
});
+
await fastify.register(cors, {
+
origin: true,
+
});
+
await fastify.register(websocket);
return fastify;
+547
pnpm-lock.yaml
···
prettier:
specifier: ^3.6.2
version: 3.6.2
+
tsdown:
+
specifier: ^0.16.1
+
version: 0.16.1(typescript@5.9.3)
typescript:
specifier: ^5.9.3
version: 5.9.3
···
'@atcute/xrpc-server@0.1.2':
resolution: {integrity: sha512-smBmWGEM6nBTq2ozONXBCJtvFzTEnJgH6cALGfq26k38k/OmX6mpMvr5/Z0Iuc6+rNG2j3YY/kOSl+z3c8JOVg==}
+
'@babel/generator@7.28.5':
+
resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
+
engines: {node: '>=6.9.0'}
+
+
'@babel/helper-string-parser@7.27.1':
+
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+
engines: {node: '>=6.9.0'}
+
+
'@babel/helper-validator-identifier@7.28.5':
+
resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+
engines: {node: '>=6.9.0'}
+
+
'@babel/parser@7.28.5':
+
resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
+
engines: {node: '>=6.0.0'}
+
hasBin: true
+
+
'@babel/types@7.28.5':
+
resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
+
engines: {node: '>=6.9.0'}
+
'@badrap/valita@0.4.6':
resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==}
engines: {node: '>= 18'}
···
'@drizzle-team/brocli@0.10.2':
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
+
'@emnapi/core@1.7.0':
+
resolution: {integrity: sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==}
+
+
'@emnapi/runtime@1.7.0':
+
resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==}
+
+
'@emnapi/wasi-threads@1.1.0':
+
resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
+
'@esbuild-kit/core-utils@3.3.2':
resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
deprecated: 'Merged into tsx: https://tsx.is'
···
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
+
'@jridgewell/gen-mapping@0.3.13':
+
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+
'@jridgewell/resolve-uri@3.1.2':
+
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+
engines: {node: '>=6.0.0'}
+
+
'@jridgewell/sourcemap-codec@1.5.5':
+
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+
'@jridgewell/trace-mapping@0.3.31':
+
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
'@libsql/client@0.15.15':
resolution: {integrity: sha512-twC0hQxPNHPKfeOv3sNT6u2pturQjLcI+CnpTM0SjRpocEGgfiZ7DWKXLNnsothjyJmDqEsBQJ5ztq9Wlu470w==}
···
cpu: [x64]
os: [win32]
+
'@napi-rs/wasm-runtime@1.0.7':
+
resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==}
+
'@neon-rs/load@0.0.4':
resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==}
···
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
+
'@oxc-project/runtime@0.96.0':
+
resolution: {integrity: sha512-34lh4o9CcSw09Hx6fKihPu85+m+4pmDlkXwJrLvN5nMq5JrcGhhihVM415zDqT8j8IixO1PYYdQZRN4SwQCncg==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
+
'@oxc-project/types@0.96.0':
+
resolution: {integrity: sha512-r/xkmoXA0xEpU6UGtn18CNVjXH6erU3KCpCDbpLmbVxBFor1U9MqN5Z2uMmCHJuXjJzlnDR+hWY+yPoLo8oHDw==}
+
'@pinojs/redact@0.4.0':
resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==}
+
'@quansync/fs@0.1.5':
+
resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==}
+
+
'@rolldown/binding-android-arm64@1.0.0-beta.47':
+
resolution: {integrity: sha512-vPP9/MZzESh9QtmvQYojXP/midjgkkc1E4AdnPPAzQXo668ncHJcVLKjJKzoBdsQmaIvNjrMdsCwES8vTQHRQw==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [android]
+
+
'@rolldown/binding-darwin-arm64@1.0.0-beta.47':
+
resolution: {integrity: sha512-Lc3nrkxeaDVCVl8qR3qoxh6ltDZfkQ98j5vwIr5ALPkgjZtDK4BGCrrBoLpGVMg+csWcaqUbwbKwH5yvVa0oOw==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [darwin]
+
+
'@rolldown/binding-darwin-x64@1.0.0-beta.47':
+
resolution: {integrity: sha512-eBYxQDwP0O33plqNVqOtUHqRiSYVneAknviM5XMawke3mwMuVlAsohtOqEjbCEl/Loi/FWdVeks5WkqAkzkYWQ==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [x64]
+
os: [darwin]
+
+
'@rolldown/binding-freebsd-x64@1.0.0-beta.47':
+
resolution: {integrity: sha512-Ns+kgp2+1Iq/44bY/Z30DETUSiHY7ZuqaOgD5bHVW++8vme9rdiWsN4yG4rRPXkdgzjvQ9TDHmZZKfY4/G11AA==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [x64]
+
os: [freebsd]
+
+
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.47':
+
resolution: {integrity: sha512-4PecgWCJhTA2EFOlptYJiNyVP2MrVP4cWdndpOu3WmXqWqZUmSubhb4YUAIxAxnXATlGjC1WjxNPhV7ZllNgdA==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm]
+
os: [linux]
+
+
'@rolldown/binding-linux-arm64-gnu@1.0.0-beta.47':
+
resolution: {integrity: sha512-CyIunZ6D9U9Xg94roQI1INt/bLkOpPsZjZZkiaAZ0r6uccQdICmC99M9RUPlMLw/qg4yEWLlQhG73W/mG437NA==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [linux]
+
+
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.47':
+
resolution: {integrity: sha512-doozc/Goe7qRCSnzfJbFINTHsMktqmZQmweull6hsZZ9sjNWQ6BWQnbvOlfZJe4xE5NxM1NhPnY5Giqnl3ZrYQ==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [linux]
+
+
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.47':
+
resolution: {integrity: sha512-fodvSMf6Aqwa0wEUSTPewmmZOD44rc5Tpr5p9NkwQ6W1SSpUKzD3SwpJIgANDOhwiYhDuiIaYPGB7Ujkx1q0UQ==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [x64]
+
os: [linux]
+
+
'@rolldown/binding-linux-x64-musl@1.0.0-beta.47':
+
resolution: {integrity: sha512-Rxm5hYc0mGjwLh5sjlGmMygxAaV2gnsx7CNm2lsb47oyt5UQyPDZf3GP/ct8BEcwuikdqzsrrlIp8+kCSvMFNQ==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [x64]
+
os: [linux]
+
+
'@rolldown/binding-openharmony-arm64@1.0.0-beta.47':
+
resolution: {integrity: sha512-YakuVe+Gc87jjxazBL34hbr8RJpRuFBhun7NEqoChVDlH5FLhLXjAPHqZd990TVGVNkemourf817Z8u2fONS8w==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [openharmony]
+
+
'@rolldown/binding-wasm32-wasi@1.0.0-beta.47':
+
resolution: {integrity: sha512-ak2GvTFQz3UAOw8cuQq8pWE+TNygQB6O47rMhvevvTzETh7VkHRFtRUwJynX5hwzFvQMP6G0az5JrBGuwaMwYQ==}
+
engines: {node: '>=14.0.0'}
+
cpu: [wasm32]
+
+
'@rolldown/binding-win32-arm64-msvc@1.0.0-beta.47':
+
resolution: {integrity: sha512-o5BpmBnXU+Cj+9+ndMcdKjhZlPb79dVPBZnWwMnI4RlNSSq5yOvFZqvfPYbyacvnW03Na4n5XXQAPhu3RydZ0w==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [arm64]
+
os: [win32]
+
+
'@rolldown/binding-win32-ia32-msvc@1.0.0-beta.47':
+
resolution: {integrity: sha512-FVOmfyYehNE92IfC9Kgs913UerDog2M1m+FADJypKz0gmRg3UyTt4o1cZMCAl7MiR89JpM9jegNO1nXuP1w1vw==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [ia32]
+
os: [win32]
+
+
'@rolldown/binding-win32-x64-msvc@1.0.0-beta.47':
+
resolution: {integrity: sha512-by/70F13IUE101Bat0oeH8miwWX5mhMFPk1yjCdxoTNHTyTdLgb0THNaebRM6AP7Kz+O3O2qx87sruYuF5UxHg==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
cpu: [x64]
+
os: [win32]
+
+
'@rolldown/pluginutils@1.0.0-beta.47':
+
resolution: {integrity: sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==}
+
'@standard-schema/spec@1.0.0':
resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==}
+
'@tybys/wasm-util@0.10.1':
+
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
···
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
+
ansis@4.2.0:
+
resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==}
+
engines: {node: '>=14'}
+
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
ast-kit@2.2.0:
+
resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==}
+
engines: {node: '>=20.19.0'}
+
atomic-sleep@1.0.0:
resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
engines: {node: '>=8.0.0'}
···
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
birpc@2.7.0:
+
resolution: {integrity: sha512-tub/wFGH49vNCm0xraykcY3TcRgX/3JsALYq/Lwrtti+bTyFHkCUAWF5wgYoie8P41wYwig2mIKiqoocr1EkEQ==}
+
brace-expansion@1.1.12:
resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
···
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
cac@6.7.14:
+
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+
engines: {node: '>=8'}
+
callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
···
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
+
chokidar@4.0.3:
+
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+
engines: {node: '>= 14.16.0'}
+
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
···
resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==}
engines: {node: '>=8'}
+
diff@8.0.2:
+
resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==}
+
engines: {node: '>=0.3.1'}
+
dotenv@17.2.3:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
···
drizzle-orm: '>=0.36.0'
zod: ^3.25.0 || ^4.0.0
+
dts-resolver@2.1.2:
+
resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==}
+
engines: {node: '>=20.18.0'}
+
peerDependencies:
+
oxc-resolver: '>=11.0.0'
+
peerDependenciesMeta:
+
oxc-resolver:
+
optional: true
+
duplexify@4.1.3:
resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==}
+
empathic@2.0.0:
+
resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==}
+
engines: {node: '>=14'}
+
end-of-stream@1.4.5:
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
···
fastq@1.19.1:
resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
fdir@6.5.0:
+
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+
engines: {node: '>=12.0.0'}
+
peerDependencies:
+
picomatch: ^3 || ^4
+
peerDependenciesMeta:
+
picomatch:
+
optional: true
+
fetch-blob@3.2.0:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
engines: {node: ^12.20 || >= 14.13}
···
get-tsconfig@4.12.0:
resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==}
+
get-tsconfig@4.13.0:
+
resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==}
+
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
···
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
+
hookable@5.5.3:
+
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
···
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
+
jsesc@3.1.0:
+
resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+
engines: {node: '>=6'}
+
hasBin: true
+
json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
···
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
magic-string@0.30.21:
+
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
···
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
+
pathe@2.0.3:
+
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
+
picomatch@4.0.3:
+
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+
engines: {node: '>=12'}
+
pino-abstract-transport@2.0.0:
resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==}
···
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
+
quansync@0.2.11:
+
resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
···
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
+
readdirp@4.1.2:
+
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+
engines: {node: '>= 14.18.0'}
+
real-require@0.2.0:
resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
engines: {node: '>= 12.13.0'}
···
rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
rolldown-plugin-dts@0.17.3:
+
resolution: {integrity: sha512-8mGnNUVNrqEdTnrlcaDxs4sAZg0No6njO+FuhQd4L56nUbJO1tHxOoKDH3mmMJg7f/BhEj/1KjU5W9kZ9zM/kQ==}
+
engines: {node: '>=20.18.0'}
+
peerDependencies:
+
'@ts-macro/tsc': ^0.3.6
+
'@typescript/native-preview': '>=7.0.0-dev.20250601.1'
+
rolldown: ^1.0.0-beta.44
+
typescript: ^5.0.0
+
vue-tsc: ~3.1.0
+
peerDependenciesMeta:
+
'@ts-macro/tsc':
+
optional: true
+
'@typescript/native-preview':
+
optional: true
+
typescript:
+
optional: true
+
vue-tsc:
+
optional: true
+
+
rolldown@1.0.0-beta.47:
+
resolution: {integrity: sha512-Mid74GckX1OeFAOYz9KuXeWYhq3xkXbMziYIC+ULVdUzPTG9y70OBSBQDQn9hQP8u/AfhuYw1R0BSg15nBI4Dg==}
+
engines: {node: ^20.19.0 || >=22.12.0}
+
hasBin: true
+
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
···
thread-stream@3.1.0:
resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==}
+
tinyexec@1.0.2:
+
resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
+
engines: {node: '>=18'}
+
+
tinyglobby@0.2.15:
+
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+
engines: {node: '>=12.0.0'}
+
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
···
resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==}
engines: {node: '>=12'}
+
tree-kill@1.2.2:
+
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
+
hasBin: true
+
ts-api-utils@2.1.0:
resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
engines: {node: '>=18.12'}
peerDependencies:
typescript: '>=4.8.4'
+
tsdown@0.16.1:
+
resolution: {integrity: sha512-oCOj9wTDa+0XfuVpaGC3EPNjatpkKtUwelg4HfXD/vz+80wuCFC6og2QePsMRZtFM4io0zdxNxZI5yRQGpDRCA==}
+
engines: {node: '>=20.19.0'}
+
hasBin: true
+
peerDependencies:
+
'@arethetypeswrong/core': ^0.18.1
+
'@vitejs/devtools': ^0.0.0-alpha.10
+
publint: ^0.3.0
+
typescript: ^5.0.0
+
unplugin-lightningcss: ^0.4.0
+
unplugin-unused: ^0.5.0
+
peerDependenciesMeta:
+
'@arethetypeswrong/core':
+
optional: true
+
'@vitejs/devtools':
+
optional: true
+
publint:
+
optional: true
+
typescript:
+
optional: true
+
unplugin-lightningcss:
+
optional: true
+
unplugin-unused:
+
optional: true
+
+
tslib@2.8.1:
+
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
tsx@4.20.6:
resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==}
engines: {node: '>=18.0.0'}
···
uint8arrays@5.1.0:
resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==}
+
unconfig-core@7.4.0:
+
resolution: {integrity: sha512-3ew7rvES5x2LCZ/QRKV3nQQpq7eFYuszQuvZrhTHxDPKc34QFjRXI17XGiZI+WQTVIXKYeBti4v3LS39NWmhmg==}
+
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
unrun@0.2.6:
+
resolution: {integrity: sha512-ZLgMe3W+Zl3mjpnCbfW0JLlGQDa7U4mJKiBlValp5isZ9WeoAVaNyziCbr5Szo4abZ6WRE3OM1MjwpfFQrE5Aw==}
+
engines: {node: '>=20.19.0'}
+
hasBin: true
+
peerDependencies:
+
synckit: ^0.11.11
+
peerDependenciesMeta:
+
synckit:
+
optional: true
+
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
···
'@badrap/valita': 0.4.6
nanoid: 5.1.6
+
'@babel/generator@7.28.5':
+
dependencies:
+
'@babel/parser': 7.28.5
+
'@babel/types': 7.28.5
+
'@jridgewell/gen-mapping': 0.3.13
+
'@jridgewell/trace-mapping': 0.3.31
+
jsesc: 3.1.0
+
+
'@babel/helper-string-parser@7.27.1': {}
+
+
'@babel/helper-validator-identifier@7.28.5': {}
+
+
'@babel/parser@7.28.5':
+
dependencies:
+
'@babel/types': 7.28.5
+
+
'@babel/types@7.28.5':
+
dependencies:
+
'@babel/helper-string-parser': 7.27.1
+
'@babel/helper-validator-identifier': 7.28.5
+
'@badrap/valita@0.4.6': {}
'@drizzle-team/brocli@0.10.2': {}
+
'@emnapi/core@1.7.0':
+
dependencies:
+
'@emnapi/wasi-threads': 1.1.0
+
tslib: 2.8.1
+
optional: true
+
+
'@emnapi/runtime@1.7.0':
+
dependencies:
+
tslib: 2.8.1
+
optional: true
+
+
'@emnapi/wasi-threads@1.1.0':
+
dependencies:
+
tslib: 2.8.1
+
optional: true
+
'@esbuild-kit/core-utils@3.3.2':
dependencies:
esbuild: 0.18.20
···
'@humanwhocodes/retry@0.4.3': {}
+
'@jridgewell/gen-mapping@0.3.13':
+
dependencies:
+
'@jridgewell/sourcemap-codec': 1.5.5
+
'@jridgewell/trace-mapping': 0.3.31
+
+
'@jridgewell/resolve-uri@3.1.2': {}
+
+
'@jridgewell/sourcemap-codec@1.5.5': {}
+
+
'@jridgewell/trace-mapping@0.3.31':
+
dependencies:
+
'@jridgewell/resolve-uri': 3.1.2
+
'@jridgewell/sourcemap-codec': 1.5.5
+
'@libsql/client@0.15.15':
dependencies:
'@libsql/core': 0.15.15
···
'@libsql/win32-x64-msvc@0.5.22':
optional: true
+
'@napi-rs/wasm-runtime@1.0.7':
+
dependencies:
+
'@emnapi/core': 1.7.0
+
'@emnapi/runtime': 1.7.0
+
'@tybys/wasm-util': 0.10.1
+
optional: true
+
'@neon-rs/load@0.0.4': {}
'@noble/secp256k1@2.3.0': {}
···
'@nodelib/fs.scandir': 2.1.5
fastq: 1.19.1
+
'@oxc-project/runtime@0.96.0': {}
+
+
'@oxc-project/types@0.96.0': {}
+
'@pinojs/redact@0.4.0': {}
+
'@quansync/fs@0.1.5':
+
dependencies:
+
quansync: 0.2.11
+
+
'@rolldown/binding-android-arm64@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-darwin-arm64@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-darwin-x64@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-freebsd-x64@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-linux-arm64-gnu@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-linux-arm64-musl@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-linux-x64-gnu@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-linux-x64-musl@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-openharmony-arm64@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-wasm32-wasi@1.0.0-beta.47':
+
dependencies:
+
'@napi-rs/wasm-runtime': 1.0.7
+
optional: true
+
+
'@rolldown/binding-win32-arm64-msvc@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-win32-ia32-msvc@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/binding-win32-x64-msvc@1.0.0-beta.47':
+
optional: true
+
+
'@rolldown/pluginutils@1.0.0-beta.47': {}
+
'@standard-schema/spec@1.0.0': {}
+
'@tybys/wasm-util@0.10.1':
+
dependencies:
+
tslib: 2.8.1
+
optional: true
+
'@types/estree@1.0.8': {}
'@types/json-schema@7.0.15': {}
···
dependencies:
color-convert: 2.0.1
+
ansis@4.2.0: {}
+
argparse@2.0.1: {}
+
ast-kit@2.2.0:
+
dependencies:
+
'@babel/parser': 7.28.5
+
pathe: 2.0.3
+
atomic-sleep@1.0.0: {}
avvio@9.1.0:
···
balanced-match@1.0.2: {}
+
birpc@2.7.0: {}
+
brace-expansion@1.1.12:
dependencies:
balanced-match: 1.0.2
···
buffer-from@1.1.2: {}
+
cac@6.7.14: {}
+
callsites@3.1.0: {}
chalk@4.1.2:
···
ansi-styles: 4.3.0
supports-color: 7.2.0
+
chokidar@4.0.3:
+
dependencies:
+
readdirp: 4.1.2
+
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
···
detect-libc@2.0.2: {}
+
diff@8.0.2: {}
+
dotenv@17.2.3: {}
drizzle-kit@0.31.5:
···
drizzle-orm: 0.44.6(@libsql/client@0.15.15)
zod: 4.1.12
+
dts-resolver@2.1.2: {}
+
duplexify@4.1.3:
dependencies:
end-of-stream: 1.4.5
···
readable-stream: 3.6.2
stream-shift: 1.0.3
+
empathic@2.0.0: {}
+
end-of-stream@1.4.5:
dependencies:
once: 1.4.0
···
dependencies:
reusify: 1.1.0
+
fdir@6.5.0(picomatch@4.0.3):
+
optionalDependencies:
+
picomatch: 4.0.3
+
fetch-blob@3.2.0:
dependencies:
node-domexception: 1.0.0
···
dependencies:
resolve-pkg-maps: 1.0.0
+
get-tsconfig@4.13.0:
+
dependencies:
+
resolve-pkg-maps: 1.0.0
+
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
···
has-flag@4.0.0: {}
+
hookable@5.5.3: {}
+
ignore@5.3.2: {}
ignore@7.0.5: {}
···
dependencies:
argparse: 2.0.1
+
jsesc@3.1.0: {}
+
json-buffer@3.0.1: {}
json-schema-ref-resolver@3.0.0:
···
lodash.merge@4.6.2: {}
+
magic-string@0.30.21:
+
dependencies:
+
'@jridgewell/sourcemap-codec': 1.5.5
+
merge2@1.4.1: {}
micromatch@4.0.8:
···
path-key@3.1.1: {}
+
pathe@2.0.3: {}
+
picomatch@2.3.1: {}
+
picomatch@4.0.3: {}
+
pino-abstract-transport@2.0.0:
dependencies:
split2: 4.2.0
···
punycode@2.3.1: {}
+
quansync@0.2.11: {}
+
queue-microtask@1.2.3: {}
quick-format-unescaped@4.0.4: {}
···
string_decoder: 1.3.0
util-deprecate: 1.0.2
+
readdirp@4.1.2: {}
+
real-require@0.2.0: {}
require-from-string@2.0.2: {}
···
rfdc@1.4.1: {}
+
rolldown-plugin-dts@0.17.3(rolldown@1.0.0-beta.47)(typescript@5.9.3):
+
dependencies:
+
'@babel/generator': 7.28.5
+
'@babel/parser': 7.28.5
+
'@babel/types': 7.28.5
+
ast-kit: 2.2.0
+
birpc: 2.7.0
+
debug: 4.4.3
+
dts-resolver: 2.1.2
+
get-tsconfig: 4.13.0
+
magic-string: 0.30.21
+
rolldown: 1.0.0-beta.47
+
optionalDependencies:
+
typescript: 5.9.3
+
transitivePeerDependencies:
+
- oxc-resolver
+
- supports-color
+
+
rolldown@1.0.0-beta.47:
+
dependencies:
+
'@oxc-project/types': 0.96.0
+
'@rolldown/pluginutils': 1.0.0-beta.47
+
optionalDependencies:
+
'@rolldown/binding-android-arm64': 1.0.0-beta.47
+
'@rolldown/binding-darwin-arm64': 1.0.0-beta.47
+
'@rolldown/binding-darwin-x64': 1.0.0-beta.47
+
'@rolldown/binding-freebsd-x64': 1.0.0-beta.47
+
'@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.47
+
'@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.47
+
'@rolldown/binding-linux-arm64-musl': 1.0.0-beta.47
+
'@rolldown/binding-linux-x64-gnu': 1.0.0-beta.47
+
'@rolldown/binding-linux-x64-musl': 1.0.0-beta.47
+
'@rolldown/binding-openharmony-arm64': 1.0.0-beta.47
+
'@rolldown/binding-wasm32-wasi': 1.0.0-beta.47
+
'@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.47
+
'@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.47
+
'@rolldown/binding-win32-x64-msvc': 1.0.0-beta.47
+
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
···
dependencies:
real-require: 0.2.0
+
tinyexec@1.0.2: {}
+
+
tinyglobby@0.2.15:
+
dependencies:
+
fdir: 6.5.0(picomatch@4.0.3)
+
picomatch: 4.0.3
+
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
toad-cache@3.7.0: {}
+
tree-kill@1.2.2: {}
+
ts-api-utils@2.1.0(typescript@5.9.3):
dependencies:
typescript: 5.9.3
+
tsdown@0.16.1(typescript@5.9.3):
+
dependencies:
+
ansis: 4.2.0
+
cac: 6.7.14
+
chokidar: 4.0.3
+
debug: 4.4.3
+
diff: 8.0.2
+
empathic: 2.0.0
+
hookable: 5.5.3
+
rolldown: 1.0.0-beta.47
+
rolldown-plugin-dts: 0.17.3(rolldown@1.0.0-beta.47)(typescript@5.9.3)
+
semver: 7.7.3
+
tinyexec: 1.0.2
+
tinyglobby: 0.2.15
+
tree-kill: 1.2.2
+
unconfig-core: 7.4.0
+
unrun: 0.2.6
+
optionalDependencies:
+
typescript: 5.9.3
+
transitivePeerDependencies:
+
- '@ts-macro/tsc'
+
- '@typescript/native-preview'
+
- oxc-resolver
+
- supports-color
+
- synckit
+
- vue-tsc
+
+
tslib@2.8.1:
+
optional: true
+
tsx@4.20.6:
dependencies:
esbuild: 0.25.11
···
dependencies:
multiformats: 13.4.1
+
unconfig-core@7.4.0:
+
dependencies:
+
'@quansync/fs': 0.1.5
+
quansync: 0.2.11
+
undici-types@7.16.0: {}
+
unrun@0.2.6:
+
dependencies:
+
'@oxc-project/runtime': 0.96.0
+
rolldown: 1.0.0-beta.47
+
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
+1
.gitignore
···
/node_modules
/dist
.env
+
.docker.env
*.tsbuildinfo
+2
shell.nix
···
pnpm,
typescript,
typescript-language-server,
+
docker,
callPackage,
}:
···
pnpm
typescript
typescript-language-server
+
docker
];
shellHook = ''
+1 -1
package.json
···
"build": "tsdown src/index.ts",
"docker:pre-build": "sed \"s/[\\\"']//g\" .env > .docker.env",
"docker:build": "pnpm docker:pre-build && docker build -t gmstn-systems-shard .",
-
"docker:run": "source $(eval pwd)/.docker.env && echo $SERVER_PORT && docker run -p $SERVER_PORT:$SERVER_PORT --env-file .docker.env gmstn-systems-shard",
+
"docker:run": "source $(eval pwd)/.docker.env && echo $SERVER_PORT && docker run --network=host -p $SERVER_PORT:$SERVER_PORT --env-file .docker.env gmstn-systems-shard",
"start": "pnpm build && node dist/index.mjs"
},
"keywords": [],
+47
.github/workflows/push-image.yaml
···
+
name: Build and Push Docker Image
+
+
on:
+
push:
+
tags:
+
- "v*"
+
+
env:
+
REGISTRY: ghcr.io
+
IMAGE_NAME: ${{ github.repository }}
+
+
jobs:
+
build-and-push:
+
runs-on: ubuntu-latest
+
permissions:
+
contents: read
+
packages: write
+
+
steps:
+
- name: Checkout repository
+
uses: actions/checkout@v4
+
+
- name: Log in to GitHub Container Registry
+
uses: docker/login-action@v3
+
with:
+
registry: ${{ env.REGISTRY }}
+
username: ${{ github.actor }}
+
password: ${{ secrets.GITHUB_TOKEN }}
+
+
- name: Extract metadata (tags, labels)
+
id: meta
+
uses: docker/metadata-action@v5
+
with:
+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+
tags: |
+
type=semver,pattern={{version}}
+
type=semver,pattern={{major}}.{{minor}}
+
type=semver,pattern={{major}}
+
type=raw,value=latest
+
+
- name: Build and push Docker image
+
uses: docker/build-push-action@v5
+
with:
+
context: .
+
push: true
+
tags: ${{ steps.meta.outputs.tags }}
+
labels: ${{ steps.meta.outputs.labels }}
+1 -1
src/lib/handlers/handshake.ts
···
// FIXME: this also assumes that the requesting lattice's DID is a did:web
// see above for the rest of the issues.
-
if (routeThroughUri.rKey === requestingLatticeDid.slice(8)) {
+
if (routeThroughUri.rKey !== requestingLatticeDid.slice(8)) {
mismatchReason = `route through record domain did not match with requesting service. the requesting service's domain is ${requestingLatticeDid.slice(8)}, the domain on the record is ${routeThroughUri.rKey ?? ""}.`;
mismatchOrIncorrect = true;
return;
+1 -1
src/lib/utils/gmstn.ts
···
.select()
.from(messagesTable)
.where(eq(messagesTable.channelAtUri, channelAtUriString))
-
.limit(100);
+
.limit(100000);
return { ok: true, data: messages };
};