@typeberry/lib 0.5.6 → 0.5.7-82a84ca
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/bin/lib/scripts/build-lib.js +1 -1
- package/package.json +7 -3
- package/packages/core/networking/metrics.js +2 -2
- package/packages/core/telemetry/index.d.ts.map +1 -1
- package/packages/core/telemetry/index.js +2 -3
- package/packages/core/utils/index.d.ts +1 -0
- package/packages/core/utils/index.d.ts.map +1 -1
- package/packages/core/utils/index.js +1 -0
- package/packages/core/utils/package.d.ts +3 -0
- package/packages/core/utils/package.d.ts.map +1 -0
- package/packages/core/utils/package.js +4 -0
- package/packages/jam/jamnp-s/network.d.ts +2 -0
- package/packages/jam/jamnp-s/network.d.ts.map +1 -1
- package/packages/jam/jamnp-s/network.js +4 -0
- package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts +4 -0
- package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.js +4 -0
- package/packages/jam/jamnp-s/tasks/ticket-distribution.d.ts +33 -0
- package/packages/jam/jamnp-s/tasks/ticket-distribution.d.ts.map +1 -0
- package/packages/jam/jamnp-s/tasks/ticket-distribution.js +115 -0
- package/packages/jam/jamnp-s/tasks/ticket-distribution.test.d.ts +2 -0
- package/packages/jam/jamnp-s/tasks/ticket-distribution.test.d.ts.map +1 -0
- package/packages/jam/jamnp-s/tasks/ticket-distribution.test.js +219 -0
- package/packages/jam/node/main-fuzz.d.ts.map +1 -1
- package/packages/jam/node/main-fuzz.js +2 -3
- package/packages/jam/node/main-fuzz.test.js +2 -4
- package/packages/jam/node/main-importer.d.ts.map +1 -1
- package/packages/jam/node/main-importer.js +2 -3
- package/packages/jam/node/main.d.ts.map +1 -1
- package/packages/jam/node/main.js +58 -29
- package/packages/jam/node/metrics.js +2 -2
- package/packages/jam/node/workers.d.ts +10 -3
- package/packages/jam/node/workers.d.ts.map +1 -1
- package/packages/jam/node/workers.js +16 -7
- package/packages/workers/api-node/config.d.ts +5 -1
- package/packages/workers/api-node/config.d.ts.map +1 -1
- package/packages/workers/api-node/config.js +9 -3
- package/packages/workers/api-node/port.d.ts +8 -0
- package/packages/workers/api-node/port.d.ts.map +1 -1
- package/packages/workers/api-node/port.js +10 -0
- package/packages/workers/block-authorship/bootstrap-main.js +10 -3
- package/packages/workers/block-authorship/main.d.ts +2 -1
- package/packages/workers/block-authorship/main.d.ts.map +1 -1
- package/packages/workers/block-authorship/main.js +4 -3
- package/packages/workers/block-authorship/metrics.js +2 -2
- package/packages/workers/comms-authorship-network/index.d.ts +3 -0
- package/packages/workers/comms-authorship-network/index.d.ts.map +1 -0
- package/packages/workers/comms-authorship-network/index.js +2 -0
- package/packages/workers/comms-authorship-network/protocol.d.ts +27 -0
- package/packages/workers/comms-authorship-network/protocol.d.ts.map +1 -0
- package/packages/workers/comms-authorship-network/protocol.js +24 -0
- package/packages/workers/comms-authorship-network/tickets-message.d.ts +18 -0
- package/packages/workers/comms-authorship-network/tickets-message.d.ts.map +1 -0
- package/packages/workers/comms-authorship-network/tickets-message.js +19 -0
- package/packages/workers/importer/metrics.js +2 -2
- package/packages/workers/jam-network/bootstrap-main.js +10 -3
- package/packages/workers/jam-network/main.d.ts +2 -1
- package/packages/workers/jam-network/main.d.ts.map +1 -1
- package/packages/workers/jam-network/main.js +8 -1
- package/packages/core/networking/package.json +0 -26
- package/packages/core/telemetry/package.json +0 -19
- package/packages/jam/node/package.json +0 -39
- package/packages/workers/block-authorship/package.json +0 -33
- package/packages/workers/importer/package.json +0 -33
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { codec } from "#@typeberry/codec";
|
|
2
|
+
import { createProtocol } from "#@typeberry/workers-api";
|
|
3
|
+
import { TicketsMessage } from "./tickets-message.js";
|
|
4
|
+
/**
|
|
5
|
+
* Port name for authorship-network direct communication.
|
|
6
|
+
* Used when spawning jam-network worker to pass the port for receiving tickets.
|
|
7
|
+
*/
|
|
8
|
+
export const AUTHORSHIP_NETWORK_PORT = "authorship-network";
|
|
9
|
+
/**
|
|
10
|
+
* Protocol for direct communication between block-authorship and jam-network workers.
|
|
11
|
+
*
|
|
12
|
+
* This bypasses the main thread for ticket distribution, reducing latency.
|
|
13
|
+
*/
|
|
14
|
+
export const protocol = createProtocol("authorship-network", {
|
|
15
|
+
// Messages from block-authorship to jam-network
|
|
16
|
+
toWorker: {
|
|
17
|
+
tickets: {
|
|
18
|
+
request: TicketsMessage.Codec,
|
|
19
|
+
response: codec.nothing,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
// Messages from jam-network to block-authorship (none for now)
|
|
23
|
+
fromWorker: {},
|
|
24
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Epoch } from "#@typeberry/block";
|
|
2
|
+
import { SignedTicket } from "#@typeberry/block/tickets.js";
|
|
3
|
+
import { type CodecRecord } from "#@typeberry/codec";
|
|
4
|
+
import { WithDebug } from "#@typeberry/utils";
|
|
5
|
+
export declare class TicketsMessage extends WithDebug {
|
|
6
|
+
readonly epochIndex: Epoch;
|
|
7
|
+
readonly tickets: SignedTicket[];
|
|
8
|
+
static Codec: import("@typeberry/codec").Descriptor<TicketsMessage, import("@typeberry/codec").ViewOf<TicketsMessage, {
|
|
9
|
+
epochIndex: import("@typeberry/codec").Descriptor<number & import("@typeberry/numbers").WithBytesRepresentation<4> & import("@typeberry/utils").WithOpaque<"Epoch">, import("@typeberry/bytes").Bytes<4>>;
|
|
10
|
+
tickets: import("@typeberry/codec").Descriptor<SignedTicket[], import("@typeberry/codec").SequenceView<SignedTicket, import("@typeberry/codec").ViewOf<SignedTicket, {
|
|
11
|
+
attempt: import("@typeberry/codec").Descriptor<number & import("@typeberry/numbers").WithBytesRepresentation<1> & import("@typeberry/utils").WithOpaque<"TicketAttempt[0|1|2]">, import("@typeberry/numbers").U8>;
|
|
12
|
+
signature: import("@typeberry/codec").Descriptor<import("@typeberry/bytes").Bytes<784> & import("@typeberry/utils").WithOpaque<"BandersnatchRingSignature">, import("@typeberry/bytes").Bytes<784>>;
|
|
13
|
+
}>>>;
|
|
14
|
+
}>>;
|
|
15
|
+
static create({ epochIndex, tickets }: CodecRecord<TicketsMessage>): TicketsMessage;
|
|
16
|
+
private constructor();
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=tickets-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets-message.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/comms-authorship-network/tickets-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,KAAK,WAAW,EAAS,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,cAAe,SAAQ,SAAS;aAWzB,UAAU,EAAE,KAAK;aACjB,OAAO,EAAE,YAAY,EAAE;IAXzC,MAAM,CAAC,KAAK;;;;;;QAGT;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,WAAW,CAAC,cAAc,CAAC;IAIlE,OAAO;CAMR"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SignedTicket } from "#@typeberry/block/tickets.js";
|
|
2
|
+
import { codec } from "#@typeberry/codec";
|
|
3
|
+
import { WithDebug } from "#@typeberry/utils";
|
|
4
|
+
export class TicketsMessage extends WithDebug {
|
|
5
|
+
epochIndex;
|
|
6
|
+
tickets;
|
|
7
|
+
static Codec = codec.Class(TicketsMessage, {
|
|
8
|
+
epochIndex: codec.u32.asOpaque(),
|
|
9
|
+
tickets: codec.sequenceVarLen(SignedTicket.Codec),
|
|
10
|
+
});
|
|
11
|
+
static create({ epochIndex, tickets }) {
|
|
12
|
+
return new TicketsMessage(epochIndex, tickets);
|
|
13
|
+
}
|
|
14
|
+
constructor(epochIndex, tickets) {
|
|
15
|
+
super();
|
|
16
|
+
this.epochIndex = epochIndex;
|
|
17
|
+
this.tickets = tickets;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { metrics } from "@opentelemetry/api";
|
|
2
|
-
import
|
|
2
|
+
import { version } from "#@typeberry/utils";
|
|
3
3
|
/**
|
|
4
4
|
* Block importer metrics for JAM implementation.
|
|
5
5
|
*
|
|
6
6
|
* https://github.com/polkadot-fellows/JIPs/blob/main/JIP-3.md#block-authoringimporting-events
|
|
7
7
|
*/
|
|
8
8
|
export function createMetrics() {
|
|
9
|
-
const meter = metrics.getMeter(
|
|
9
|
+
const meter = metrics.getMeter("@typeberry/importer", version);
|
|
10
10
|
const blockVerificationDuration = meter.createHistogram("jam.blockVerificationTime", {
|
|
11
11
|
description: "Duration of block verification",
|
|
12
12
|
unit: "ms",
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
+
import { AUTHORSHIP_NETWORK_PORT, protocol as authorshipProtocol } from "#@typeberry/comms-authorship-network";
|
|
1
2
|
import { Telemetry } from "#@typeberry/telemetry";
|
|
3
|
+
import { Channel } from "#@typeberry/workers-api";
|
|
2
4
|
import { initWorker } from "#@typeberry/workers-api-node";
|
|
3
5
|
import { main } from "./main.js";
|
|
4
|
-
import {
|
|
5
|
-
const { config, comms } = await initWorker(
|
|
6
|
+
import { protocol as mainProtocol, NetworkingConfig } from "./protocol.js";
|
|
7
|
+
const { config, comms } = await initWorker(mainProtocol, NetworkingConfig.Codec);
|
|
6
8
|
// Initialize OpenTelemetry for this worker
|
|
7
9
|
const tele = Telemetry.initialize({
|
|
8
10
|
nodeName: config.nodeName,
|
|
9
11
|
worker: "network",
|
|
10
12
|
});
|
|
11
|
-
|
|
13
|
+
const port = config.ports.get(AUTHORSHIP_NETWORK_PORT);
|
|
14
|
+
if (port === undefined) {
|
|
15
|
+
throw new Error("Authorship network port not found in config");
|
|
16
|
+
}
|
|
17
|
+
const networkingComms = Channel.rx(authorshipProtocol, port);
|
|
18
|
+
await main(config, comms, networkingComms);
|
|
12
19
|
await tele?.close();
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AuthorshipComms } from "#@typeberry/comms-authorship-network";
|
|
1
2
|
import type { WorkerConfig } from "#@typeberry/workers-api";
|
|
2
3
|
import type { NetworkingConfig, NetworkingInternal } from "./protocol.js";
|
|
3
4
|
/**
|
|
@@ -7,5 +8,5 @@ import type { NetworkingConfig, NetworkingInternal } from "./protocol.js";
|
|
|
7
8
|
* (using `typeberry/networking` package) and adding relevant JAMNP-s
|
|
8
9
|
* stream handlers.
|
|
9
10
|
*/
|
|
10
|
-
export declare function main(config: WorkerConfig<NetworkingConfig>, comms: NetworkingInternal): Promise<void>;
|
|
11
|
+
export declare function main(config: WorkerConfig<NetworkingConfig>, comms: NetworkingInternal, authorshipComms: AuthorshipComms): Promise<void>;
|
|
11
12
|
//# sourceMappingURL=main.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/jam-network/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/jam-network/main.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAK3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAI1E;;;;;;GAMG;AACH,wBAAsB,IAAI,CACxB,MAAM,EAAE,YAAY,CAAC,gBAAgB,CAAC,EACtC,KAAK,EAAE,kBAAkB,EACzB,eAAe,EAAE,eAAe,iBAmDjC"}
|
|
@@ -10,7 +10,7 @@ const logger = Logger.new(import.meta.filename, "net");
|
|
|
10
10
|
* (using `typeberry/networking` package) and adding relevant JAMNP-s
|
|
11
11
|
* stream handlers.
|
|
12
12
|
*/
|
|
13
|
-
export async function main(config, comms) {
|
|
13
|
+
export async function main(config, comms, authorshipComms) {
|
|
14
14
|
await initWasm();
|
|
15
15
|
logger.trace `🛜 Network starting`;
|
|
16
16
|
// Await the configuration object
|
|
@@ -31,6 +31,13 @@ export async function main(config, comms) {
|
|
|
31
31
|
comms.setOnNewHeader(async (header) => {
|
|
32
32
|
network.syncTask.broadcastHeader(header);
|
|
33
33
|
});
|
|
34
|
+
// Handle tickets received directly from block-authorship (bypasses main thread)
|
|
35
|
+
authorshipComms.setOnTickets(async ({ epochIndex, tickets }) => {
|
|
36
|
+
logger.log `Received ${tickets.length} tickets directly from block-authorship for epoch ${epochIndex}`;
|
|
37
|
+
for (const ticket of tickets) {
|
|
38
|
+
network.ticketTask.addTicket(epochIndex, ticket);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
34
41
|
await network.network.start();
|
|
35
42
|
// stop the network when the worker is finishing.
|
|
36
43
|
await waitForFinish;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@typeberry/networking",
|
|
3
|
-
"version": "0.5.6",
|
|
4
|
-
"description": "QUIC-based p2p networking.",
|
|
5
|
-
"license": "MPL-2.0",
|
|
6
|
-
"author": "Fluffy Labs",
|
|
7
|
-
"bin": "./bin/test.ts",
|
|
8
|
-
"main": "index.ts",
|
|
9
|
-
"type": "module",
|
|
10
|
-
"scripts": {
|
|
11
|
-
"start": "tsx ./bin/test.ts",
|
|
12
|
-
"test": "tsx --test $(find . -type f -name '*.test.ts' | tr '\\n' ' ')"
|
|
13
|
-
},
|
|
14
|
-
"dependencies": {
|
|
15
|
-
"@matrixai/quic": "2.0.9",
|
|
16
|
-
"@opentelemetry/api": "1.9.0",
|
|
17
|
-
"@peculiar/webcrypto": "1.5.0",
|
|
18
|
-
"@peculiar/x509": "1.12.3",
|
|
19
|
-
"@typeberry/bytes": "*",
|
|
20
|
-
"@typeberry/config": "*",
|
|
21
|
-
"@typeberry/crypto": "*",
|
|
22
|
-
"@typeberry/logger": "*",
|
|
23
|
-
"@typeberry/numbers": "*",
|
|
24
|
-
"@typeberry/utils": "*"
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@typeberry/telemetry",
|
|
3
|
-
"version": "0.5.6",
|
|
4
|
-
"description": "OpenTelemetry initialization utilities for Typeberry",
|
|
5
|
-
"license": "MPL-2.0",
|
|
6
|
-
"author": "Fluffy Labs",
|
|
7
|
-
"main": "index.ts",
|
|
8
|
-
"type": "module",
|
|
9
|
-
"dependencies": {
|
|
10
|
-
"@opentelemetry/auto-instrumentations-node": "^0.67.0",
|
|
11
|
-
"@opentelemetry/exporter-metrics-otlp-http": "^0.208.0",
|
|
12
|
-
"@opentelemetry/resources": "^2.2.0",
|
|
13
|
-
"@opentelemetry/sdk-metrics": "^2.2.0",
|
|
14
|
-
"@opentelemetry/sdk-node": "^0.208.0",
|
|
15
|
-
"@opentelemetry/semantic-conventions": "^1.38.0",
|
|
16
|
-
"@typeberry/logger": "*",
|
|
17
|
-
"@typeberry/utils": "*"
|
|
18
|
-
}
|
|
19
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@typeberry/node",
|
|
3
|
-
"version": "0.5.6",
|
|
4
|
-
"description": "The main typeberry node.",
|
|
5
|
-
"main": "index.ts",
|
|
6
|
-
"dependencies": {
|
|
7
|
-
"@opentelemetry/api": "1.9.0",
|
|
8
|
-
"@typeberry/block": "*",
|
|
9
|
-
"@typeberry/block-authorship": "*",
|
|
10
|
-
"@typeberry/block-json": "*",
|
|
11
|
-
"@typeberry/bytes": "*",
|
|
12
|
-
"@typeberry/codec": "*",
|
|
13
|
-
"@typeberry/collections": "*",
|
|
14
|
-
"@typeberry/config": "*",
|
|
15
|
-
"@typeberry/config-node": "*",
|
|
16
|
-
"@typeberry/configs": "*",
|
|
17
|
-
"@typeberry/crypto": "*",
|
|
18
|
-
"@typeberry/ext-ipc": "*",
|
|
19
|
-
"@typeberry/fuzz-proto": "*",
|
|
20
|
-
"@typeberry/hash": "*",
|
|
21
|
-
"@typeberry/importer": "*",
|
|
22
|
-
"@typeberry/jam-network": "*",
|
|
23
|
-
"@typeberry/json-parser": "*",
|
|
24
|
-
"@typeberry/listener": "*",
|
|
25
|
-
"@typeberry/logger": "*",
|
|
26
|
-
"@typeberry/numbers": "*",
|
|
27
|
-
"@typeberry/state-json": "*",
|
|
28
|
-
"@typeberry/state-merkleization": "*",
|
|
29
|
-
"@typeberry/utils": "*",
|
|
30
|
-
"@typeberry/workers-api": "*",
|
|
31
|
-
"@typeberry/workers-api-node": "*"
|
|
32
|
-
},
|
|
33
|
-
"scripts": {
|
|
34
|
-
"test": "tsx --test $(find . -type f -name '*.test.ts' | tr '\\n' ' ')"
|
|
35
|
-
},
|
|
36
|
-
"author": "Fluffy Labs",
|
|
37
|
-
"license": "MPL-2.0",
|
|
38
|
-
"type": "module"
|
|
39
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@typeberry/block-authorship",
|
|
3
|
-
"version": "0.5.6",
|
|
4
|
-
"description": "A test block generator simulating blocks received over the network.",
|
|
5
|
-
"main": "index.ts",
|
|
6
|
-
"dependencies": {
|
|
7
|
-
"@opentelemetry/api": "^1.9.0",
|
|
8
|
-
"@typeberry/block": "*",
|
|
9
|
-
"@typeberry/bytes": "*",
|
|
10
|
-
"@typeberry/codec": "*",
|
|
11
|
-
"@typeberry/collections": "*",
|
|
12
|
-
"@typeberry/config": "*",
|
|
13
|
-
"@typeberry/crypto": "*",
|
|
14
|
-
"@typeberry/database": "*",
|
|
15
|
-
"@typeberry/hash": "*",
|
|
16
|
-
"@typeberry/logger": "*",
|
|
17
|
-
"@typeberry/numbers": "*",
|
|
18
|
-
"@typeberry/safrole": "*",
|
|
19
|
-
"@typeberry/state": "*",
|
|
20
|
-
"@typeberry/state-merkleization": "*",
|
|
21
|
-
"@typeberry/telemetry": "*",
|
|
22
|
-
"@typeberry/transition": "*",
|
|
23
|
-
"@typeberry/utils": "*",
|
|
24
|
-
"@typeberry/workers-api": "*",
|
|
25
|
-
"@typeberry/workers-api-node": "*"
|
|
26
|
-
},
|
|
27
|
-
"scripts": {
|
|
28
|
-
"test": "tsx --test $(find . -type f -name '*.test.ts' | tr '\\n' ' ')"
|
|
29
|
-
},
|
|
30
|
-
"author": "Fluffy Labs",
|
|
31
|
-
"license": "MPL-2.0",
|
|
32
|
-
"type": "module"
|
|
33
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@typeberry/importer",
|
|
3
|
-
"version": "0.5.6",
|
|
4
|
-
"description": "A JAM block importer queue.",
|
|
5
|
-
"main": "index.ts",
|
|
6
|
-
"dependencies": {
|
|
7
|
-
"@opentelemetry/api": "1.9.0",
|
|
8
|
-
"@typeberry/block": "*",
|
|
9
|
-
"@typeberry/bytes": "*",
|
|
10
|
-
"@typeberry/codec": "*",
|
|
11
|
-
"@typeberry/collections": "*",
|
|
12
|
-
"@typeberry/config": "*",
|
|
13
|
-
"@typeberry/config-node": "*",
|
|
14
|
-
"@typeberry/crypto": "*",
|
|
15
|
-
"@typeberry/database": "*",
|
|
16
|
-
"@typeberry/hash": "*",
|
|
17
|
-
"@typeberry/logger": "*",
|
|
18
|
-
"@typeberry/numbers": "*",
|
|
19
|
-
"@typeberry/ordering": "*",
|
|
20
|
-
"@typeberry/state-merkleization": "*",
|
|
21
|
-
"@typeberry/telemetry": "*",
|
|
22
|
-
"@typeberry/transition": "*",
|
|
23
|
-
"@typeberry/utils": "*",
|
|
24
|
-
"@typeberry/workers-api": "*",
|
|
25
|
-
"@typeberry/workers-api-node": "*"
|
|
26
|
-
},
|
|
27
|
-
"scripts": {
|
|
28
|
-
"test": "tsx --test $(find . -type f -name '*.test.ts' | tr '\\n' ' ')"
|
|
29
|
-
},
|
|
30
|
-
"author": "Fluffy Labs",
|
|
31
|
-
"license": "MPL-2.0",
|
|
32
|
-
"type": "module"
|
|
33
|
-
}
|