Merge pull request #157 from ajmar/master

(feat): Allow passing in custom client ID generation function.
This commit is contained in:
Alex Sosnovskiy 2020-03-19 23:11:46 +03:00 committed by GitHub
commit f3bb222609
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 14 deletions

View File

@ -36,8 +36,13 @@ $> peerjs --port 9000 --key peerjs --path /myapp
Or, create a custom server: Or, create a custom server:
```bash
$> npm install peerjs-server
```
```javascript ```javascript
const { PeerServer } = require('peer'); import {PeerServer} from 'peerjs-server';
const server = PeerServer({port: 9000, path: '/myapp'}); const server = PeerServer({port: 9000, path: '/myapp'});
``` ```
@ -54,8 +59,8 @@ const server = PeerServer({port: 9000, path: '/myapp'});
### Using HTTPS: Simply pass in PEM-encoded certificate and key. ### Using HTTPS: Simply pass in PEM-encoded certificate and key.
```javascript ```javascript
const fs = require('fs'); import fs from 'fs';
const { PeerServer } = require('peer'); import {PeerServer} from 'peerjs-server';
const server = PeerServer({ const server = PeerServer({
port: 9000, port: 9000,
@ -74,17 +79,32 @@ The option is passed verbatim to the
if it is truthy. if it is truthy.
```javascript ```javascript
const { PeerServer } = require('peer'); import {PeerServer} from 'peerjs-server';
const server = PeerServer({port: 9000, path: '/myapp', proxied: true}); const server = PeerServer({port: 9000, path: '/myapp', proxied: true});
``` ```
### Custom client ID generation
You can specify a custom function to use to generate client IDs.
```javascript
const genRandomId = () => {
// Original generation algorithm
return (Math.random().toString(36) + '0000000000000000000').substr(2, 16);
}
const server = PeerServer({port: 9000, path: '/myapp', proxied: true, genRandomId: genRandomId });
```
### Combining with existing express app ### Combining with existing express app
```javascript ```javascript
const express = require('express'); import express from 'express';
const app = express(); import {ExpressPeerServer} from 'peerjs-server';
const { ExpressPeerServer } = require('peer');
const app = express();
app.get('/', (req, res, next) => { res.send('Hello world!'); }); app.get('/', (req, res, next) => { res.send('Hello world!'); });
// ======= // =======
@ -102,7 +122,9 @@ app.use(options.path, peerserver);
// == OR == // == OR ==
const server = require('http').createServer(app); import http from 'http';
const server = http.createServer(app);
const peerserver = ExpressPeerServer(server, options); const peerserver = ExpressPeerServer(server, options);
app.use(options.path, peerserver); app.use(options.path, peerserver);

View File

@ -10,7 +10,7 @@ export default ({ config, realm }: {
// Retrieve guaranteed random ID. // Retrieve guaranteed random ID.
app.get("/id", (_, res: express.Response) => { app.get("/id", (_, res: express.Response) => {
res.contentType("html"); res.contentType("html");
res.send(realm.generateClientId()); res.send(realm.generateClientId(config.genRandomId));
}); });
// Get a list of all peers for a key, enabled by the `allowDiscovery` flag. // Get a list of all peers for a key, enabled by the `allowDiscovery` flag.

View File

@ -20,7 +20,7 @@ export interface IRealm {
clearMessageQueue(id: string): void; clearMessageQueue(id: string): void;
generateClientId(): string; generateClientId(genRandomId?: () => string): string;
} }
export class Realm implements IRealm { export class Realm implements IRealm {
@ -69,11 +69,14 @@ export class Realm implements IRealm {
this.messageQueues.delete(id); this.messageQueues.delete(id);
} }
public generateClientId(): string { public generateClientId(genRandomId?: () => string): string {
let clientId = uuidv4();
const _genRandomId = genRandomId ? genRandomId : uuidv4;
let clientId = _genRandomId();
while (this.getClientById(clientId)) { while (this.getClientById(clientId)) {
clientId = uuidv4(); clientId = _genRandomId();
} }
return clientId; return clientId;

View File

@ -4,9 +4,10 @@ import { Client } from '../../src/models/client';
describe('Realm', () => { describe('Realm', () => {
describe('#generateClientId', () => { describe('#generateClientId', () => {
it('should generate a 36-character UUID', () => { it('should generate a 36-character UUID, or return function value', () => {
const realm = new Realm(); const realm = new Realm();
expect(realm.generateClientId().length).to.eq(36); expect(realm.generateClientId().length).to.eq(36);
expect(realm.generateClientId(() => 'abcd')).to.eq('abcd');
}); });
}); });