Newer
Older
zdravko iliev
committed
import '@feathersjs/transport-commons';
import { HookContext } from '@feathersjs/feathers';
import { Application } from './declarations';
export default function (app: Application): void {
if (typeof app.channel !== 'function') {
zdravko iliev
committed
// If no real-time functionality has been configured just return
return;
}
app.on('connection', (connection: any): void => {
// On a new real-time connection, add it to the anonymous channel
app.channel('anonymous').join(connection);
});
app.on('login', (authResult: any, { connection }: any): void => {
// connection can be undefined if there is no
// real-time connection, e.g. when logging in via REST
if (connection) {
zdravko iliev
committed
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Obtain the logged in user from the connection
// const user = connection.user;
// The connection is no longer anonymous, remove it
app.channel('anonymous').leave(connection);
// Add it to the authenticated user channel
app.channel('authenticated').join(connection);
// 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); }
// If the user has joined e.g. chat rooms
// if(Array.isArray(user.rooms)) user.rooms.forEach(room => app.channel(`rooms/${room.id}`).join(connection));
// Easily organize users by email and userid for things like messaging
// app.channel(`emails/${user.email}`).join(connection);
// app.channel(`userIds/${user.id}`).join(connection);
}
});
// eslint-disable-next-line @typescript-eslint/no-unused-vars
app.publish((data: any, hook: HookContext) => {
// Here you can add event publishers to channels set up in `channels.ts`
// To publish only for a specific event use `app.publish(eventname, () => {})`
// console.log('Publishing all events to all authenticated users. See `channels.ts` and https://docs.feathersjs.com/api/channels.html for more information.'); // eslint-disable-line
// e.g. to publish all service events to all authenticated users use
return app.channel('authenticated');
});
// 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'));
// 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}`)
// ];
// });
}