loopback-socket
Version:
Loopback module for create Socket.io connections and allow call methods and make subscriptions
145 lines (120 loc) • 2.85 kB
Markdown
# LoopbackSocket Sample with AngularJS
## Installation
```
npm install
bower install
```
## Start
```
node .
```
## Relevants codes
### Server side
#### Starting
```js
// server/server.js
// ...
const loopbackSocket = LoopbackSocket.get('myapp');
const socketServer = io(handler);
loopbackSocket.start(socketServer);
// ...
```
#### Authentication
```js
// server/models/my-user.js
// ...
const loopbackSocket = LoopbackSocket.get('myapp');
loopbackSocket.auth({ model: MyUser, method: 'authenticate', });
MyUser.authenticate = function (socket, credentials) {
return Promise.resolve()
.then(() => {
if (!credentials) throw 'Socket Credentials not recieved';
return app.models.AccessToken.findOne({
where: {
userId: credentials.userId,
id: credentials.id
}
});
})
.then((token) => {
if (!token) throw 'Socket Token not found';
return MyUser.findById(token.userId);
})
.then((user) => {
if (!user) throw 'Socket User not found';
})
};
// ...
```
#### Methods definitions
```js
// server/models/my-user.js
// ...
loopbackSocket.defineMethod('getProfile', { model: MyUser, method: 'getProfile', });
MyUser.getProfile = function (socket, credentials, args) {
return app.models.MyUser.findById(credentials.userId);
};
// ...
// server/models/my-model.js
// ...
const loopbackSocket = LoopbackSocket.get('myapp');
loopbackSocket.defineMethod('getRecords', { model: MyModel, method: 'getRecords', });
MyModel.getRecords = function (socket, credentials, args) {
return MyModel.find({
skip: args.skip,
limit: args.limit,
});
};
// ...
```
### Client side
#### AngularJS Digest creator callback
```
.service('Handler', function () {
return ($scope, cb) => {
return function () {
const args = arguments;
$scope.$apply(() => {
cb.apply(null, args);
});
};
};
})
```
#### Sockect events handlers
```js
.service('CustomSocket', function (Handler) {
return ($scope, url, token) => {
const socket = io.connect(url);
socket.authed = null;
socket.on('connect', Handler($scope, () => {
socket.emit('authentication', {
id: token.id,
userId: token.userId,
});
}));
socket.on('authenticated', Handler($scope, () => {
socket.authed = true;
}));
socket.on('unauthorized', Handler($scope, () => {
socket.authed = false;
}));
socket.on('disconnected', Handler($scope, () => {
socket.authed = null;
}));
return socket;
}
})
```
#### Login and socket connection
```js
$scope.promiseLogin = MyUser.login($scope.credentials).$promise
.then((response) => {
token = response;
$scope.socket = socket = CustomSocket($scope, 'http://localhost:3000', token);
socket.authed = null;
})
.finally(() => {
delete $scope.promiseLogin;
});
```