Ein Projekt das es ermöglicht Beerpong über das Internet von zwei unabhängigen positionen aus zu spielen. Entstehung im Rahmen einer Praktikumsaufgabe im Fach Interaktion.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.js 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*!
  2. * on-finished
  3. * Copyright(c) 2013 Jonathan Ong
  4. * Copyright(c) 2014 Douglas Christopher Wilson
  5. * MIT Licensed
  6. */
  7. /**
  8. * Module exports.
  9. */
  10. module.exports = onFinished;
  11. module.exports.isFinished = isFinished;
  12. /**
  13. * Module dependencies.
  14. */
  15. var first = require('ee-first')
  16. /**
  17. * Variables.
  18. */
  19. /* istanbul ignore next */
  20. var defer = typeof setImmediate === 'function'
  21. ? setImmediate
  22. : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
  23. /**
  24. * Invoke callback when the response has finished, useful for
  25. * cleaning up resources afterwards.
  26. *
  27. * @param {object} msg
  28. * @param {function} listener
  29. * @return {object}
  30. * @api public
  31. */
  32. function onFinished(msg, listener) {
  33. if (isFinished(msg) !== false) {
  34. defer(listener)
  35. return msg
  36. }
  37. // attach the listener to the message
  38. attachListener(msg, listener)
  39. return msg
  40. }
  41. /**
  42. * Determine is message is already finished.
  43. *
  44. * @param {object} msg
  45. * @return {boolean}
  46. * @api public
  47. */
  48. function isFinished(msg) {
  49. var socket = msg.socket
  50. if (typeof msg.finished === 'boolean') {
  51. // OutgoingMessage
  52. return Boolean(!socket || msg.finished || !socket.writable)
  53. }
  54. if (typeof msg.complete === 'boolean') {
  55. // IncomingMessage
  56. return Boolean(!socket || msg.complete || !socket.readable)
  57. }
  58. // don't know
  59. return undefined
  60. }
  61. /**
  62. * Attach the listener to the message.
  63. *
  64. * @param {object} msg
  65. * @return {function}
  66. * @api private
  67. */
  68. function attachListener(msg, listener) {
  69. var attached = msg.__onFinished
  70. var socket = msg.socket
  71. // create a private single listener with queue
  72. if (!attached || !attached.queue) {
  73. attached = msg.__onFinished = createListener(msg)
  74. // finished on first event
  75. first([
  76. [socket, 'error', 'close'],
  77. [msg, 'end', 'finish'],
  78. ], attached)
  79. }
  80. attached.queue.push(listener)
  81. }
  82. /**
  83. * Create listener on message.
  84. *
  85. * @param {object} msg
  86. * @return {function}
  87. * @api private
  88. */
  89. function createListener(msg) {
  90. function listener(err) {
  91. if (msg.__onFinished === listener) msg.__onFinished = null
  92. if (!listener.queue) return
  93. var queue = listener.queue
  94. listener.queue = null
  95. for (var i = 0; i < queue.length; i++) {
  96. queue[i](err)
  97. }
  98. }
  99. listener.queue = []
  100. return listener
  101. }