Skip to content

Instantly share code, notes, and snippets.

@tuongaz
Last active March 10, 2016 04:46
Show Gist options
  • Save tuongaz/a2ba0911cd43d9a6496c to your computer and use it in GitHub Desktop.
Save tuongaz/a2ba0911cd43d9a6496c to your computer and use it in GitHub Desktop.
Layer Chat
import {Injectable, Inject} from 'angular2/core';
import {Http, HTTP_PROVIDERS, Headers} from 'angular2/http';
import 'rxjs/add/operator/map';
import {Observable, Subject} from 'rxjs';
import * as layer from 'layer-websdk';
import * as _ from 'lodash';
export class Layer {
layerClient: layer.Client;
http: Http;
participants: any;
ready: boolean;
messageStream: Subject<any>;
constructor(layerAppId, participants, http: Http) {
this.http = http;
this.ready = false;
this.participants = participants;
this.layerClient = new layer.Client({
appId: layerAppId
});
this.onReady(() => {
var ws = new WebSocket('wss://api.layer.com/websocket?session_token=' + this.layerClient.sessionToken,
'layer-1.0');
this.messageStream = Observable.fromEvent(ws, 'message').filter(event => {
var message = JSON.parse(event.data);
return message.type == 'change';
}).map(event => JSON.parse(event.data).body);
});
}
getMessageStream() {
return this.messageStream;
}
login(getToken) {
this.layerClient.on('challenge', event => {
getToken(event.nonce)
.subscribe(token => {
event.callback(token);
}, error => {
console.log(error);
})
});
}
onReady(callback) {
if (!!this.ready) {
callback;
} else {
this.layerClient.on('ready', callback);
}
}
getConversation() {
return this._get('https://api.layer.com/conversations')
.map(conversations => {
var items = conversations.filter(conversation => _.isEqual(this.participants, conversation.participants));
if (items) {
return _.first(items);
}
return null;
});
}
getMessages(conversation) {
return this._get(conversation.messages_url);
}
sendMessage(message) {
var conversation = this.layerClient.createConversation({
participants: this.participants,
distinct: true
});
var messagePart = new layer.MessagePart({
mimeType: 'text/plain',
body: message
});
conversation.createMessage({ parts: [messagePart] }).send();
}
private _get(url) {
var headers = new Headers();
headers.append('Accept', 'application/vnd.layer+json; version=1.0');
headers.append('Authorization', 'Layer session-token=\'' + this.layerClient.sessionToken + '\'');
return this.http.get(url, { headers: headers }).map(res => res.json());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment