Compare commits
5 Commits
authv2-can
...
cojson-tra
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f71f26d1dc | ||
|
|
95822300d7 | ||
|
|
679fe040cf | ||
|
|
14b6149f50 | ||
|
|
4446738940 |
@@ -42,6 +42,15 @@
|
||||
}
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
"include": ["**/package.json"],
|
||||
"linter": {
|
||||
"enabled": false
|
||||
},
|
||||
"formatter": {
|
||||
"enabled": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"include": ["packages/**/src/**"],
|
||||
"linter": {
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# chat-rn-clerk
|
||||
|
||||
## 1.0.63
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react-native@0.9.22
|
||||
- jazz-react-native-auth-clerk@0.9.22
|
||||
|
||||
## 1.0.62
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "chat-rn-clerk",
|
||||
"main": "index.js",
|
||||
"version": "1.0.62",
|
||||
"version": "1.0.63",
|
||||
"scripts": {
|
||||
"build": "expo export -p ios",
|
||||
"start": "expo start",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# chat-rn
|
||||
|
||||
## 1.0.60
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react-native@0.9.22
|
||||
|
||||
## 1.0.59
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chat-rn",
|
||||
"version": "1.0.59",
|
||||
"version": "1.0.60",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"build": "expo export -p ios",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# chat-vue
|
||||
|
||||
## 0.0.47
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser@0.9.22
|
||||
- jazz-vue@0.9.22
|
||||
|
||||
## 0.0.46
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chat-vue",
|
||||
"version": "0.0.46",
|
||||
"version": "0.0.47",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# jazz-example-chat
|
||||
|
||||
## 0.0.143
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser-media-images@0.9.22
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.142
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-example-chat",
|
||||
"private": true,
|
||||
"version": "0.0.142",
|
||||
"version": "0.0.143",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# minimal-auth-clerk
|
||||
|
||||
## 0.0.42
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react@0.9.22
|
||||
- jazz-react-auth-clerk@0.9.22
|
||||
|
||||
## 0.0.41
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "clerk",
|
||||
"private": true,
|
||||
"version": "0.0.41",
|
||||
"version": "0.0.42",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
@@ -13,7 +13,7 @@
|
||||
"dependencies": {
|
||||
"@clerk/clerk-react": "^5.4.1",
|
||||
"jazz-react": "workspace:*",
|
||||
"jazz-react-auth-clerk": "workspace:0.9.21",
|
||||
"jazz-react-auth-clerk": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:*",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1"
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# file-share-svelte
|
||||
|
||||
## 0.0.27
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-svelte@0.9.22
|
||||
|
||||
## 0.0.26
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "file-share-svelte",
|
||||
"version": "0.0.26",
|
||||
"version": "0.0.27",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# form
|
||||
|
||||
## 0.0.38
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser-media-images@0.9.22
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.37
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "form",
|
||||
"private": true,
|
||||
"version": "0.0.37",
|
||||
"version": "0.0.38",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# image-upload
|
||||
|
||||
## 0.0.40
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser-media-images@0.9.22
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "image-upload",
|
||||
"private": true,
|
||||
"version": "0.0.39",
|
||||
"version": "0.0.40",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# jazz-example-inspector
|
||||
|
||||
## 0.0.101
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [14b6149]
|
||||
- cojson-transport-ws@0.9.22
|
||||
|
||||
## 0.0.100
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-inspector-app",
|
||||
"private": true,
|
||||
"version": "0.0.100",
|
||||
"version": "0.0.101",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
@@ -17,7 +17,7 @@
|
||||
"class-variance-authority": "^0.7.0",
|
||||
"clsx": "^2.0.0",
|
||||
"cojson": "workspace:0.9.19",
|
||||
"cojson-transport-ws": "workspace:0.9.19",
|
||||
"cojson-transport-ws": "workspace:0.9.22",
|
||||
"hash-slash": "workspace:0.2.1",
|
||||
"lucide-react": "^0.274.0",
|
||||
"qrcode": "^1.5.3",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# jazz-example-musicplayer
|
||||
|
||||
## 0.0.64
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.63
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-example-music-player",
|
||||
"private": true,
|
||||
"version": "0.0.63",
|
||||
"version": "0.0.64",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
@@ -18,7 +18,7 @@
|
||||
"@radix-ui/react-toast": "^1.1.4",
|
||||
"class-variance-authority": "^0.7.0",
|
||||
"clsx": "^2.0.0",
|
||||
"jazz-react": "workspace:0.9.21",
|
||||
"jazz-react": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:0.9.21",
|
||||
"jazz-inspector": "workspace:*",
|
||||
"lucide-react": "^0.274.0",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# jazz-example-onboarding
|
||||
|
||||
## 0.0.44
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser-media-images@0.9.22
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.43
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-example-onboarding",
|
||||
"private": true,
|
||||
"version": "0.0.43",
|
||||
"version": "0.0.44",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# organization
|
||||
|
||||
## 0.0.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "organization",
|
||||
"private": true,
|
||||
"version": "0.0.35",
|
||||
"version": "0.0.36",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# passkey-svelte
|
||||
|
||||
## 0.0.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-svelte@0.9.22
|
||||
|
||||
## 0.0.30
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "passkey-svelte",
|
||||
"version": "0.0.30",
|
||||
"version": "0.0.31",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# minimal-auth-passkey
|
||||
|
||||
## 0.0.41
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.40
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "passkey",
|
||||
"private": true,
|
||||
"version": "0.0.40",
|
||||
"version": "0.0.41",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# jazz-password-manager
|
||||
|
||||
## 0.0.62
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.61
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-password-manager",
|
||||
"private": true,
|
||||
"version": "0.0.61",
|
||||
"version": "0.0.62",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
@@ -12,7 +12,7 @@
|
||||
"clean-install": "rm -rf node_modules pnpm-lock.yaml && pnpm install"
|
||||
},
|
||||
"dependencies": {
|
||||
"jazz-react": "workspace:0.9.21",
|
||||
"jazz-react": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:0.9.21",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# jazz-example-pets
|
||||
|
||||
## 0.0.160
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser-media-images@0.9.22
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.159
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-example-pets",
|
||||
"private": true,
|
||||
"version": "0.0.159",
|
||||
"version": "0.0.160",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
@@ -19,8 +19,8 @@
|
||||
"@radix-ui/react-toast": "^1.1.4",
|
||||
"class-variance-authority": "^0.7.0",
|
||||
"clsx": "^2.0.0",
|
||||
"jazz-browser-media-images": "workspace:0.9.21",
|
||||
"jazz-react": "workspace:0.9.21",
|
||||
"jazz-browser-media-images": "workspace:0.9.22",
|
||||
"jazz-react": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:0.9.21",
|
||||
"lucide-react": "^0.274.0",
|
||||
"qrcode": "^1.5.3",
|
||||
@@ -41,7 +41,7 @@
|
||||
"@vitejs/plugin-react-swc": "^3.3.2",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"is-ci": "^3.0.1",
|
||||
"jazz-run": "workspace:0.9.21",
|
||||
"jazz-run": "workspace:0.9.22",
|
||||
"postcss": "^8.4.27",
|
||||
"tailwindcss": "^3.4.15",
|
||||
"typescript": "~5.6.2",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# reactions
|
||||
|
||||
## 0.0.40
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser-media-images@0.9.22
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "reactions",
|
||||
"private": true,
|
||||
"version": "0.0.39",
|
||||
"version": "0.0.40",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# todo-vue
|
||||
|
||||
## 0.0.45
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser@0.9.22
|
||||
- jazz-vue@0.9.22
|
||||
|
||||
## 0.0.44
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "todo-vue",
|
||||
"version": "0.0.44",
|
||||
"version": "0.0.45",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# jazz-example-todo
|
||||
|
||||
## 0.0.159
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.158
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-example-todo",
|
||||
"private": true,
|
||||
"version": "0.0.158",
|
||||
"version": "0.0.159",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
@@ -16,7 +16,7 @@
|
||||
"@radix-ui/react-toast": "^1.1.4",
|
||||
"class-variance-authority": "^0.7.0",
|
||||
"clsx": "^2.0.0",
|
||||
"jazz-react": "workspace:0.9.21",
|
||||
"jazz-react": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:0.9.21",
|
||||
"lucide-react": "^0.274.0",
|
||||
"qrcode": "^1.5.3",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# version-history
|
||||
|
||||
## 0.0.37
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "version-history",
|
||||
"private": true,
|
||||
"version": "0.0.36",
|
||||
"version": "0.0.37",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# cojson-transport-nodejs-ws
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 14b6149: Handle websocket errors and add an onSuccess callback
|
||||
|
||||
## 0.9.19
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "cojson-transport-ws",
|
||||
"type": "module",
|
||||
"version": "0.9.19",
|
||||
"version": "0.9.22",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cojson": "workspace:0.9.19",
|
||||
"cojson": "workspace:*",
|
||||
"typescript": "~5.6.2"
|
||||
},
|
||||
"scripts": {
|
||||
@@ -19,6 +19,7 @@
|
||||
"prepublishOnly": "npm run build"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/ws": "8.5.10"
|
||||
"@types/ws": "8.5.10",
|
||||
"ws": "^8.14.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ export type CreateWebSocketPeerOpts = {
|
||||
batchingByDefault?: boolean;
|
||||
deletePeerStateOnClose?: boolean;
|
||||
onClose?: () => void;
|
||||
onSuccess?: () => void;
|
||||
};
|
||||
|
||||
function createPingTimeoutListener(enabled: boolean, callback: () => void) {
|
||||
@@ -127,6 +128,7 @@ export function createWebSocketPeer({
|
||||
expectPings = true,
|
||||
batchingByDefault = true,
|
||||
deletePeerStateOnClose = false,
|
||||
onSuccess,
|
||||
onClose,
|
||||
}: CreateWebSocketPeerOpts): Peer {
|
||||
const incoming = new cojsonInternals.Channel<
|
||||
@@ -142,6 +144,13 @@ export function createWebSocketPeer({
|
||||
}
|
||||
|
||||
websocket.addEventListener("close", handleClose);
|
||||
websocket.addEventListener("error" as any, (err) => {
|
||||
logger.warn(err.message);
|
||||
|
||||
if (err.message.includes("ECONNREFUSED")) {
|
||||
websocket.close();
|
||||
}
|
||||
});
|
||||
|
||||
const pingTimeout = createPingTimeoutListener(expectPings, () => {
|
||||
incoming
|
||||
@@ -154,6 +163,7 @@ export function createWebSocketPeer({
|
||||
websocket,
|
||||
batchingByDefault,
|
||||
);
|
||||
let isFirstMessage = true;
|
||||
|
||||
function handleIncomingMsg(event: { data: unknown }) {
|
||||
if (event.data === "") {
|
||||
@@ -169,6 +179,13 @@ export function createWebSocketPeer({
|
||||
return;
|
||||
}
|
||||
|
||||
if (isFirstMessage) {
|
||||
// The only way to know that the connection has been correctly established with our sync server
|
||||
// is to track that we got a message from the server.
|
||||
onSuccess?.();
|
||||
isFirstMessage = false;
|
||||
}
|
||||
|
||||
const { messages } = result;
|
||||
|
||||
if (messages.length > 1) {
|
||||
|
||||
@@ -170,6 +170,31 @@ describe("createWebSocketPeer", () => {
|
||||
);
|
||||
});
|
||||
|
||||
test("should call onSuccess handler after receiving first message", () => {
|
||||
const onSuccess = vi.fn();
|
||||
const { listeners } = setup({ onSuccess });
|
||||
|
||||
const messageHandler = listeners.get("message");
|
||||
const message: SyncMessage = {
|
||||
action: "known",
|
||||
id: "co_ztest",
|
||||
header: false,
|
||||
sessions: {},
|
||||
};
|
||||
|
||||
// First message should trigger onSuccess
|
||||
messageHandler?.(
|
||||
new MessageEvent("message", { data: JSON.stringify(message) }),
|
||||
);
|
||||
expect(onSuccess).toHaveBeenCalledTimes(1);
|
||||
|
||||
// Subsequent messages should not trigger onSuccess again
|
||||
messageHandler?.(
|
||||
new MessageEvent("message", { data: JSON.stringify(message) }),
|
||||
);
|
||||
expect(onSuccess).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
describe("batchingByDefault = true", () => {
|
||||
test("should batch outgoing messages", async () => {
|
||||
const { peer, mockWebSocket } = setup();
|
||||
|
||||
132
packages/cojson-transport-ws/src/tests/integration.test.ts
Normal file
132
packages/cojson-transport-ws/src/tests/integration.test.ts
Normal file
@@ -0,0 +1,132 @@
|
||||
import { ControlledAgent, LocalNode, WasmCrypto } from "cojson";
|
||||
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
||||
import { WebSocket } from "ws";
|
||||
import { createWebSocketPeer } from "../index";
|
||||
import { startSyncServer } from "./syncServer";
|
||||
|
||||
describe("WebSocket Peer Integration", () => {
|
||||
let server: any;
|
||||
let syncServerUrl: string;
|
||||
let crypto: WasmCrypto;
|
||||
|
||||
beforeEach(async () => {
|
||||
crypto = await WasmCrypto.create();
|
||||
const result = await startSyncServer();
|
||||
server = result;
|
||||
syncServerUrl = result.syncServer;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
server.close();
|
||||
});
|
||||
|
||||
test("should establish connection between client and server nodes", async () => {
|
||||
// Create client node
|
||||
const clientAgent = crypto.newRandomAgentSecret();
|
||||
const clientNode = new LocalNode(
|
||||
new ControlledAgent(clientAgent, crypto),
|
||||
crypto.newRandomSessionID(crypto.getAgentID(clientAgent)),
|
||||
crypto,
|
||||
);
|
||||
|
||||
// Create WebSocket connection
|
||||
const ws = new WebSocket(syncServerUrl);
|
||||
|
||||
// Track connection success
|
||||
let connectionEstablished = false;
|
||||
|
||||
// Create peer and add to client node
|
||||
const peer = createWebSocketPeer({
|
||||
id: "test-client",
|
||||
websocket: ws,
|
||||
role: "server",
|
||||
onSuccess: () => {
|
||||
connectionEstablished = true;
|
||||
},
|
||||
});
|
||||
|
||||
clientNode.syncManager.addPeer(peer);
|
||||
|
||||
// Wait for connection to establish
|
||||
await new Promise<void>((resolve) => {
|
||||
const checkConnection = setInterval(() => {
|
||||
if (connectionEstablished) {
|
||||
clearInterval(checkConnection);
|
||||
resolve();
|
||||
}
|
||||
}, 100);
|
||||
});
|
||||
|
||||
expect(connectionEstablished).toBe(true);
|
||||
expect(clientNode.syncManager.getPeers()).toHaveLength(1);
|
||||
});
|
||||
|
||||
test("should sync data between nodes through WebSocket connection", async () => {
|
||||
const clientAgent = crypto.newRandomAgentSecret();
|
||||
const clientNode = new LocalNode(
|
||||
new ControlledAgent(clientAgent, crypto),
|
||||
crypto.newRandomSessionID(crypto.getAgentID(clientAgent)),
|
||||
crypto,
|
||||
);
|
||||
|
||||
const ws = new WebSocket(syncServerUrl);
|
||||
|
||||
const peer = createWebSocketPeer({
|
||||
id: "test-client",
|
||||
websocket: ws,
|
||||
role: "server",
|
||||
});
|
||||
|
||||
clientNode.syncManager.addPeer(peer);
|
||||
|
||||
// Create a test group
|
||||
const group = clientNode.createGroup();
|
||||
const map = group.createMap();
|
||||
map.set("testKey", "testValue", "trusting");
|
||||
|
||||
// Wait for sync
|
||||
await map.core.waitForSync();
|
||||
console.log("synced");
|
||||
|
||||
// Verify data reached the server
|
||||
const serverNode = server.localNode;
|
||||
const serverMap = await serverNode.load(map.id);
|
||||
|
||||
expect(serverMap.get("testKey")).toBe("testValue");
|
||||
});
|
||||
|
||||
test("should handle disconnection and cleanup", async () => {
|
||||
const clientAgent = crypto.newRandomAgentSecret();
|
||||
const clientNode = new LocalNode(
|
||||
new ControlledAgent(clientAgent, crypto),
|
||||
crypto.newRandomSessionID(crypto.getAgentID(clientAgent)),
|
||||
crypto,
|
||||
);
|
||||
|
||||
const ws = new WebSocket(syncServerUrl);
|
||||
let disconnectCalled = false;
|
||||
|
||||
const peer = createWebSocketPeer({
|
||||
id: "test-client",
|
||||
websocket: ws,
|
||||
role: "server",
|
||||
onClose: () => {
|
||||
disconnectCalled = true;
|
||||
},
|
||||
});
|
||||
|
||||
clientNode.syncManager.addPeer(peer);
|
||||
|
||||
// Wait for connection to establish
|
||||
await new Promise((resolve) => setTimeout(resolve, 200));
|
||||
|
||||
// Close the server
|
||||
server.close();
|
||||
|
||||
// Wait for disconnect handling
|
||||
await new Promise((resolve) => setTimeout(resolve, 200));
|
||||
|
||||
expect(disconnectCalled).toBe(true);
|
||||
expect(ws.readyState).toBe(WebSocket.CLOSED);
|
||||
});
|
||||
});
|
||||
89
packages/cojson-transport-ws/src/tests/syncServer.ts
Normal file
89
packages/cojson-transport-ws/src/tests/syncServer.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
import { createServer } from "http";
|
||||
import { ControlledAgent, LocalNode, WasmCrypto } from "cojson";
|
||||
import { WebSocket, WebSocketServer } from "ws";
|
||||
import { createWebSocketPeer } from "../index";
|
||||
|
||||
export const startSyncServer = async (port?: number) => {
|
||||
const crypto = await WasmCrypto.create();
|
||||
|
||||
const server = createServer((req, res) => {
|
||||
if (req.url === "/health") {
|
||||
res.writeHead(200);
|
||||
res.end("ok");
|
||||
}
|
||||
});
|
||||
const wss = new WebSocketServer({ noServer: true });
|
||||
|
||||
const agentSecret = crypto.newRandomAgentSecret();
|
||||
const agentID = crypto.getAgentID(agentSecret);
|
||||
|
||||
const localNode = new LocalNode(
|
||||
new ControlledAgent(agentSecret, crypto),
|
||||
crypto.newRandomSessionID(agentID),
|
||||
crypto,
|
||||
);
|
||||
|
||||
const connections = new Set<WebSocket>();
|
||||
|
||||
wss.on("connection", function connection(ws, req) {
|
||||
connections.add(ws);
|
||||
|
||||
const sendPing = () => {
|
||||
ws.send(
|
||||
JSON.stringify({
|
||||
type: "ping",
|
||||
time: Date.now(),
|
||||
dc: "unknown",
|
||||
}),
|
||||
);
|
||||
};
|
||||
|
||||
// ping/pong for the connection liveness
|
||||
const pinging = setInterval(sendPing, 100);
|
||||
|
||||
sendPing(); // Immediately send a ping to the client to signal that the connection is established
|
||||
|
||||
ws.on("close", () => {
|
||||
clearInterval(pinging);
|
||||
connections.delete(ws);
|
||||
});
|
||||
|
||||
const clientId = new Date().toISOString();
|
||||
|
||||
localNode.syncManager.addPeer(
|
||||
createWebSocketPeer({
|
||||
id: clientId,
|
||||
role: "client",
|
||||
websocket: ws,
|
||||
expectPings: false,
|
||||
batchingByDefault: false,
|
||||
deletePeerStateOnClose: true,
|
||||
}),
|
||||
);
|
||||
|
||||
ws.on("error", (e) => console.error(`Error on connection ${clientId}:`, e));
|
||||
});
|
||||
|
||||
server.on("upgrade", function upgrade(req, socket, head) {
|
||||
if (req.url !== "/health") {
|
||||
wss.handleUpgrade(req, socket, head, function done(ws) {
|
||||
wss.emit("connection", ws, req);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
server.listen(port ?? 0);
|
||||
|
||||
port = (server.address() as { port: number }).port;
|
||||
const syncServer = `ws://localhost:${port}`;
|
||||
|
||||
return {
|
||||
close: () => {
|
||||
connections.forEach((ws) => ws.close());
|
||||
server.close();
|
||||
},
|
||||
syncServer,
|
||||
port,
|
||||
localNode,
|
||||
};
|
||||
};
|
||||
@@ -1,5 +1,11 @@
|
||||
# jazz-browser-media-images
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"name": "jazz-browser-auth-clerk",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cojson": "workspace:0.9.19",
|
||||
"jazz-browser": "workspace:0.9.21",
|
||||
"jazz-browser": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:0.9.21"
|
||||
},
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# jazz-browser-media-images
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-browser-media-images",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
@@ -8,7 +8,7 @@
|
||||
"dependencies": {
|
||||
"@types/image-blob-reduce": "^4.1.1",
|
||||
"image-blob-reduce": "^4.1.0",
|
||||
"jazz-browser": "workspace:0.9.21",
|
||||
"jazz-browser": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:0.9.21",
|
||||
"pica": "^9.0.1",
|
||||
"typescript": "~5.6.2"
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# jazz-browser
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [14b6149]
|
||||
- cojson-transport-ws@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-browser",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
@@ -9,7 +9,7 @@
|
||||
"@scure/bip39": "^1.3.0",
|
||||
"cojson": "workspace:0.9.19",
|
||||
"cojson-storage-indexeddb": "workspace:0.9.19",
|
||||
"cojson-transport-ws": "workspace:0.9.19",
|
||||
"cojson-transport-ws": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:0.9.21",
|
||||
"typescript": "~5.6.2"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# jazz-autosub
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [14b6149]
|
||||
- cojson-transport-ws@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
"types": "src/index.ts",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"dependencies": {
|
||||
"cojson": "workspace:0.9.19",
|
||||
"cojson-transport-ws": "workspace:0.9.19",
|
||||
"cojson-transport-ws": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:0.9.21",
|
||||
"ws": "^8.14.2"
|
||||
},
|
||||
|
||||
@@ -131,4 +131,53 @@ describe("startWorker integration", () => {
|
||||
await worker1.done();
|
||||
await worker2.done();
|
||||
});
|
||||
|
||||
test("worker reconnects when sync server is closed and reopened", async () => {
|
||||
const worker1 = await setup();
|
||||
const worker2 = await setupWorker(worker1.syncServer);
|
||||
|
||||
const group = Group.create({ owner: worker1.worker });
|
||||
group.addMember("everyone", "reader");
|
||||
|
||||
const map = TestMap.create(
|
||||
{
|
||||
value: "initial value",
|
||||
},
|
||||
{ owner: group },
|
||||
);
|
||||
|
||||
await map.waitForSync();
|
||||
|
||||
// Close the sync server
|
||||
worker1.server.close();
|
||||
|
||||
// Create a new value while server is down
|
||||
const map2 = TestMap.create(
|
||||
{
|
||||
value: "created while offline",
|
||||
},
|
||||
{ owner: group },
|
||||
);
|
||||
|
||||
// Start a new sync server on the same port
|
||||
const newServer = await startSyncServer({
|
||||
port: worker1.port,
|
||||
inMemory: true,
|
||||
db: "",
|
||||
});
|
||||
|
||||
// Wait for reconnection and sync
|
||||
await map2.waitForSync();
|
||||
|
||||
// Verify both old and new values are synced
|
||||
const mapOnWorker2 = await TestMap.load(map.id, worker2.worker, {});
|
||||
const map2OnWorker2 = await TestMap.load(map2.id, worker2.worker, {});
|
||||
|
||||
expect(mapOnWorker2?.value).toBe("initial value");
|
||||
expect(map2OnWorker2?.value).toBe("created while offline");
|
||||
|
||||
// Cleanup
|
||||
await worker2.done();
|
||||
newServer.close();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# jazz-browser-media-images
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser-auth-clerk@0.9.22
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"name": "jazz-react-auth-clerk",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.tsx",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cojson": "workspace:0.9.19",
|
||||
"jazz-browser-auth-clerk": "workspace:0.9.21",
|
||||
"jazz-react": "workspace:0.9.21",
|
||||
"jazz-browser-auth-clerk": "workspace:0.9.22",
|
||||
"jazz-react": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:0.9.21"
|
||||
},
|
||||
"peerDependencies": {
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# jazz-react-native-auth-clerk
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react-native@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-react-native-auth-clerk",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# jazz-browser
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [14b6149]
|
||||
- cojson-transport-ws@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-react-native",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# jazz-react
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-react",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
@@ -18,7 +18,7 @@
|
||||
"dependencies": {
|
||||
"@scure/bip39": "^1.3.0",
|
||||
"cojson": "workspace:0.9.19",
|
||||
"jazz-browser": "workspace:0.9.21",
|
||||
"jazz-browser": "workspace:0.9.22",
|
||||
"jazz-tools": "workspace:0.9.21",
|
||||
"jazz-react-core": "workspace:*"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# jazz-run
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [14b6149]
|
||||
- cojson-transport-ws@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"bin": "./dist/index.js",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"exports": {
|
||||
"./startSyncServer": {
|
||||
"import": "./dist/startSyncServer.js",
|
||||
@@ -30,7 +30,7 @@
|
||||
"@effect/typeclass": "^0.25.5",
|
||||
"cojson": "workspace:0.9.19",
|
||||
"cojson-storage-sqlite": "workspace:0.9.19",
|
||||
"cojson-transport-ws": "workspace:0.9.19",
|
||||
"cojson-transport-ws": "workspace:0.9.22",
|
||||
"effect": "^3.6.5",
|
||||
"jazz-tools": "workspace:0.9.21",
|
||||
"ws": "^8.14.2"
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# jazz-svelte
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-svelte",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"scripts": {
|
||||
"dev": "vite dev",
|
||||
"build": "vite build && npm run package",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# jazz-react
|
||||
|
||||
## 0.9.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-browser@0.9.22
|
||||
|
||||
## 0.9.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jazz-vue",
|
||||
"version": "0.9.21",
|
||||
"version": "0.9.22",
|
||||
"type": "module",
|
||||
"main": "dist/index.js",
|
||||
"types": "src/index.ts",
|
||||
|
||||
37
pnpm-lock.yaml
generated
37
pnpm-lock.yaml
generated
@@ -453,7 +453,7 @@ importers:
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/jazz-react
|
||||
jazz-react-auth-clerk:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../../packages/jazz-react-auth-clerk
|
||||
jazz-tools:
|
||||
specifier: workspace:*
|
||||
@@ -685,7 +685,7 @@ importers:
|
||||
specifier: workspace:0.9.19
|
||||
version: link:../../packages/cojson
|
||||
cojson-transport-ws:
|
||||
specifier: workspace:0.9.19
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../../packages/cojson-transport-ws
|
||||
hash-slash:
|
||||
specifier: workspace:0.2.1
|
||||
@@ -770,7 +770,7 @@ importers:
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/jazz-inspector
|
||||
jazz-react:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../../packages/jazz-react
|
||||
jazz-tools:
|
||||
specifier: workspace:0.9.21
|
||||
@@ -1027,7 +1027,7 @@ importers:
|
||||
examples/password-manager:
|
||||
dependencies:
|
||||
jazz-react:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../../packages/jazz-react
|
||||
jazz-tools:
|
||||
specifier: workspace:0.9.21
|
||||
@@ -1091,10 +1091,10 @@ importers:
|
||||
specifier: ^2.0.0
|
||||
version: 2.1.1
|
||||
jazz-browser-media-images:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../../packages/jazz-browser-media-images
|
||||
jazz-react:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../../packages/jazz-react
|
||||
jazz-tools:
|
||||
specifier: workspace:0.9.21
|
||||
@@ -1152,7 +1152,7 @@ importers:
|
||||
specifier: ^3.0.1
|
||||
version: 3.0.1
|
||||
jazz-run:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../../packages/jazz-run
|
||||
postcss:
|
||||
specifier: ^8.4.27
|
||||
@@ -1231,7 +1231,7 @@ importers:
|
||||
specifier: ^2.0.0
|
||||
version: 2.1.1
|
||||
jazz-react:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../../packages/jazz-react
|
||||
jazz-tools:
|
||||
specifier: workspace:0.9.21
|
||||
@@ -1518,7 +1518,7 @@ importers:
|
||||
packages/cojson-transport-ws:
|
||||
dependencies:
|
||||
cojson:
|
||||
specifier: workspace:0.9.19
|
||||
specifier: workspace:*
|
||||
version: link:../cojson
|
||||
typescript:
|
||||
specifier: ~5.6.2
|
||||
@@ -1527,6 +1527,9 @@ importers:
|
||||
'@types/ws':
|
||||
specifier: 8.5.10
|
||||
version: 8.5.10
|
||||
ws:
|
||||
specifier: ^8.14.2
|
||||
version: 8.18.0
|
||||
|
||||
packages/create-jazz-app:
|
||||
dependencies:
|
||||
@@ -1586,7 +1589,7 @@ importers:
|
||||
specifier: workspace:0.9.19
|
||||
version: link:../cojson-storage-indexeddb
|
||||
cojson-transport-ws:
|
||||
specifier: workspace:0.9.19
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../cojson-transport-ws
|
||||
jazz-tools:
|
||||
specifier: workspace:0.9.21
|
||||
@@ -1601,7 +1604,7 @@ importers:
|
||||
specifier: workspace:0.9.19
|
||||
version: link:../cojson
|
||||
jazz-browser:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../jazz-browser
|
||||
jazz-tools:
|
||||
specifier: workspace:0.9.21
|
||||
@@ -1620,7 +1623,7 @@ importers:
|
||||
specifier: ^4.1.0
|
||||
version: 4.1.0
|
||||
jazz-browser:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../jazz-browser
|
||||
jazz-tools:
|
||||
specifier: workspace:0.9.21
|
||||
@@ -1676,7 +1679,7 @@ importers:
|
||||
specifier: workspace:0.9.19
|
||||
version: link:../cojson
|
||||
cojson-transport-ws:
|
||||
specifier: workspace:0.9.19
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../cojson-transport-ws
|
||||
jazz-tools:
|
||||
specifier: workspace:0.9.21
|
||||
@@ -1704,7 +1707,7 @@ importers:
|
||||
specifier: workspace:0.9.19
|
||||
version: link:../cojson
|
||||
jazz-browser:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../jazz-browser
|
||||
jazz-react-core:
|
||||
specifier: workspace:*
|
||||
@@ -1741,10 +1744,10 @@ importers:
|
||||
specifier: workspace:0.9.19
|
||||
version: link:../cojson
|
||||
jazz-browser-auth-clerk:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../jazz-browser-auth-clerk
|
||||
jazz-react:
|
||||
specifier: workspace:0.9.21
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../jazz-react
|
||||
jazz-tools:
|
||||
specifier: workspace:0.9.21
|
||||
@@ -1890,7 +1893,7 @@ importers:
|
||||
specifier: workspace:0.9.19
|
||||
version: link:../cojson-storage-sqlite
|
||||
cojson-transport-ws:
|
||||
specifier: workspace:0.9.19
|
||||
specifier: workspace:0.9.22
|
||||
version: link:../cojson-transport-ws
|
||||
effect:
|
||||
specifier: ^3.6.5
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# jazz-tailwind-demo-auth-starter
|
||||
|
||||
## 0.0.37
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- jazz-react@0.9.22
|
||||
|
||||
## 0.0.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jazz-tailwind-demo-auth-starter",
|
||||
"private": true,
|
||||
"version": "0.0.36",
|
||||
"version": "0.0.37",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
Reference in New Issue
Block a user