<%- tplTsOnly([`import { App } from './app.interface'${sc}`, '']) %>
<%- tplExport('function (app) {', 'function (app: App) {') %>
  if (typeof app.channel !== 'function') {
    // If no real-time functionality has been configured just return
    return<%- sc %>
  }

  app.on('connection', (connection<%- tplTsOnly([`: any`]) -%>) => {
    // On a new real-time connection, add it to the anonymous channel
    app.channel('anonymous').join(connection)<%- sc %>
  })<%- sc %>

  app.on('login', (authResult<%- tplTsOnly([`: any`]) -%>, { connection }<%- tplTsOnly([`: any`]) -%>) => {
    // connection can be undefined if there is no
    // real-time connection, e.g. when logging in via REST
    if (connection) {
      // Obtain the logged in user from the connection
      // const user = connection.user<%- sc %>

      // The connection is no longer anonymous, remove it
      app.channel('anonymous').leave(connection)<%- sc %>

      // Add it to the authenticated user channel
      app.channel('authenticated').join(connection)<%- sc %>

      // Channels can be named anything and joined on any condition

      // E.g. to send real-time events only to admins use
      // if(user.isAdmin) { app.channel('admins').join(connection)<%- sc %> }

      // If the user has joined e.g. chat rooms
      // if(Array.isArray(user.rooms)) user.rooms.forEach(room => app.channel(`rooms/${room.id}`).join(channel))<%- sc %>

      // Easily organize users by email and userid for things like messaging
      // app.channel(`emails/${user.email}`).join(channel)<%- sc %>
      // app.channel(`userIds/$(user.id}`).join(channel)<%- sc %>
    }
  })<%- sc %>

  // <%- lintDisableNextLineUnused %>
  app.publish((data, hook) => {
    // Here you can add event publishers to channels set up in `channels.<%- js %>`
    // To publish only for a specific event use `app.publish(eventname, () => {})`

    // <%- lintDisableNextLine %>
    console.log('Publishing all events to all authenticated users. See `channels.<%- js %>` and https://docs.feathersjs.com/api/channels.html for more information.')<%- sc %>

    // e.g. to publish all service events to all authenticated users use
    return app.channel('authenticated')<%- sc %>
  })<%- sc %>

  // Here you can also add service specific event publishers
  // e.g. the publish the `users` service `created` event to the `admins` channel
  // app.service('users').publish('created', () => app.channel('admins'))<%- sc %>

  // With the userid and email organization from above you can easily select involved users
  // app.service('messages').publish(() => {
  //   return [
  //     app.channel(`userIds/${data.createdBy}`),
  //     app.channel(`emails/${data.recipientEmail}`)
  //   ]<%- sc %>
  // })<%- sc %>
}<%- tplJsOnly(sc) %>
