decentralised sync engine

Compare changes

Choose any two refs to compare.

Changed files
+650 -5
src
lib
routes
xrpc
_health
systems.gmstn.development.lattice.getOwner
+54
src/lib/listeners/shard-history.ts
···
···
+
import { clientSessions } from "@/lib/sessions";
+
import { historyMessageSchema } from "@/lib/types/messages";
+
import {
+
rawDataToString,
+
validateWsMessageType,
+
} from "@/lib/utils/ws/validate";
+
import type WebSocket from "ws";
+
import { z } from "zod";
+
+
export const attachHistoryFromShardListener = (socket: WebSocket) => {
+
socket.on("message", (rawData) => {
+
const event = rawDataToString(rawData);
+
+
const data: unknown = JSON.parse(event);
+
const validateTypeResult = validateWsMessageType(data);
+
if (!validateTypeResult.ok) return;
+
+
console.log("received", validateTypeResult.data, "from shard")
+
+
const { type: messageType } = validateTypeResult.data;
+
if (messageType !== "shard/history") return;
+
const {
+
success,
+
error,
+
data: historyMessage,
+
} = historyMessageSchema.safeParse(validateTypeResult.data);
+
if (!success) {
+
console.error(
+
"could not parse",
+
validateTypeResult.data,
+
"as a valid history message.",
+
);
+
console.error(z.treeifyError(error));
+
return;
+
}
+
const { forClient: intendedRecipient } = historyMessage;
+
const clientSessionInfo = clientSessions
+
.keys()
+
.find((sessionInfo) => sessionInfo.clientDid === intendedRecipient);
+
if (!clientSessionInfo) {
+
console.error("Could not client session info in sessions map.");
+
return;
+
}
+
const clientSocket = clientSessions.get(clientSessionInfo);
+
if (!clientSocket) {
+
console.error(
+
"Could find session info in map but somehow couldn't find socket? This should not happen.",
+
);
+
return;
+
}
+
clientSocket.send(JSON.stringify(historyMessage));
+
console.log("sent off", historyMessage, "to client")
+
});
+
};
+2
src/lib/types/messages.ts
···
type: z.literal("shard/history"),
messages: z.optional(z.array(shardMessageSchema)),
channel: z.string(),
})
.strict();
export type HistoryMessage = z.infer<typeof historyMessageSchema>;
···
.safeExtend({
type: z.literal("shard/requestHistory"),
channel: z.string(),
})
.strict();
export type RequestHistoryMessage = z.infer<typeof requestHistoryMessageSchema>;
···
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 });
+
};
+8
src/lib/types/http/responses.ts
···
import {
latticeSessionInfoSchema,
shardSessionInfoSchema,
···
typeof shardHandshakeResponseSchema
>;
export const httpResponseDataSchema = z.union([
latticeHandshakeResponseSchema,
shardHandshakeResponseSchema,
]);
export type HttpResponseData = z.infer<typeof httpResponseDataSchema>;
···
+
import { didSchema } from "@/lib/types/atproto";
import {
latticeSessionInfoSchema,
shardSessionInfoSchema,
···
typeof shardHandshakeResponseSchema
>;
+
export const getOwnerDidResponseSchema = z.object({
+
registered: z.boolean(),
+
ownerDid: didSchema,
+
});
+
export type GetOwnerDidResponse = z.infer<typeof getOwnerDidResponseSchema>;
+
export const httpResponseDataSchema = z.union([
latticeHandshakeResponseSchema,
shardHandshakeResponseSchema,
+
getOwnerDidResponseSchema,
]);
export type HttpResponseData = z.infer<typeof httpResponseDataSchema>;
+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";
export const routes: Record<string, Route | WsRoute> = {
"/": indexRoute,
"/.well-known/did.json": didWebDocRoute,
"/handshake": handshakeRoute,
"/connect": connectRoute,
};
···
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.lattice.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.lattice.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 lattice is running at 0.0.1", {
+
headers: { "content-type": "text/plain; charset=utf-8" },
+
});
+
},
+
};
+7
src/routes/xrpc/systems.gmstn.development.lattice.getOwner/route.ts
···
···
+
import { getOwnerHandler } from "@/lib/handlers/getOwnerDid";
+
import type { Route } from "@/lib/types/routes";
+
+
export const systemsGmstnDevelopmentShardGetOwnerRoute: Route = {
+
method: "GET",
+
handler: getOwnerHandler,
+
};
+540
pnpm-lock.yaml
···
prettier:
specifier: ^3.6.2
version: 3.6.2
typescript:
specifier: ^5.9.3
version: 5.9.3
···
'@atcute/xrpc-server@0.1.2':
resolution: {integrity: sha512-smBmWGEM6nBTq2ozONXBCJtvFzTEnJgH6cALGfq26k38k/OmX6mpMvr5/Z0Iuc6+rNG2j3YY/kOSl+z3c8JOVg==}
'@badrap/valita@0.4.6':
resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==}
engines: {node: '>= 18'}
'@esbuild/aix-ppc64@0.25.11':
resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
engines: {node: '>=18'}
···
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
'@noble/secp256k1@2.3.0':
resolution: {integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==}
···
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
'@pinojs/redact@0.4.0':
resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==}
'@standard-schema/spec@1.0.0':
resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==}
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
···
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
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==}
brace-expansion@1.1.12:
resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
···
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
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'}
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
···
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
dotenv@17.2.3:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
duplexify@4.1.3:
resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==}
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==}
file-entry-cache@8.0.0:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
···
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
···
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
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==}
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
···
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
pino-abstract-transport@2.0.0:
resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==}
···
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
···
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
real-require@0.2.0:
resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
engines: {node: '>= 12.13.0'}
···
rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
···
thread-stream@3.1.0:
resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==}
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'}
ts-api-utils@2.1.0:
resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
engines: {node: '>=18.12'}
peerDependencies:
typescript: '>=4.8.4'
tsx@4.20.6:
resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==}
engines: {node: '>=18.0.0'}
···
uint8arrays@5.1.0:
resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==}
undici-types@7.14.0:
resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==}
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
···
'@badrap/valita': 0.4.6
nanoid: 5.1.6
'@badrap/valita@0.4.6': {}
'@esbuild/aix-ppc64@0.25.11':
optional: true
···
'@humanwhocodes/retry@0.4.3': {}
'@noble/secp256k1@2.3.0': {}
'@nodelib/fs.scandir@2.1.5':
···
'@nodelib/fs.scandir': 2.1.5
fastq: 1.19.1
'@pinojs/redact@0.4.0': {}
'@standard-schema/spec@1.0.0': {}
'@types/estree@1.0.8': {}
'@types/json-schema@7.0.15': {}
···
dependencies:
color-convert: 2.0.1
argparse@2.0.1: {}
atomic-sleep@1.0.0: {}
avvio@9.1.0:
···
balanced-match@1.0.2: {}
brace-expansion@1.1.12:
dependencies:
balanced-match: 1.0.2
···
dependencies:
fill-range: 7.1.1
callsites@3.1.0: {}
chalk@4.1.2:
···
ansi-styles: 4.3.0
supports-color: 7.2.0
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
···
dequal@2.0.3: {}
dotenv@17.2.3: {}
duplexify@4.1.3:
dependencies:
end-of-stream: 1.4.5
···
readable-stream: 3.6.2
stream-shift: 1.0.3
end-of-stream@1.4.5:
dependencies:
once: 1.4.0
···
dependencies:
reusify: 1.1.0
file-entry-cache@8.0.0:
dependencies:
flat-cache: 4.0.1
···
has-flag@4.0.0: {}
ignore@5.3.2: {}
ignore@7.0.5: {}
···
dependencies:
argparse: 2.0.1
json-buffer@3.0.1: {}
json-schema-ref-resolver@3.0.0:
···
lodash.merge@4.6.2: {}
merge2@1.4.1: {}
micromatch@4.0.8:
···
path-key@3.1.1: {}
picomatch@2.3.1: {}
pino-abstract-transport@2.0.0:
dependencies:
split2: 4.2.0
···
punycode@2.3.1: {}
queue-microtask@1.2.3: {}
quick-format-unescaped@4.0.4: {}
···
string_decoder: 1.3.0
util-deprecate: 1.0.2
real-require@0.2.0: {}
require-from-string@2.0.2: {}
···
rfdc@1.4.1: {}
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
···
dependencies:
real-require: 0.2.0
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
toad-cache@3.7.0: {}
ts-api-utils@2.1.0(typescript@5.9.3):
dependencies:
typescript: 5.9.3
tsx@4.20.6:
dependencies:
esbuild: 0.25.11
···
dependencies:
multiformats: 13.4.1
undici-types@7.14.0: {}
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
···
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'}
+
'@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/aix-ppc64@0.25.11':
resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
engines: {node: '>=18'}
···
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==}
+
+
'@napi-rs/wasm-runtime@1.0.7':
+
resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==}
+
'@noble/secp256k1@2.3.0':
resolution: {integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==}
···
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==}
···
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
+
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-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
+
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'}
+
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
+
file-entry-cache@8.0.0:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
···
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.14.0:
resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==}
+
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': {}
+
'@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/aix-ppc64@0.25.11':
optional: true
···
'@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
+
+
'@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
+
'@noble/secp256k1@2.3.0': {}
'@nodelib/fs.scandir@2.1.5':
···
'@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
···
dependencies:
fill-range: 7.1.1
+
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
···
dequal@2.0.3: {}
+
diff@8.0.2: {}
+
dotenv@17.2.3: {}
+
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
+
file-entry-cache@8.0.0:
dependencies:
flat-cache: 4.0.1
···
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.14.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
*.tsbuildinfo
···
/node_modules
/dist
.env
+
.docker.env
*.tsbuildinfo
+3
package.json
···
"dev": "tsx src/index.ts",
"lint": "eslint src/",
"build": "tsdown src/index.ts",
"start": "pnpm build && node dist/index.mjs"
},
"keywords": [],
···
"dev": "tsx src/index.ts",
"lint": "eslint src/",
"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-lattice .",
+
"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-lattice",
"start": "pnpm build && node dist/index.mjs"
},
"keywords": [],
+1 -1
src/index.ts
···
}
}
-
server.listen({ port: SERVER_PORT }).catch((err: unknown) => {
server.log.error(err);
process.exit(1);
});
···
}
}
+
server.listen({ port: SERVER_PORT, host: "::" }).catch((err: unknown) => {
server.log.error(err);
process.exit(1);
});
+4 -1
src/lib/utils/handshake.ts
···
error: httpResponseParseError,
data: handshakeResponseDataParsed,
} = httpSuccessResponseSchema.safeParse(handshakeResponseData);
-
if (!httpResponseParseSuccess)
return {
ok: false,
error: z.treeifyError(httpResponseParseError),
};
const { data: handshakeData } = handshakeResponseDataParsed;
···
error: httpResponseParseError,
data: handshakeResponseDataParsed,
} = httpSuccessResponseSchema.safeParse(handshakeResponseData);
+
if (!httpResponseParseSuccess) {
+
console.error("Parsing response failed.", httpResponseParseError);
+
console.error("Incoming data:", JSON.stringify(handshakeResponseData));
return {
ok: false,
error: z.treeifyError(httpResponseParseError),
};
+
}
const { data: handshakeData } = handshakeResponseDataParsed;
+1 -1
src/lib/env.ts
···
"Environment variable SERVICE_DID not set. Defaulting to `did:web:localhost`",
);
}
-
export const SERVICE_DID = serviceDidParsed ?? "did:web:localhost";
const constellationUrl = process.env.CONSTELLATION_URL;
let constellationUrlParsed: URL | undefined;
···
"Environment variable SERVICE_DID not set. Defaulting to `did:web:localhost`",
);
}
+
export const SERVICE_DID = serviceDidParsed ?? `did:web:localhost%3A${SERVER_PORT.toString()}`;
const constellationUrl = process.env.CONSTELLATION_URL;
let constellationUrlParsed: URL | undefined;
+5 -2
src/lib/handlers/latticeHandshake.ts
···
-
import { SERVICE_DID } from "@/lib/env";
import { issueNewLatticeToken } from "@/lib/sessions";
import { shardSessions } from "@/lib/state";
import { HttpGeneralErrorType } from "@/lib/types/http/errors";
···
// FIXME: this also assumes that the requesting lattice's DID is a did:web
// see below for the rest of the issues.
-
if (routeThroughUri.rKey !== SERVICE_DID.slice(8)) {
errors.push(
"Mismatch between claimant lattice and channel routeThrough. Request wants to validate for",
routeThroughUri.rKey,
···
+
import { SERVER_PORT, SERVICE_DID } from "@/lib/env";
import { issueNewLatticeToken } from "@/lib/sessions";
import { shardSessions } from "@/lib/state";
import { HttpGeneralErrorType } from "@/lib/types/http/errors";
···
// FIXME: this also assumes that the requesting lattice's DID is a did:web
// see below for the rest of the issues.
+
let thisLatticeDomain = SERVICE_DID.slice(8);
+
if (thisLatticeDomain === "localhost")
+
thisLatticeDomain = `localhost:${SERVER_PORT.toString()}`;
+
if (routeThroughUri.rKey !== thisLatticeDomain) {
errors.push(
"Mismatch between claimant lattice and channel routeThrough. Request wants to validate for",
routeThroughUri.rKey,