Как использовать методы многопользовательского чата xmpp в приложении ionic 3?
Я новичок в xmpp server, и мне нужно развивать чат-связь по протоколу xmpp в моем приложении ionic 3.
В настоящее время я использовал параметры этого сервера:
openFire 4.0.4: легко устанавливается и работает нормально, но получает ошибку в методах xmpp muc.
Я интегрировал службы xmpp, используя https://github.com/junglestory/xmpp-ionic3 в моем проекте, но я получаю ошибку от всех методов xmpp muc, таких как ошибка на изображении ниже:
введите описание изображения здесь
Мой код:
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Events } from 'ionic-angular';
import {Strophe} from "strophe";
declare var Strophe:any;
export class Message {
id: String;
senderId: String;
text: String;
time: String;
}
@Injectable()
export class XMPPService {
private dismissObserver: any;
public dismiss: any;
private BOSH_SERVICE: string = "https://dev.entelroaming.gearlabs.cl/http-bind/";
private CONFERENCE_SERVICE: string = "conference.dev.entelroaming.gearlabs.cl";
private connection: Strophe.Connection;
private roomName: string = "";
constructor(public events: Events) {
this.dismissObserver = null;
this.dismiss = Observable.create(observer => {
console.log("xmpp observer", observer);
this.dismissObserver = observer;
});
}
/*Function
Connects the client from the Jabber server.
Parameters:
(String) jid - Jabber id.
(String) host - Host name.
(String) pass - Password.
Returns:
*/
login(jid, host, pass) {
console.log("login jid", jid);
console.log("login host", host);
console.log("login pass", pass);
this.connection = new Strophe.Connection(this.BOSH_SERVICE, { 'keepalive': true });
this.connection.connect(jid + '@' + host, pass, (status)=>{
console.log("xmpp status", status);
this.onConnect(status);
});
}
/*Function
Disconnects the client from the Jabber server.
Parameters:
Returns:
*/
logout() {
console.log("logout the xmpp");
this.connection.options.sync = true; // Switch to using synchronous requests since this is typically called onUnload.
this.connection.flush();
this.connection.disconnect();
}
/*Function
Queries a room for a list of occupants
Parameters:
Returns:
iq - Room info.
*/
allRoster() {
console.log("allRoster xmpp service");
console.log("1", this.connection);
this.connection.muc.init(this.connection);
return new Promise<any>(resolve => {
this.connection.muc.queryOccupants(this.CONFERENCE_SERVICE, function (msg) {
let items = [];
let rosters = msg.querySelectorAll('item');
rosters.forEach(function(roster) {
console.log("xmpp roster", roster);
items.push({
id: roster.getAttribute("jid"),
name: roster.getAttribute("name") || roster.getAttribute("jid"),
lastText: 'Available to Chat',
avata: 'assets/imgs/ben.png'
});
console.log("xmpp items", items);
});
resolve(items);
}, function (err) {
console.log("rooms - error: " + err);
console.log(err);
})
});
}
/*Function
Create multi-user chat room.
Parameters:
(String) roomName - The multi-user chat room name.
Returns:
id - the unique id used to create the chat room.
*/
create(roomName) {
let nick = this.getNick();
console.log("xmpp nick", nick);
let roomId = this.timestamp();
console.log("xmpp roomId", roomId);
let roomJid = roomId + "@" + this.CONFERENCE_SERVICE
console.log("xmpp roomJid", roomJid);
let room = roomJid + "/" + nick;
console.log("xmpp room", room);
this.connection.muc.setStatus(roomId + "@" + this.CONFERENCE_SERVICE, nick, null, null);
this.connection.muc.createInstantRoom(room, roomName,
function (status) {
console.log("Succesfully created ChatRoom", status);
}, function (err) {
console.log("Error creating ChatRoom", status);
console.log(err);
});
this.connection.muc.setRoomName(roomId + "@" + this.CONFERENCE_SERVICE, nick);
this.setRoomName(roomName);
return roomJid;
}
/*Function
Join a multi-user chat room
Parameters:
(String) roomJid - The multi-user chat room to join.
Returns:
*/
join(roomJid) {
console.log("xmpp join roomJid", roomJid);
this.connection.muc.join(roomJid, this.getNick(), null, null, null, null, null, null);
}
/*Function
Send the message in the chat room.
Parameters:
(String) roomJid - The multi-user chat room id.
(String) message - Send message.
Returns:
*/
sendMessage(roomJid, message) {
console.log("xmpp sendMessage roomJid", roomJid);
console.log("xmpp sendMessage message", message);
this.connection.muc.groupchat(roomJid, message, null);
}
/*Function
Send a mediated invitation.
Parameters:
(String) roomJid - The multi-user chat room name.
(String) id - The invitation's receiver.
Returns:
*/
invite(roomJid, id) {
console.log("xmpp invite roomJid", roomJid);
console.log("xmpp invite id", id);
if (id !== "") {
this.connection.muc.invite(roomJid, id, "hi?");
}
}
// Create timestamp for multi-user chat room id.
timestamp() {
return Math.floor(new Date().getTime() / 1000);
}
// Set room name.
setRoomName(roomName) {
console.log("xmpp setRoomName roomName", roomName);
this.roomName = roomName;
}
// Get room Name
getRoomName() {
return this.roomName;
}
// Parse nickname of jabber id.
getNick() {
let nick = this.connection.jid;
nick = nick.substring(0, nick.indexOf('@'));
return nick;
}
/*Function
Connect XMPP.
Parameters:
Returns:
status - Status of connection.
*/
onConnect(status) {
console.log("xmpp onConnect status", status);
var self = this;
switch (status) {
case Strophe.Status.CONNECTED:
console.log("status 1", status);
console.log('[Connection] Strophe is Connected');
this.connection.addHandler((msg)=>{ self.onMessage(msg); return true;}, null, 'message', null, null, null);
this.connection.addHandler((stanza)=>{self.onSubscriptionRequest(stanza)}, null, "presence", "subscribe");
this.dismissObserver.next("login");
break;
case Strophe.Status.ATTACHED:
console.log("status 2", status);
console.log('[Connection] Strophe is Attached');
break;
case Strophe.Status.DISCONNECTED:
console.log("status 3", status);
console.log('[Connection] Strophe is Disconnected');
this.dismissObserver.next("logout");
break;
case Strophe.Status.AUTHFAIL:
console.log("status 4", status);
console.log('[Connection] Strophe is Authentication failed');
break;
case Strophe.Status.CONNECTING:
console.log("status 5", status);
console.log('[Connection] Strophe is Connecting');
break;
case Strophe.Status.DISCONNECTING:
console.log("status 6", status);
console.log('[Connection] Strophe is Disconnecting');
break;
case Strophe.Status.AUTHENTICATING:
console.log("status 7", status);
console.log('[Connection] Strophe is Authenticating');
break;
case Strophe.Status.ERROR:
case Strophe.Status.CONNFAIL:
console.log("status 8", status);
console.log('[Connection] Failed (' + status + ')');
break;
default:
console.log('[Connection] Unknown status received:', status);
break;
}
};
// Parse multi-chat room id.
getParseRoomJid(id) {
var pos = id.indexOf('/');
if (pos > 0) {
id = id.substring(0, pos);
}
return id;
}
// parse jabber id.
getParseID(id) {
var pos = id.indexOf('/');
if (pos > 0) {
id = id.substring(pos+1, id.length);
}
return id;
}
//When a new message is recieved
onMessage(msg) {
let message: Message;
let from = msg.getAttribute('from');
let type = msg.getAttribute('type');
let elems = msg.getElementsByTagName('body');
var delays = msg.getElementsByTagName('delay');
if (type == "groupchat" && elems.length > 0) {
let body = elems[0];
let textMsg = Strophe.getText(body);
//let currentDate: Date;
let currentDate = new Date();
let date = currentDate.toLocaleTimeString().replace(/:\d+ /, ' ');
// history
if (delays.length > 0) {
let delay = delays[0];
date = delay.getAttribute('stamp');
}
message = {
id: this.getParseRoomJid(from),
senderId: this.getParseID(from),
text: textMsg,
time: date
};
}
this.events.publish('message', message);
};
onSubscriptionRequest(stanza) {
console.log(stanza);
}
}
Я хочу, чтобы решение успешно интегрировалось с сервисами xmpp в ionic 3. Пожалуйста, дайте какие-либо предложения здесь как можно скорее, это было бы очень признательно.