make this a proper esm module

This commit is contained in:
Kevin Jahns 2024-03-20 11:44:18 +01:00
parent 89fb1e38ee
commit c3d14cf07d
6 changed files with 55 additions and 37 deletions

View File

@ -1,7 +1,8 @@
const http = require('http') 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_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) : {} const CALLBACK_OBJECTS = process.env.CALLBACK_OBJECTS ? JSON.parse(process.env.CALLBACK_OBJECTS) : {}
exports.isCallbackSet = !!CALLBACK_URL exports.isCallbackSet = !!CALLBACK_URL
@ -9,7 +10,7 @@ exports.isCallbackSet = !!CALLBACK_URL
/** /**
* @param {Uint8Array} update * @param {Uint8Array} update
* @param {any} origin * @param {any} origin
* @param {WSSharedDoc} doc * @param {import('./utils.cjs').WSSharedDoc} doc
*/ */
exports.callbackHandler = (update, origin, doc) => { exports.callbackHandler = (update, origin, doc) => {
const room = doc.name const room = doc.name
@ -25,7 +26,7 @@ exports.callbackHandler = (update, origin, doc) => {
content: getContent(sharedObjectName, sharedObjectType, doc).toJSON() 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} objName
* @param {string} objType * @param {string} objType
* @param {WSSharedDoc} doc * @param {import('./utils.cjs').WSSharedDoc} doc
*/ */
const getContent = (objName, objType, doc) => { const getContent = (objName, objType, doc) => {
switch (objType) { switch (objType) {

View File

@ -5,13 +5,14 @@
*/ */
const WebSocket = require('ws') const WebSocket = require('ws')
const http = require('http') const http = require('http')
const number = require('lib0/number')
const wss = new WebSocket.Server({ noServer: true }) 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 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.writeHead(200, { 'Content-Type': 'text/plain' })
response.end('okay') response.end('okay')
}) })

View File

@ -1,18 +1,18 @@
const Y = require('yjs') const Y = require('yjs')
const syncProtocol = require('y-protocols/dist/sync.cjs') const syncProtocol = require('y-protocols/sync')
const awarenessProtocol = require('y-protocols/dist/awareness.cjs') const awarenessProtocol = require('y-protocols/awareness')
const encoding = require('lib0/dist/encoding.cjs') const encoding = require('lib0/encoding')
const decoding = require('lib0/dist/decoding.cjs') const decoding = require('lib0/decoding')
const map = require('lib0/dist/map.cjs') const map = require('lib0/map')
const debounce = require('lodash.debounce') const debounce = require('lodash.debounce')
const callbackHandler = require('./callback.js').callbackHandler const callbackHandler = require('./callback.cjs').callbackHandler
const isCallbackSet = require('./callback.js').isCallbackSet const isCallbackSet = require('./callback.cjs').isCallbackSet
const CALLBACK_DEBOUNCE_WAIT = parseInt(process.env.CALLBACK_DEBOUNCE_WAIT) || 2000 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_MAXWAIT = parseInt(process.env.CALLBACK_DEBOUNCE_MAXWAIT || '10000')
const wsReadyStateConnecting = 0 const wsReadyStateConnecting = 0
const wsReadyStateOpen = 1 const wsReadyStateOpen = 1
@ -73,10 +73,11 @@ const messageAwareness = 1
/** /**
* @param {Uint8Array} update * @param {Uint8Array} update
* @param {any} origin * @param {any} _origin
* @param {WSSharedDoc} doc * @param {WSSharedDoc} doc
* @param {any} _tr
*/ */
const updateHandler = (update, origin, doc) => { const updateHandler = (update, _origin, doc, _tr) => {
const encoder = encoding.createEncoder() const encoder = encoding.createEncoder()
encoding.writeVarUint(encoder, messageSync) encoding.writeVarUint(encoder, messageSync)
syncProtocol.writeUpdate(encoder, update) syncProtocol.writeUpdate(encoder, update)
@ -124,7 +125,7 @@ class WSSharedDoc extends Y.Doc {
}) })
} }
this.awareness.on('update', awarenessChangeHandler) this.awareness.on('update', awarenessChangeHandler)
this.on('update', updateHandler) this.on('update', /** @type {any} */ (updateHandler))
if (isCallbackSet) { if (isCallbackSet) {
this.on('update', debounce( this.on('update', debounce(
callbackHandler, 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 * Gets a Y.Doc by name, whether in memory or on disk
* *
@ -183,6 +186,7 @@ const messageListener = (conn, doc, message) => {
} }
} catch (err) { } catch (err) {
console.error(err) console.error(err)
// @ts-ignore
doc.emit('error', [err]) doc.emit('error', [err])
} }
} }

32
package-lock.json generated
View File

@ -14,8 +14,8 @@
"y-protocols": "^1.0.5" "y-protocols": "^1.0.5"
}, },
"bin": { "bin": {
"y-websocket": "bin/server.js", "y-websocket": "bin/server.cjs",
"y-websocket-server": "bin/server.js" "y-websocket-server": "bin/server.cjs"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^18.15.0", "@types/node": "^18.15.0",
@ -24,6 +24,10 @@
"typescript": "^4.9.5", "typescript": "^4.9.5",
"yjs": "^13.5.0" "yjs": "^13.5.0"
}, },
"engines": {
"node": ">=16.0.0",
"npm": ">=8.0.0"
},
"funding": { "funding": {
"type": "GitHub Sponsors ❤", "type": "GitHub Sponsors ❤",
"url": "https://github.com/sponsors/dmonad" "url": "https://github.com/sponsors/dmonad"
@ -1915,17 +1919,19 @@
} }
}, },
"node_modules/lib0": { "node_modules/lib0": {
"version": "0.2.66", "version": "0.2.93",
"resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.66.tgz", "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.93.tgz",
"integrity": "sha512-h63Jt0nmFGmE4aXMPHUuRBpDgkdr1gfeVn+epJJ8m6+gPK0AozP6akJ8rp9IqBP8RC/peLi+pwaOx/qpgAvqgA==", "integrity": "sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q==",
"dependencies": { "dependencies": {
"isomorphic.js": "^0.2.4" "isomorphic.js": "^0.2.4"
}, },
"bin": { "bin": {
"0gentesthtml": "bin/gentesthtml.js" "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js",
"0gentesthtml": "bin/gentesthtml.js",
"0serve": "bin/0serve.js"
}, },
"engines": { "engines": {
"node": ">=14" "node": ">=16"
}, },
"funding": { "funding": {
"type": "GitHub Sponsors ❤", "type": "GitHub Sponsors ❤",
@ -3152,12 +3158,16 @@
} }
}, },
"node_modules/yjs": { "node_modules/yjs": {
"version": "13.5.50", "version": "13.6.14",
"resolved": "https://registry.npmjs.org/yjs/-/yjs-13.5.50.tgz", "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.14.tgz",
"integrity": "sha512-Q2KVNfovwjtJV4Yxz+HaFYT6vTYBaFagOSpTL3jbPc7Sbv/My68fLTfPlYy9FmNO87pV8dMBd5XuVar+9WsAWg==", "integrity": "sha512-D+7KcUr0j+vBCUSKXXEWfA+bG4UQBviAwP3gYBhkstkgwy5+8diOPMx0iqLIOxNo/HxaREUimZRxqHGAHCL2BQ==",
"devOptional": true, "devOptional": true,
"dependencies": { "dependencies": {
"lib0": "^0.2.49" "lib0": "^0.2.86"
},
"engines": {
"node": ">=16.0.0",
"npm": ">=8.0.0"
}, },
"funding": { "funding": {
"type": "GitHub Sponsors ❤", "type": "GitHub Sponsors ❤",

View File

@ -5,21 +5,22 @@
"main": "./dist/y-websocket.cjs", "main": "./dist/y-websocket.cjs",
"module": "./src/y-websocket.js", "module": "./src/y-websocket.js",
"types": "./dist/src/y-websocket.d.ts", "types": "./dist/src/y-websocket.d.ts",
"type": "module",
"sideEffects": false, "sideEffects": false,
"funding": { "funding": {
"type": "GitHub Sponsors ❤", "type": "GitHub Sponsors ❤",
"url": "https://github.com/sponsors/dmonad" "url": "https://github.com/sponsors/dmonad"
}, },
"scripts": { "scripts": {
"start": "node ./bin/server.js", "start": "node ./bin/server.cjs",
"dist": "rm -rf dist && rollup -c && tsc", "dist": "rm -rf dist && rollup -c && tsc",
"lint": "standard && tsc", "lint": "standard && tsc",
"test": "npm run lint", "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" "preversion": "npm run lint && npm run dist && test -e dist/src/y-websocket.d.ts && test -e dist/y-websocket.cjs"
}, },
"bin": { "bin": {
"y-websocket-server": "./bin/server.js", "y-websocket-server": "./bin/server.cjs",
"y-websocket": "./bin/server.js" "y-websocket": "./bin/server.cjs"
}, },
"files": [ "files": [
"dist/*", "dist/*",
@ -28,13 +29,14 @@
], ],
"exports": { "exports": {
"./package.json": "./package.json", "./package.json": "./package.json",
"./bin/utils": "./bin/utils.js", "./bin/utils": "./bin/utils.cjs",
"./bin/callback": "./bin/callback.js", "./bin/callback": "./bin/callback.cjs",
".": { ".": {
"module": "./src/y-websocket.js", "module": "./src/y-websocket.js",
"import": "./src/y-websocket.js", "import": "./src/y-websocket.js",
"require": "./dist/y-websocket.cjs", "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": { "repository": {

View File

@ -58,5 +58,5 @@
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
// "maxNodeModuleJsDepth": 5 // "maxNodeModuleJsDepth": 5
}, },
"include": ["./src/y-websocket.js"] "include": ["./src/y-websocket.js", "./bin/**/*"]
} }