Browse Source

Merge pull request #157 from ajmar/master

(feat): Allow passing in custom client ID generation function.
Alex Sosnovskiy 5 years ago
parent
commit
f3bb222609
4 changed files with 40 additions and 14 deletions
  1. 30 8
      README.md
  2. 1 1
      src/api/v1/public/index.ts
  3. 7 4
      src/models/realm.ts
  4. 2 1
      test/models/realm.ts

+ 30 - 8
README.md

@@ -36,8 +36,13 @@ $> peerjs --port 9000 --key peerjs --path /myapp
 
 Or, create a custom server:
 
+```bash
+$> npm install peerjs-server
+```
+
 ```javascript
-const { PeerServer } = require('peer');
+import {PeerServer} from 'peerjs-server';
+
 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.
 
 ```javascript
-const fs = require('fs');
-const { PeerServer } = require('peer');
+import fs from 'fs';
+import {PeerServer} from 'peerjs-server';
 
 const server = PeerServer({
   port: 9000,
@@ -74,17 +79,32 @@ The option is passed verbatim to the
 if it is truthy.
 
 ```javascript
-const { PeerServer } = require('peer');
+import {PeerServer} from 'peerjs-server';
+
 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
 
 ```javascript
-const express = require('express');
-const app = express();
-const { ExpressPeerServer } = require('peer');
+import express from 'express';
+import {ExpressPeerServer} from 'peerjs-server';
 
+const app = express();
 app.get('/', (req, res, next) => { res.send('Hello world!'); });
 
 // =======
@@ -102,7 +122,9 @@ app.use(options.path, peerserver);
 
 // == OR ==
 
-const server = require('http').createServer(app);
+import http from 'http';
+
+const server = http.createServer(app);
 const peerserver = ExpressPeerServer(server, options);
 
 app.use(options.path, peerserver);

+ 1 - 1
src/api/v1/public/index.ts

@@ -10,7 +10,7 @@ export default ({ config, realm }: {
   // Retrieve guaranteed random ID.
   app.get("/id", (_, res: express.Response) => {
     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.

+ 7 - 4
src/models/realm.ts

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

+ 2 - 1
test/models/realm.ts

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