ein-websocket.el 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. ;;; ein-websocket.el --- Wrapper of websocket.el
  2. ;; Copyright (C) 2012- Takafumi Arakaki
  3. ;; Author: Takafumi Arakaki <aka.tkf at gmail.com>
  4. ;; This file is NOT part of GNU Emacs.
  5. ;; ein-websocket.el is free software: you can redistribute it and/or modify
  6. ;; it under the terms of the GNU General Public License as published by
  7. ;; the Free Software Foundation, either version 3 of the License, or
  8. ;; (at your option) any later version.
  9. ;; ein-websocket.el is distributed in the hope that it will be useful,
  10. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. ;; GNU General Public License for more details.
  13. ;; You should have received a copy of the GNU General Public License
  14. ;; along with ein-websocket.el. If not, see <http://www.gnu.org/licenses/>.
  15. ;;; Commentary:
  16. ;;
  17. ;;; Code:
  18. (eval-when-compile (require 'cl))
  19. (require 'websocket)
  20. (require 'ein-core)
  21. (defstruct ein:$websocket
  22. "A wrapper object of `websocket'.
  23. `ein:$websocket-ws' : an instance returned by `websocket-open'
  24. `ein:$websocket-onmessage' : function called with (PACKET &rest ARGS)'
  25. `ein:$websocket-onclose' : function called with (WEBSOCKET &rest ARGS)'
  26. `ein:$websocket-onopen' : function called with (&rest ARGS)'
  27. `ein:$websocket-onmessage-args' : optional arguments for onmessage callback'
  28. `ein:$websocket-onclose-args' : optional arguments for onclose callback'
  29. `ein:$websocket-onopen-args' : optional arguments for onopen callback'
  30. `ein:$websocket-closed-by-client' : t/nil'
  31. "
  32. ws
  33. onmessage
  34. onmessage-args
  35. onclose
  36. onclose-args
  37. onopen
  38. onopen-args
  39. closed-by-client)
  40. (defun ein:websocket (url &optional onmessage onclose onopen
  41. onmessage-args onclose-args onopen-args)
  42. (let ((websocket (make-ein:$websocket
  43. :onmessage onmessage
  44. :onclose onclose
  45. :onopen onopen
  46. :onmessage-args onmessage-args
  47. :onclose-args onclose-args
  48. :onopen-args onopen-args))
  49. (ws (websocket-open
  50. url
  51. :on-open
  52. (lambda (ws)
  53. (let ((websocket (websocket-client-data ws)))
  54. (ein:aif (ein:$websocket-onopen websocket)
  55. (apply it (ein:$websocket-onopen-args websocket)))))
  56. :on-message
  57. (lambda (ws frame)
  58. (let ((websocket (websocket-client-data ws))
  59. (packet (websocket-frame-payload frame)))
  60. (ein:aif (ein:$websocket-onmessage websocket)
  61. (when packet
  62. (apply it packet
  63. (ein:$websocket-onmessage-args websocket))))))
  64. :on-close
  65. (lambda (ws)
  66. (let ((websocket (websocket-client-data ws)))
  67. (ein:aif (ein:$websocket-onclose websocket)
  68. (apply it websocket
  69. (ein:$websocket-onclose-args websocket))))))))
  70. (setf (websocket-client-data ws) websocket)
  71. (setf (ein:$websocket-ws websocket) ws)
  72. websocket))
  73. (defun ein:websocket-open-p (websocket)
  74. (eql (websocket-ready-state (ein:$websocket-ws websocket)) 'open))
  75. (defun ein:websocket-send (websocket text)
  76. (websocket-send-text (ein:$websocket-ws websocket) text))
  77. (defun ein:websocket-close (websocket)
  78. (setf (ein:$websocket-closed-by-client websocket) t)
  79. (websocket-close (ein:$websocket-ws websocket)))
  80. (provide 'ein-websocket)
  81. ;;; ein-websocket.el ends here