WebSocketMock = require('./websocket.mock.js').WebSocketMock Stomp = require('../../lib/stomp.js').Stomp console = require 'console' class StompServerMock extends WebSocketMock # WebSocketMock handlers handle_send: (msg) => @stomp_dispatch(Stomp.Frame.unmarshall(msg).frames[0]) handle_close: => @_shutdown() handle_open: => @stomp_init() @_accept() # Stomp server implementation stomp_init: -> @transactions = {} @subscriptions = {} @messages = [] stomp_send: (command, headers, body=null) -> @_respond(Stomp.Frame.marshall(command, headers, body)) stomp_send_receipt: (frame) -> if frame.headers.message? @stomp_send("ERROR", {'receipt-id': frame.headers['receipt-id'], 'message': frame.headers.message}) else @stomp_send("RECEIPT", {'receipt-id': frame.headers['receipt-id']}) stomp_send_message: (destination, subscription, message_id, body) -> @stomp_send("MESSAGE", { 'destination': destination, 'message-id': message_id, 'subscription': subscription}, body) stomp_dispatch: (frame) -> handler = "stomp_handle_#{frame.command.toLowerCase()}" if this[handler]? this[handler](frame) if frame.receipt @stomp_send_receipt(frame) else console.log "StompServerMock: Unknown command: #{frame.command}" stomp_handle_connect: (frame) -> @session_id = Math.random() @stomp_send("CONNECTED", {'session': @session_id}) stomp_handle_begin: (frame) -> @transactions[frame.headers.transaction] = [] stomp_handle_commit: (frame) -> transaction = @transactions[frame.headers.transaction] for frame in transaction @messages.push(frame.body) delete @transactions[frame.headers.transaction] stomp_handle_abort: (frame) -> delete @transactions[frame.headers.transaction] stomp_handle_send: (frame) -> if frame.headers.transaction @transactions[frame.headers.transaction].push(frame) else @messages.push(frame) stomp_handle_subscribe: (frame) -> sub_id = frame.headers.id or Math.random() cb = (id, body) => @stomp_send_message(frame.headers.destination, sub_id, id, body) @subscriptions[sub_id] = [frame.headers.destination, cb] stomp_handle_unsubscribe: (frame) -> if frame.headers.id in Object.keys(@subscriptions) delete @subscriptions[frame.headers.id] else frame.headers.message = "Subscription does not exist" stomp_handle_disconnect: (frame) -> @_shutdown() # Test helpers test_send: (sub_id, message) -> msgid = 'msg-' + Math.random() @subscriptions[sub_id][1](msgid, message) exports.StompServerMock = StompServerMock