socketio.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. if (LOG_HOOKS) {
  65. console.log(
  66. "[app socketio] [app:mounted]",
  67. import.meta.server ? "server" : "client"
  68. )
  69. }
  70. const {
  71. $socketio: { socket }
  72. } = useNuxtApp()
  73. // useEventHandlers()
  74. if (LOG_LISTENERS) {
  75. console.log("[listeners]")
  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. "app:rendered": () => {
  84. if (LOG_HOOKS) {
  85. console.log(
  86. "[app socketio] [app:rendered]",
  87. import.meta.server ? "server" : "client"
  88. )
  89. }
  90. useNuxtApp().$socketio.socket.disconnect()
  91. }
  92. },
  93. env: {
  94. // Set this value to `false` if you don't want the plugin to run when rendering server-only or island components.
  95. islands: true
  96. }
  97. })