mirror of
https://github.com/gosticks/DefinitelyTyped.git
synced 2025-10-16 12:05:41 +00:00
72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
/// <reference types="qunit/v1" />
|
|
import * as ShareDB from 'sharedb';
|
|
import * as http from 'http';
|
|
import * as WebSocket from 'ws';
|
|
import { Duplex } from 'stream';
|
|
import * as ShareDBClient from 'sharedb/lib/client';
|
|
|
|
// Adapted from https://github.com/avital/websocket-json-stream
|
|
class WebSocketJSONStream extends Duplex {
|
|
constructor(private readonly ws: WebSocket) {
|
|
super({ objectMode: true });
|
|
this.ws.on('message', (msg: string) => {
|
|
this.push(JSON.parse(msg));
|
|
});
|
|
this.ws.on('close', () => {
|
|
this.push(null); // end readable stream
|
|
this.end(); // end writable stream
|
|
|
|
this.emit('close');
|
|
this.emit('end');
|
|
});
|
|
this.on('error', () => { ws.close(); });
|
|
this.on('end', () => { ws.close(); });
|
|
}
|
|
_read(): void {}
|
|
_write(msg: any, encoding: string, next: () => void): void {
|
|
this.ws.send(JSON.stringify(msg));
|
|
next();
|
|
}
|
|
}
|
|
|
|
const backend = new ShareDB();
|
|
const connection = backend.connect();
|
|
const doc = connection.get('examples', 'counter');
|
|
|
|
doc.fetch((err) => {
|
|
if (err) { throw err; }
|
|
if (doc.type === null) {
|
|
doc.create({ numClicks: 0 }, startServer);
|
|
} else {
|
|
startServer();
|
|
}
|
|
});
|
|
|
|
function startServer() {
|
|
const server = http.createServer();
|
|
|
|
// Connect any incoming WebSocket connection to ShareDB
|
|
const wss = new WebSocket.Server({ server });
|
|
wss.on('connection', (ws, req) => {
|
|
const stream = new WebSocketJSONStream(ws);
|
|
backend.listen(stream);
|
|
});
|
|
|
|
server.listen(8080);
|
|
// console.log('Listening on http://localhost:8080');
|
|
startClient(() => {
|
|
server.close();
|
|
wss.close();
|
|
});
|
|
}
|
|
|
|
function startClient(callback) {
|
|
const socket = new WebSocket('ws://localhost:8080');
|
|
const connection = new ShareDBClient.Connection(socket);
|
|
const doc = connection.get('examples', 'counter');
|
|
doc.subscribe(() => {
|
|
doc.submitOp([{p: ['numClicks'], na: 1}]);
|
|
callback();
|
|
});
|
|
}
|