├── .gitignore ├── LICENSE ├── README.md ├── example.js ├── lib.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Tarang Patel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## DDP Server 2 | 3 | DDP-Server is a nodejs based DDP Server. 4 | 5 | Usage, 6 | 7 | ```js 8 | var DDPServer = require('ddp-server'); 9 | var ddp = new DDPServer({}); 10 | 11 | ddp.methods({ 12 | test: function() { 13 | return true; 14 | } 15 | }); 16 | 17 | 18 | ddp.listen(4000); 19 | ``` 20 | 21 | Optionally, server could be passed as parameter, 22 | 23 | ```js 24 | var http = require('http'); 25 | var DDPServer = require('ddp-server'); 26 | 27 | var server = http.createServer(); 28 | var ddp = new DDPServer({server: server}); 29 | 30 | // define methods... 31 | 32 | server.listen(400); 33 | ``` 34 | 35 | You can then connect to it using a ddp client such as `ddp`. 36 | -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | var server = new DDPServer({}); 2 | 3 | server.methods({ 4 | test: function(a, b) { 5 | console.log(a, b); 6 | } 7 | }) 8 | 9 | server.listen(13000); -------------------------------------------------------------------------------- /lib.js: -------------------------------------------------------------------------------- 1 | var DDPServer = function(opts) { 2 | 3 | var WebSocket = require('faye-websocket'), 4 | http = require('http'), 5 | _ = require('underscore'), 6 | server = opts.server || http.createServer(), 7 | methods = {}, 8 | self = this; 9 | 10 | if (opts.methods) _.extend(methods, opts.methods); 11 | 12 | server.on('upgrade', function(request, socket, body) { 13 | function sendMessage(data) { 14 | ws.send(JSON.stringify(data)); 15 | } 16 | 17 | if (WebSocket.isWebSocket(request)) { 18 | var ws = new WebSocket(request, socket, body); 19 | var session_id = new Date().getTime(); 20 | 21 | ws.on('message', function(event) { 22 | var data = JSON.parse(event.data); 23 | 24 | switch (data.msg) { 25 | case "connect": 26 | { 27 | sendMessage({ 28 | server_id: 0 29 | }); 30 | 31 | sendMessage({ 32 | msg: "connected", 33 | session_id: session_id 34 | }); 35 | 36 | break; 37 | } 38 | 39 | case "method": 40 | { 41 | if (data.method in methods) { 42 | try { 43 | var result = methods[data.method].apply(this, data.params); 44 | 45 | sendMessage({ 46 | result: result, 47 | id: data.id, 48 | msg: "result" 49 | }); 50 | } catch (e) { 51 | sendMessage({ 52 | id: data.id, 53 | error: { 54 | error: 500, 55 | reason: "Internal Server Error", 56 | errorType: "Meteor.Error" 57 | } 58 | }); 59 | } 60 | } else { 61 | console.log("Error method " + data.method + " not found"); 62 | 63 | sendMessage({ 64 | id: data.id, 65 | error: { 66 | error: 404, 67 | reason: "Method not found", 68 | errorType: "Meteor.Error" 69 | } 70 | }); 71 | } 72 | 73 | break; 74 | } 75 | 76 | default: 77 | { 78 | 79 | } 80 | } 81 | }); 82 | 83 | ws.on('close', function(event) { 84 | console.log('close', event.code, event.reason); 85 | ws = null; 86 | session_id = null; 87 | }); 88 | } 89 | }); 90 | 91 | this.listen = function(port) { 92 | // assumed that .listen() should be called outside, if server is passed in options 93 | if (opts.server) { 94 | return; 95 | } 96 | 97 | server.listen(port); 98 | }; 99 | 100 | this.methods = function(newMethods) { 101 | for (var key in newMethods) { 102 | if (key in methods) throw new Error(500, "A method named " + key + " already exists"); 103 | } 104 | 105 | _.extend(methods, newMethods); 106 | }; 107 | }; 108 | 109 | module.exports = DDPServer; 110 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ddp-server", 3 | "version": "0.5.2", 4 | "description": "A ddp server for nodejs", 5 | "main": "lib.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "http://github.com/Tarang/ddp-server" 12 | }, 13 | "keywords": [ 14 | "ddp", 15 | "server" 16 | ], 17 | "author": "Tarang Patel", 18 | "license": "MIT", 19 | "bugs": { 20 | "url": "https://github.com/Tarang/ddp-server/issues" 21 | }, 22 | "homepage": "https://github.com/Tarang/DDP-Server", 23 | "dependencies": { 24 | "faye-websocket": "^0.9.0", 25 | "underscore": "^1.7.0" 26 | } 27 | } 28 | --------------------------------------------------------------------------------