socketio.js 2.9 KB

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