jazz-tools 0.18.15 → 0.18.16

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.
Files changed (58) hide show
  1. package/.turbo/turbo-build.log +45 -35
  2. package/CHANGELOG.md +9 -0
  3. package/dist/better-auth/database-adapter/index.d.ts +50 -0
  4. package/dist/better-auth/database-adapter/index.d.ts.map +1 -0
  5. package/dist/better-auth/database-adapter/index.js +920 -0
  6. package/dist/better-auth/database-adapter/index.js.map +1 -0
  7. package/dist/better-auth/database-adapter/repository/account.d.ts +24 -0
  8. package/dist/better-auth/database-adapter/repository/account.d.ts.map +1 -0
  9. package/dist/better-auth/database-adapter/repository/generic.d.ts +45 -0
  10. package/dist/better-auth/database-adapter/repository/generic.d.ts.map +1 -0
  11. package/dist/better-auth/database-adapter/repository/index.d.ts +6 -0
  12. package/dist/better-auth/database-adapter/repository/index.d.ts.map +1 -0
  13. package/dist/better-auth/database-adapter/repository/session.d.ts +29 -0
  14. package/dist/better-auth/database-adapter/repository/session.d.ts.map +1 -0
  15. package/dist/better-auth/database-adapter/repository/user.d.ts +30 -0
  16. package/dist/better-auth/database-adapter/repository/user.d.ts.map +1 -0
  17. package/dist/better-auth/database-adapter/repository/verification.d.ts +18 -0
  18. package/dist/better-auth/database-adapter/repository/verification.d.ts.map +1 -0
  19. package/dist/better-auth/database-adapter/schema.d.ts +27 -0
  20. package/dist/better-auth/database-adapter/schema.d.ts.map +1 -0
  21. package/dist/better-auth/database-adapter/tests/index.test.d.ts +2 -0
  22. package/dist/better-auth/database-adapter/tests/index.test.d.ts.map +1 -0
  23. package/dist/better-auth/database-adapter/tests/repository/account.test.d.ts +2 -0
  24. package/dist/better-auth/database-adapter/tests/repository/account.test.d.ts.map +1 -0
  25. package/dist/better-auth/database-adapter/tests/repository/generic.test.d.ts +2 -0
  26. package/dist/better-auth/database-adapter/tests/repository/generic.test.d.ts.map +1 -0
  27. package/dist/better-auth/database-adapter/tests/repository/session.test.d.ts +2 -0
  28. package/dist/better-auth/database-adapter/tests/repository/session.test.d.ts.map +1 -0
  29. package/dist/better-auth/database-adapter/tests/repository/user.test.d.ts +2 -0
  30. package/dist/better-auth/database-adapter/tests/repository/user.test.d.ts.map +1 -0
  31. package/dist/better-auth/database-adapter/tests/repository/verification.test.d.ts +2 -0
  32. package/dist/better-auth/database-adapter/tests/repository/verification.test.d.ts.map +1 -0
  33. package/dist/better-auth/database-adapter/tests/sync-utils.d.ts +16 -0
  34. package/dist/better-auth/database-adapter/tests/sync-utils.d.ts.map +1 -0
  35. package/dist/better-auth/database-adapter/tests/utils.test.d.ts +2 -0
  36. package/dist/better-auth/database-adapter/tests/utils.test.d.ts.map +1 -0
  37. package/dist/better-auth/database-adapter/utils.d.ts +16 -0
  38. package/dist/better-auth/database-adapter/utils.d.ts.map +1 -0
  39. package/jazz-tools-0.18.6.tgz +0 -0
  40. package/package.json +10 -5
  41. package/src/better-auth/database-adapter/index.ts +228 -0
  42. package/src/better-auth/database-adapter/repository/account.ts +131 -0
  43. package/src/better-auth/database-adapter/repository/generic.ts +297 -0
  44. package/src/better-auth/database-adapter/repository/index.ts +5 -0
  45. package/src/better-auth/database-adapter/repository/session.ts +190 -0
  46. package/src/better-auth/database-adapter/repository/user.ts +158 -0
  47. package/src/better-auth/database-adapter/repository/verification.ts +37 -0
  48. package/src/better-auth/database-adapter/schema.ts +222 -0
  49. package/src/better-auth/database-adapter/tests/index.test.ts +690 -0
  50. package/src/better-auth/database-adapter/tests/repository/account.test.ts +149 -0
  51. package/src/better-auth/database-adapter/tests/repository/generic.test.ts +183 -0
  52. package/src/better-auth/database-adapter/tests/repository/session.test.ts +419 -0
  53. package/src/better-auth/database-adapter/tests/repository/user.test.ts +673 -0
  54. package/src/better-auth/database-adapter/tests/repository/verification.test.ts +101 -0
  55. package/src/better-auth/database-adapter/tests/sync-utils.ts +127 -0
  56. package/src/better-auth/database-adapter/tests/utils.test.ts +787 -0
  57. package/src/better-auth/database-adapter/utils.ts +178 -0
  58. package/tsup.config.ts +7 -0
@@ -0,0 +1,101 @@
1
+ import { beforeEach, describe, expect, it } from "vitest";
2
+ import { Account, co } from "jazz-tools";
3
+ import { startWorker } from "jazz-tools/worker";
4
+ import { VerificationRepository } from "../../repository";
5
+ import { createJazzSchema, Database } from "../../schema";
6
+ import { createWorkerAccount, startSyncServer } from "../sync-utils.js";
7
+
8
+ describe("VerificationRepository", () => {
9
+ let syncServer: any;
10
+
11
+ let databaseSchema: Database;
12
+ let databaseRoot: co.loaded<Database, { group: true }>;
13
+ let worker: Account;
14
+
15
+ beforeEach(async () => {
16
+ syncServer = await startSyncServer();
17
+
18
+ const workerAccount = await createWorkerAccount({
19
+ name: "test",
20
+ peer: `ws://localhost:${syncServer.port}`,
21
+ });
22
+
23
+ const JazzSchema = createJazzSchema({
24
+ user: {
25
+ modelName: "user",
26
+ fields: {
27
+ email: {
28
+ type: "string",
29
+ required: true,
30
+ },
31
+ },
32
+ },
33
+ session: {
34
+ modelName: "session",
35
+ fields: {
36
+ token: {
37
+ type: "string",
38
+ required: true,
39
+ },
40
+ },
41
+ },
42
+ verification: {
43
+ modelName: "verification",
44
+ fields: {
45
+ identifier: {
46
+ type: "string",
47
+ required: true,
48
+ },
49
+ value: {
50
+ type: "string",
51
+ required: true,
52
+ },
53
+ },
54
+ },
55
+ });
56
+
57
+ const result = await startWorker({
58
+ AccountSchema: JazzSchema.WorkerAccount,
59
+ syncServer: `ws://localhost:${syncServer.port}`,
60
+ accountID: workerAccount.accountID,
61
+ accountSecret: workerAccount.agentSecret,
62
+ });
63
+
64
+ databaseSchema = JazzSchema.DatabaseRoot;
65
+ databaseRoot = await JazzSchema.loadDatabase(result.worker);
66
+ worker = result.worker;
67
+ });
68
+
69
+ it("should create a verification entity with unique identifier", async () => {
70
+ const verificationRepository = new VerificationRepository(
71
+ databaseSchema,
72
+ databaseRoot,
73
+ worker,
74
+ );
75
+
76
+ const verification = await verificationRepository.create("verification", {
77
+ identifier: "test",
78
+ value: "test",
79
+ });
80
+
81
+ expect(verification.$jazz.id).toBeDefined();
82
+
83
+ const result = await verificationRepository.findMany(
84
+ "verification",
85
+ [
86
+ {
87
+ operator: "eq",
88
+ connector: "AND",
89
+ field: "identifier",
90
+ value: "test",
91
+ },
92
+ ],
93
+ 1,
94
+ { field: "createdAt", direction: "desc" },
95
+ undefined,
96
+ );
97
+
98
+ expect(result.length).toBe(1);
99
+ expect(result[0]?.$jazz.id).toBe(verification.$jazz.id);
100
+ });
101
+ });
@@ -0,0 +1,127 @@
1
+ import { createServer } from "node:http";
2
+ import { LocalNode } from "cojson";
3
+ import { createWebSocketPeer } from "cojson-transport-ws";
4
+ import { WasmCrypto } from "cojson/crypto/WasmCrypto";
5
+ import { WebSocket, WebSocketServer } from "ws";
6
+ import { Account, isControlledAccount } from "jazz-tools";
7
+
8
+ export const startSyncServer = async (port?: number) => {
9
+ const crypto = await WasmCrypto.create();
10
+
11
+ const server = createServer((req, res) => {
12
+ if (req.url === "/health") {
13
+ res.writeHead(200);
14
+ res.end("ok");
15
+ }
16
+ });
17
+ const wss = new WebSocketServer({ noServer: true });
18
+
19
+ const agentSecret = crypto.newRandomAgentSecret();
20
+ const agentID = crypto.getAgentID(agentSecret);
21
+
22
+ const localNode = new LocalNode(
23
+ agentSecret,
24
+ crypto.newRandomSessionID(agentID),
25
+ crypto,
26
+ );
27
+
28
+ const connections = new Set<WebSocket>();
29
+
30
+ wss.on("connection", function connection(ws, req) {
31
+ connections.add(ws);
32
+
33
+ const sendPing = () => {
34
+ ws.send(
35
+ JSON.stringify({
36
+ type: "ping",
37
+ time: Date.now(),
38
+ dc: "unknown",
39
+ }),
40
+ );
41
+ };
42
+
43
+ // ping/pong for the connection liveness
44
+ const pinging = setInterval(sendPing, 100);
45
+
46
+ sendPing(); // Immediately send a ping to the client to signal that the connection is established
47
+
48
+ ws.on("close", () => {
49
+ clearInterval(pinging);
50
+ connections.delete(ws);
51
+ });
52
+
53
+ const clientId = new Date().toISOString();
54
+
55
+ localNode.syncManager.addPeer(
56
+ createWebSocketPeer({
57
+ id: clientId,
58
+ role: "client",
59
+ websocket: ws,
60
+ expectPings: false,
61
+ batchingByDefault: false,
62
+ deletePeerStateOnClose: true,
63
+ }),
64
+ );
65
+
66
+ ws.on("error", (e) => console.error(`Error on connection ${clientId}:`, e));
67
+ });
68
+
69
+ server.on("upgrade", function upgrade(req, socket, head) {
70
+ if (req.url !== "/health") {
71
+ wss.handleUpgrade(req, socket, head, function done(ws) {
72
+ wss.emit("connection", ws, req);
73
+ });
74
+ }
75
+ });
76
+
77
+ server.listen(port ?? 0);
78
+
79
+ const actualPort = (server.address() as { port: number }).port;
80
+ const syncServer = `ws://localhost:${actualPort}`;
81
+
82
+ return {
83
+ close: () => {
84
+ for (const ws of connections) {
85
+ ws.close();
86
+ }
87
+ server.close();
88
+ },
89
+ syncServer,
90
+ port: actualPort,
91
+ localNode,
92
+ wss,
93
+ };
94
+ };
95
+
96
+ export const createWorkerAccount = async ({
97
+ name,
98
+ peer: peerAddr,
99
+ }: {
100
+ name: string;
101
+ peer: string;
102
+ }) => {
103
+ const crypto = await WasmCrypto.create();
104
+
105
+ const peer = createWebSocketPeer({
106
+ id: "upstream",
107
+ websocket: new WebSocket(peerAddr),
108
+ role: "server",
109
+ });
110
+
111
+ const account = await Account.create({
112
+ creationProps: { name },
113
+ peersToLoadFrom: [peer],
114
+ crypto,
115
+ });
116
+
117
+ if (!isControlledAccount(account)) {
118
+ throw new Error("account is not a controlled account");
119
+ }
120
+
121
+ await account.$jazz.waitForAllCoValuesSync({ timeout: 4_000 });
122
+
123
+ return {
124
+ accountID: account.$jazz.id,
125
+ agentSecret: account.$jazz.raw.core.node.getCurrentAgent().agentSecret,
126
+ };
127
+ };