socketio.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { io } from "socket.io-client"
  2. const LOG_CONNECTIONS = false
  3. const LOG_EVENTS = true
  4. const LOG_LISTENERS = false
  5. const LOG_HOOKS = false
  6. const getContext = () => (import.meta.server ? "server" : "client")
  7. // noinspection JSUnusedGlobalSymbols
  8. export default defineNuxtPlugin({
  9. name: "socketio",
  10. enforce: "pre",
  11. async setup() {
  12. const { isSignedIn, user } = useAuthClient()
  13. const config = useRuntimeConfig()
  14. const socket = io(config.public.websocketHost)
  15. const isConnected = ref(false)
  16. const transport = ref("N/A")
  17. if (socket.connected) {
  18. onConnect()
  19. }
  20. socket.on("connect", onConnect)
  21. socket.on("disconnect", onDisconnect)
  22. if (LOG_EVENTS) {
  23. // log all outgoing events
  24. socket.onAnyOutgoing((eventName, ...args) =>
  25. console.log("[app socketio] [outgoing]", getContext(), eventName, args)
  26. )
  27. }
  28. function onConnect() {
  29. isConnected.value = true
  30. transport.value = socket.io.engine.transport.name
  31. socket.io.engine.on("upgrade", (rawTransport) => {
  32. transport.value = rawTransport.name
  33. })
  34. if (LOG_CONNECTIONS) {
  35. console.log(
  36. "[app socketio] [onConnect]",
  37. getContext(),
  38. transport.value,
  39. isSignedIn.value ? user.value.username : ""
  40. )
  41. }
  42. }
  43. function onDisconnect() {
  44. if (LOG_CONNECTIONS) {
  45. console.log(
  46. "[app socketio] [onDisconnect]",
  47. getContext(),
  48. transport.value,
  49. isSignedIn.value ? user.value.username : ""
  50. )
  51. }
  52. isConnected.value = false
  53. transport.value = "N/A"
  54. socket.off("connect")
  55. socket.off("disconnect")
  56. }
  57. return {
  58. provide: {
  59. socketio: { socket, isConnected, transport }
  60. }
  61. }
  62. },
  63. hooks: {
  64. "app:mounted": () => {
  65. return useNuxtApp().runWithContext(() => {
  66. const {
  67. $socketio: { socket }
  68. } = useNuxtApp()
  69. if (LOG_HOOKS) {
  70. console.log("[app socketio] [app:mounted]", getContext())
  71. }
  72. useEventHandlers()
  73. if (LOG_LISTENERS) {
  74. console.log("[listeners]")
  75. // noinspection JSUnresolvedReference
  76. _forIn(socket._callbacks, (callbacks, event) => {
  77. console.log(event, callbacks)
  78. })
  79. }
  80. // reconnect on signin/signout
  81. watch(useAuthClient().isSignedIn, () => socket.disconnect().connect())
  82. })
  83. },
  84. "app:rendered": () => {
  85. if (LOG_HOOKS) {
  86. console.log("[app socketio] [app:rendered]", getContext())
  87. }
  88. useNuxtApp().$socketio.socket.disconnect()
  89. }
  90. },
  91. env: {
  92. // Set this value to `false` if you don't want the plugin to run when rendering server-only or island components.
  93. islands: true
  94. }
  95. })