UNPKG

nuxt-socket-io

Version:

Socket.io client and server module for Nuxt. Just plug it in and GO

340 lines (308 loc) 9.09 kB
import { Module } from '@nuxt/types'; import * as SocketIOClient from 'socket.io-client'; import Vue from 'vue'; /** * The format of each entry in mutations can be: * * 1. A single name string - the event name acts as the mutation * 2. A string with a double-dashed arrow - the left side of the arrow is the event name, the right side is the mutation */ type MutationNotation = string; /** * The format of each entry in actions can be: * * 1. A single name string - the event name acts as the action * 2. A string with a double-dashed arrow - the left side of the arrow is the event name, the right side is the action */ type ActionNotation = MutationNotation; /** * Similar to mutations and actions, but the placements of event names and mutations are reversed. * * The format of each entry in emitBacks can be: * * 1. A single name string - the event name acts as the mutation * 2. A string with a double-dashed arrow - the **right** side of the arrow is the event name, the **left** side is the mutation */ type EmitBackNotation = MutationNotation; /** * Options to let you sync incoming events to a Vuex store and emit events * on Vuex store changes. These options will override settings from your Nuxt * configuration. * https://nuxt-socket-io.netlify.app/configuration#vuex-options-per-socket */ interface NuxtSocketVueOptions { mutations?: Array<MutationNotation>; actions?: Array<ActionNotation>; emitBacks?: Array<EmitBackNotation>; } /** * The format of each entry in emitters can be: * * 1. A single name string - the method name on [this] component that emits an event of the same name * 2. A string with the following format: * 'preEmit hook] componentMethod + msg --> componentProp [postRx hook' * * Hooks are optional. calling this[componentMethod] will send the event [componentMethod] * with data this[msg]. It will save the response to this[componentProp] * If the preEmit hook returns false, emitting will be canceled. */ type EmitterNotation = string; /** * The format of each entry in listeners can be: * * 1. A single name string - the event name to listen to, whose data will be * saved in this[eventName] * 2. A string with the following format: * 'preHook] listenEvent --> componentProp [postRx hook' * * Hooks are optional. When listenEvent received, it will be saved to this[componentProp] */ type ListenerNotation = string; /** * Options to let you configure emitters, listeners and/or * emitBacks for a given namespace (a.k.a. "channel") * https://nuxt-socket-io.netlify.app/configuration#namespace-configuration */ interface NuxtSocketNspCfg { emitters?: Array<EmitterNotation>; listeners?: Array<ListenerNotation>; emitBacks?: Array<EmitBackNotation>; } /** * Kiss API format used by Nuxt Socket Dynamic API feature. * https://medium.com/swlh/nuxt-socket-io-the-magic-of-dynamic-api-registration-9af180383869 */ interface NuxtSocketKissApi { label: string; version: number; evts?: Record<string, any>; methods?: Record<string, any>; } /** * Options to use for a socket.io server you want the module * to start * https://nuxt-socket-io.netlify.app/configuration#automatic-io-server-registration */ interface NuxtSocketIoServerOpts { /** * Path to IO service used for clients that connect to "/" * @default '[projectRoot]/server/io.js' */ ioSvc?: string; /** * Directory containing IO services for clients that connect * to the namespace matching the file name * Example: a file "namespace1.js" in this folder will listen * clients that connect to "/namespace1" * * @default '[projectRoot]/server/io' */ nspDir?: string; /** * Socket.io server host * @default 'localhost' */ host?: string; /** * Socket.io server port * @default 3000 */ port?: number; /** * Auto close socket.io server (default: true) */ teardown?: boolean; } export interface NuxtSocketOpts extends Partial<SocketIOClient.ManagerOptions> { /** Name of the socket. If omitted, the default socket will be used. */ name?: string; /** * The channel (a.k.a namespace) to connect to. * @default '' */ channel?: string; /** Specifies whether to enable or disable the "auto-teardown" feature * (see section below). * @default true */ teardown?: boolean; /** * Specifies whether to persist this socket so it can be reused * (see [vuexModule](https://nuxt-socket-io.netlify.app/vuexModule)). * @default false */ persist?: boolean | string; /** Specifies the property in [this] component that will be used * to contain the socket status (referring to an object). * @default 'socketStatus' */ statusProp?: string; /** Specifies the timeout in milliseconds for an emit event, * after which waiting for the emit response will be canceled. * @default undefined */ emitTimeout?: number; /** * Specifies the property in [this] component that will be used * to contain emit errors (see section below). * (referring to this.emitErrors, an object of arrays) * @default 'emitErrors' */ emitErrorsProp?: string; /** * Namespace config. Specifies emitters, listeners, and/or emitBacks. */ namespaceCfg?: NuxtSocketNspCfg; /** * @default 'ioApi' */ ioApiProp?: string; /** * @default 'ioData' */ ioDataProp?: string; /** * @default [] */ apiIgnoreEvts?: Array<string>; serverAPI?: NuxtSocketKissApi; clientAPI?: NuxtSocketKissApi; vuex?: NuxtSocketVueOptions; } interface NuxtSocketConfig { /** * Recommended for all sockets, but required for any non-default socket. */ name?: string; /** * URL for the Socket.IO server. * @default window.location */ url?: string; /** * Determines which socket is used as the default when creating new sockets * with `nuxtSocket()` * @default true // for the first entry in the array */ default?: boolean; /** * Options to let you sync incoming events to a Vuex store and emit events * on Vuex store changes. These options will override settings from your Nuxt * configuration. */ vuex?: NuxtSocketVueOptions; /** * Socket.IO namespaces configuration. Supports an arrow syntax in each entry * to help describe the flow (with pre/post hook designation support too). */ namespaces?: Record<string, NuxtSocketNspCfg>; } interface NuxtSocketRuntimeConfig extends NuxtSocketConfig { /** * Name is required when using public/privateRuntimeConfig since the plugin * uses it to merge the configurations together. */ name: string; } interface NuxtSocketIoOptions { /** * Minimum one socket required. */ sockets: Array<NuxtSocketConfig>; /** * Options for starting a socket.io server * and automatically registering socket io service(s). * By default, registers services in * - [projectRoot]/server/io.js * - [projectRoot]/server/io/*.js */ server?: boolean | NuxtSocketIoServerOpts /** * Console warnings enabled/disabled * @default true */ warnings?: boolean; /** * Console info enabled/disabled * @default true */ info?: boolean; } interface NuxtSocketIoRuntimeOptions { /** * Minimum one socket required. */ sockets: Array<NuxtSocketRuntimeConfig>; /** * Options for starting a socket.io server * and automatically registering socket io service(s). * By default, registers services in * - [projectRoot]/server/io.js * - [projectRoot]/server/io/*.js */ server?: boolean | NuxtSocketIoServerOpts /** * Console warnings enabled/disabled * @default true */ warnings?: boolean; /** * Console info enabled/disabled * @default true */ info?: boolean; } interface NuxtSocket extends SocketIOClient.Socket { emitP: (evt: String, msg?: any) => Promise<any>; }; type Factory = (ioOpts: NuxtSocketOpts) => NuxtSocket; declare module 'vue/types/vue' { interface Vue { $nuxtSocket: Factory; } } declare module '@nuxt/types' { interface Configuration { /** * nuxt-socket-io configuration. * See https://nuxt-socket-io.netlify.app/configuration * for documentation. */ io?: NuxtSocketIoOptions; } interface NuxtOptionsRuntimeConfig { /** * nuxt-socket-io runtime configuration. * See https://nuxt-socket-io.netlify.app/configuration * for documentation. */ io?: NuxtSocketIoRuntimeOptions; } interface Context { $nuxtSocket: Factory; } } /* Nuxt 3 */ declare module '@nuxt/schema' { interface NuxtConfig { runtimeConfig?: { io?: NuxtSocketIoRuntimeOptions, public?: { io: NuxtSocketIoRuntimeOptions } }, io?: NuxtSocketIoOptions } } declare module '#app' { interface NuxtApp { $nuxtSocket: Factory; } } declare module '@vue/runtime-core' { interface ComponentCustomProperties { $nuxtSocket: Factory; } } /* --- */ export { NuxtSocket, NuxtSocketIoOptions, NuxtSocketIoRuntimeOptions }