diff --git a/bin/callback.js b/bin/callback.cjs similarity index 86% rename from bin/callback.js rename to bin/callback.cjs index 4da8163..418f7c3 100644 --- a/bin/callback.js +++ b/bin/callback.cjs @@ -1,7 +1,8 @@ const http = require('http') +const number = require('lib0/number') const CALLBACK_URL = process.env.CALLBACK_URL ? new URL(process.env.CALLBACK_URL) : null -const CALLBACK_TIMEOUT = process.env.CALLBACK_TIMEOUT || 5000 +const CALLBACK_TIMEOUT = number.parseInt(process.env.CALLBACK_TIMEOUT || '5000') const CALLBACK_OBJECTS = process.env.CALLBACK_OBJECTS ? JSON.parse(process.env.CALLBACK_OBJECTS) : {} exports.isCallbackSet = !!CALLBACK_URL @@ -9,7 +10,7 @@ exports.isCallbackSet = !!CALLBACK_URL /** * @param {Uint8Array} update * @param {any} origin - * @param {WSSharedDoc} doc + * @param {import('./utils.cjs').WSSharedDoc} doc */ exports.callbackHandler = (update, origin, doc) => { const room = doc.name @@ -25,7 +26,7 @@ exports.callbackHandler = (update, origin, doc) => { content: getContent(sharedObjectName, sharedObjectType, doc).toJSON() } }) - callbackRequest(CALLBACK_URL, CALLBACK_TIMEOUT, dataToSend) + CALLBACK_URL && callbackRequest(CALLBACK_URL, CALLBACK_TIMEOUT, dataToSend) } /** @@ -62,7 +63,7 @@ const callbackRequest = (url, timeout, data) => { /** * @param {string} objName * @param {string} objType - * @param {WSSharedDoc} doc + * @param {import('./utils.cjs').WSSharedDoc} doc */ const getContent = (objName, objType, doc) => { switch (objType) { diff --git a/bin/server.js b/bin/server.cjs similarity index 77% rename from bin/server.js rename to bin/server.cjs index 839633f..751aaf1 100755 --- a/bin/server.js +++ b/bin/server.cjs @@ -5,13 +5,14 @@ */ const WebSocket = require('ws') const http = require('http') +const number = require('lib0/number') const wss = new WebSocket.Server({ noServer: true }) -const setupWSConnection = require('./utils.js').setupWSConnection +const setupWSConnection = require('./utils.cjs').setupWSConnection const host = process.env.HOST || 'localhost' -const port = process.env.PORT || 1234 +const port = number.parseInt(process.env.PORT || '1234') -const server = http.createServer((request, response) => { +const server = http.createServer((_request, response) => { response.writeHead(200, { 'Content-Type': 'text/plain' }) response.end('okay') }) diff --git a/bin/utils.js b/bin/utils.cjs similarity index 93% rename from bin/utils.js rename to bin/utils.cjs index 72775d9..91b003f 100644 --- a/bin/utils.js +++ b/bin/utils.cjs @@ -1,18 +1,18 @@ const Y = require('yjs') -const syncProtocol = require('y-protocols/dist/sync.cjs') -const awarenessProtocol = require('y-protocols/dist/awareness.cjs') +const syncProtocol = require('y-protocols/sync') +const awarenessProtocol = require('y-protocols/awareness') -const encoding = require('lib0/dist/encoding.cjs') -const decoding = require('lib0/dist/decoding.cjs') -const map = require('lib0/dist/map.cjs') +const encoding = require('lib0/encoding') +const decoding = require('lib0/decoding') +const map = require('lib0/map') const debounce = require('lodash.debounce') -const callbackHandler = require('./callback.js').callbackHandler -const isCallbackSet = require('./callback.js').isCallbackSet +const callbackHandler = require('./callback.cjs').callbackHandler +const isCallbackSet = require('./callback.cjs').isCallbackSet -const CALLBACK_DEBOUNCE_WAIT = parseInt(process.env.CALLBACK_DEBOUNCE_WAIT) || 2000 -const CALLBACK_DEBOUNCE_MAXWAIT = parseInt(process.env.CALLBACK_DEBOUNCE_MAXWAIT) || 10000 +const CALLBACK_DEBOUNCE_WAIT = parseInt(process.env.CALLBACK_DEBOUNCE_WAIT || '2000') +const CALLBACK_DEBOUNCE_MAXWAIT = parseInt(process.env.CALLBACK_DEBOUNCE_MAXWAIT || '10000') const wsReadyStateConnecting = 0 const wsReadyStateOpen = 1 @@ -73,10 +73,11 @@ const messageAwareness = 1 /** * @param {Uint8Array} update - * @param {any} origin + * @param {any} _origin * @param {WSSharedDoc} doc + * @param {any} _tr */ -const updateHandler = (update, origin, doc) => { +const updateHandler = (update, _origin, doc, _tr) => { const encoder = encoding.createEncoder() encoding.writeVarUint(encoder, messageSync) syncProtocol.writeUpdate(encoder, update) @@ -124,7 +125,7 @@ class WSSharedDoc extends Y.Doc { }) } this.awareness.on('update', awarenessChangeHandler) - this.on('update', updateHandler) + this.on('update', /** @type {any} */ (updateHandler)) if (isCallbackSet) { this.on('update', debounce( callbackHandler, @@ -135,6 +136,8 @@ class WSSharedDoc extends Y.Doc { } } +exports.WSSharedDoc = WSSharedDoc + /** * Gets a Y.Doc by name, whether in memory or on disk * @@ -183,6 +186,7 @@ const messageListener = (conn, doc, message) => { } } catch (err) { console.error(err) + // @ts-ignore doc.emit('error', [err]) } } diff --git a/package-lock.json b/package-lock.json index a6f9f76..fac9886 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,8 @@ "y-protocols": "^1.0.5" }, "bin": { - "y-websocket": "bin/server.js", - "y-websocket-server": "bin/server.js" + "y-websocket": "bin/server.cjs", + "y-websocket-server": "bin/server.cjs" }, "devDependencies": { "@types/node": "^18.15.0", @@ -24,6 +24,10 @@ "typescript": "^4.9.5", "yjs": "^13.5.0" }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, "funding": { "type": "GitHub Sponsors ❤", "url": "https://github.com/sponsors/dmonad" @@ -1915,17 +1919,19 @@ } }, "node_modules/lib0": { - "version": "0.2.66", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.66.tgz", - "integrity": "sha512-h63Jt0nmFGmE4aXMPHUuRBpDgkdr1gfeVn+epJJ8m6+gPK0AozP6akJ8rp9IqBP8RC/peLi+pwaOx/qpgAvqgA==", + "version": "0.2.93", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.93.tgz", + "integrity": "sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q==", "dependencies": { "isomorphic.js": "^0.2.4" }, "bin": { - "0gentesthtml": "bin/gentesthtml.js" + "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" }, "engines": { - "node": ">=14" + "node": ">=16" }, "funding": { "type": "GitHub Sponsors ❤", @@ -3152,12 +3158,16 @@ } }, "node_modules/yjs": { - "version": "13.5.50", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.5.50.tgz", - "integrity": "sha512-Q2KVNfovwjtJV4Yxz+HaFYT6vTYBaFagOSpTL3jbPc7Sbv/My68fLTfPlYy9FmNO87pV8dMBd5XuVar+9WsAWg==", + "version": "13.6.14", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.14.tgz", + "integrity": "sha512-D+7KcUr0j+vBCUSKXXEWfA+bG4UQBviAwP3gYBhkstkgwy5+8diOPMx0iqLIOxNo/HxaREUimZRxqHGAHCL2BQ==", "devOptional": true, "dependencies": { - "lib0": "^0.2.49" + "lib0": "^0.2.86" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" }, "funding": { "type": "GitHub Sponsors ❤", diff --git a/package.json b/package.json index 441d8e2..7fd7a65 100644 --- a/package.json +++ b/package.json @@ -5,21 +5,22 @@ "main": "./dist/y-websocket.cjs", "module": "./src/y-websocket.js", "types": "./dist/src/y-websocket.d.ts", + "type": "module", "sideEffects": false, "funding": { "type": "GitHub Sponsors ❤", "url": "https://github.com/sponsors/dmonad" }, "scripts": { - "start": "node ./bin/server.js", + "start": "node ./bin/server.cjs", "dist": "rm -rf dist && rollup -c && tsc", "lint": "standard && tsc", "test": "npm run lint", "preversion": "npm run lint && npm run dist && test -e dist/src/y-websocket.d.ts && test -e dist/y-websocket.cjs" }, "bin": { - "y-websocket-server": "./bin/server.js", - "y-websocket": "./bin/server.js" + "y-websocket-server": "./bin/server.cjs", + "y-websocket": "./bin/server.cjs" }, "files": [ "dist/*", @@ -28,13 +29,14 @@ ], "exports": { "./package.json": "./package.json", - "./bin/utils": "./bin/utils.js", - "./bin/callback": "./bin/callback.js", + "./bin/utils": "./bin/utils.cjs", + "./bin/callback": "./bin/callback.cjs", ".": { "module": "./src/y-websocket.js", "import": "./src/y-websocket.js", "require": "./dist/y-websocket.cjs", - "types": "./dist/src/y-websocket.d.ts" + "types": "./dist/src/y-websocket.d.ts", + "default": "./dist/y-websocket.js" } }, "repository": { diff --git a/tsconfig.json b/tsconfig.json index f263390..e15dee3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -58,5 +58,5 @@ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ // "maxNodeModuleJsDepth": 5 }, - "include": ["./src/y-websocket.js"] + "include": ["./src/y-websocket.js", "./bin/**/*"] }