|
|
@@ -2,6 +2,7 @@ import Fingerprint2 from 'fingerprintjs2'; |
|
|
|
import axios from 'axios'; |
|
|
|
import Stomp from "stompjs"; |
|
|
|
|
|
|
|
|
|
|
|
class SzyxPushClient { |
|
|
|
|
|
|
|
|
|
|
@@ -16,12 +17,12 @@ class SzyxPushClient { |
|
|
|
this._user = null; |
|
|
|
|
|
|
|
this._client = null; |
|
|
|
this.socketOpen = false; |
|
|
|
} |
|
|
|
|
|
|
|
guid() { |
|
|
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { |
|
|
|
const r = Math.random() * 16 | 0, |
|
|
|
v = c === 'x' ? r : (r & 0x3 | 0x8); |
|
|
|
const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); |
|
|
|
return v.toString(16); |
|
|
|
}); |
|
|
|
} |
|
|
@@ -60,8 +61,7 @@ class SzyxPushClient { |
|
|
|
|
|
|
|
onMessage(call) { |
|
|
|
let callId = Math.random() |
|
|
|
if (this.mapCall.has(callId)) |
|
|
|
callId = Math.random() |
|
|
|
if (this.mapCall.has(callId)) callId = Math.random() |
|
|
|
this.mapCall.set(callId, call) |
|
|
|
return callId |
|
|
|
} |
|
|
@@ -72,9 +72,7 @@ class SzyxPushClient { |
|
|
|
|
|
|
|
sendTextMsg(userId, text) { |
|
|
|
return this.sendMessage({ |
|
|
|
toClientId: userId, |
|
|
|
messageType: 1, |
|
|
|
message: `{"text":"${text}"}` |
|
|
|
toClientId: userId, messageType: 1, message: `{"text":"${text}"}` |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
@@ -87,58 +85,92 @@ class SzyxPushClient { |
|
|
|
fromClientId: this._user._userId, |
|
|
|
tenantNo: this._user._tenantNo, |
|
|
|
timestamp: Date.now(), |
|
|
|
packetType: "SEND", |
|
|
|
...msg |
|
|
|
packetType: "SEND", ...msg |
|
|
|
} |
|
|
|
this._mapMsg.set(messageId, {call: resolve, message: message}) |
|
|
|
this._client.send(`/topic/server`, {}, JSON.stringify(message)) |
|
|
|
setTimeout(() => { |
|
|
|
if (this._mapMsg.has(messageId)) reject({ |
|
|
|
msg: '发送消息失败', |
|
|
|
content: this._parseMsg(message) |
|
|
|
msg: '发送消息失败', content: this._parseMsg(message) |
|
|
|
}) |
|
|
|
this._mapMsg.delete(messageId) |
|
|
|
}, 500) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
sendSocketMessage(msg) { |
|
|
|
console.log('---->sendSocketMessage', msg) |
|
|
|
wx.sendSocketMessage({ // 通过 WebSocket连接发送数据 |
|
|
|
data: msg |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
ws = { |
|
|
|
send: this.sendSocketMessage |
|
|
|
} |
|
|
|
|
|
|
|
_connectClient(resolve, reject) { |
|
|
|
|
|
|
|
this._client.debug = null |
|
|
|
//进行连接 |
|
|
|
console.log('----->', '开始im连接') |
|
|
|
this._client.connect(this._user._userName, this._user._password, () => { |
|
|
|
console.log('----->', '连接成功') |
|
|
|
resolve() |
|
|
|
this._client.subscribe("/topic/" + this._user._userId, msg => { |
|
|
|
const message = JSON.parse(msg.body) |
|
|
|
if (message.packetType === 'SEND') { |
|
|
|
this._client.send(`/topic/server`, {}, JSON.stringify({ |
|
|
|
packetType: 'SENDACK', messageId: message.messageId |
|
|
|
})) |
|
|
|
for (const call of this.mapCall.values()) { |
|
|
|
call(message.messageType, this._parseMsg(message)); |
|
|
|
} |
|
|
|
} else if (message.packetType === 'SENDACK') { |
|
|
|
const m = this._mapMsg.get(message.messageId) |
|
|
|
if (m) m.call(this._parseMsg(m.message)) |
|
|
|
this._mapMsg.delete(message.messageId) |
|
|
|
} |
|
|
|
}, error => reject(`订阅消息失败::${error}`)); |
|
|
|
}, error => reject(`连接服务器失败::${error}`), '/'); |
|
|
|
} |
|
|
|
|
|
|
|
connect(user) { |
|
|
|
this._user = user |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
if (!this._host || !this._port) reject('环境信息错误') |
|
|
|
if (!this._user || !this._user._userName || !this._user._password) reject('用户信息错误') |
|
|
|
|
|
|
|
//初始化连接 |
|
|
|
this._client = Stomp.client(`ws://${this._host}:${this._port}/stomp`) |
|
|
|
this._client.debug = null |
|
|
|
//进行连接 |
|
|
|
this._client.connect( |
|
|
|
this._user._userName, |
|
|
|
this._user._password, |
|
|
|
() => { |
|
|
|
resolve() |
|
|
|
this._client.subscribe("/topic/" + this._user._userId, |
|
|
|
msg => { |
|
|
|
const message = JSON.parse(msg.body) |
|
|
|
if (message.packetType === 'SEND') { |
|
|
|
this._client.send(`/topic/server`, {}, JSON.stringify({ |
|
|
|
packetType: 'SENDACK', |
|
|
|
messageId: message.messageId |
|
|
|
})) |
|
|
|
for (const call of this.mapCall.values()) { |
|
|
|
call(message.messageType, this._parseMsg(message)); |
|
|
|
} |
|
|
|
} else if (message.packetType === 'SENDACK') { |
|
|
|
const m = this._mapMsg.get(message.messageId) |
|
|
|
if (m) m.call(this._parseMsg(m.message)) |
|
|
|
this._mapMsg.delete(message.messageId) |
|
|
|
} |
|
|
|
}, |
|
|
|
error => reject(`订阅消息失败::${error}`)); |
|
|
|
}, |
|
|
|
error => reject(`连接服务器失败::${error}`), |
|
|
|
'/' |
|
|
|
); |
|
|
|
if (_isWx()) { |
|
|
|
console.log('----------------------------------------------------') |
|
|
|
// 创建一个 WebSocket 连接 |
|
|
|
wx.connectSocket({ |
|
|
|
url: `ws://${this._host}:${this._port}/ws` |
|
|
|
}) |
|
|
|
|
|
|
|
// 监听 WebSocket 连接打开事件 |
|
|
|
wx.onSocketOpen((res) => { |
|
|
|
this.socketOpen = true |
|
|
|
this.ws.onopen() |
|
|
|
}) |
|
|
|
|
|
|
|
wx.onSocketMessage(res => { |
|
|
|
this.ws.onmessage(res) |
|
|
|
// 推送成功处理数据 |
|
|
|
}) |
|
|
|
Stomp.setInterval = (interval, f) => { |
|
|
|
return setInterval(f, interval) |
|
|
|
} |
|
|
|
Stomp.clearInterval = (id) => { |
|
|
|
return clearInterval(id) |
|
|
|
} |
|
|
|
this._client = Stomp.over(this.ws) |
|
|
|
|
|
|
|
} else { |
|
|
|
//初始化连接 |
|
|
|
this._client = Stomp.client(`ws://${this._host}:${this._port}/ws`) |
|
|
|
} |
|
|
|
this._connectClient(resolve, reject) |
|
|
|
|
|
|
|
}) |
|
|
|
} |
|
|
@@ -164,11 +196,18 @@ class SzyxPushUser { |
|
|
|
let _imClient = new SzyxPushClient() |
|
|
|
let _imUser = new SzyxPushUser() |
|
|
|
|
|
|
|
const _isWx = () => { |
|
|
|
return _imClient._deviceType === 6 |
|
|
|
} |
|
|
|
|
|
|
|
const _createFingerprint = () => { |
|
|
|
return new Promise((resolve) => { |
|
|
|
let browserId = localStorage.getItem('PushBrowserId') |
|
|
|
if (browserId) resolve(browserId) |
|
|
|
else { |
|
|
|
let browserId = null |
|
|
|
if (_isWx()) browserId = wx.getStorageSync("PushBrowserId"); else browserId = localStorage.getItem('PushBrowserId') |
|
|
|
|
|
|
|
if (browserId) { |
|
|
|
resolve(browserId) |
|
|
|
} else { |
|
|
|
Fingerprint2.get((components) => { // 参数只有回调函数时,默认浏览器指纹依据所有配置信息进行生成 |
|
|
|
const values = components.map(function (component, index) { |
|
|
|
if (index === 0) { //把微信浏览器里UA的wifi或4G等网络替换成空,不然切换网络会ID不一样 |
|
|
@@ -177,58 +216,71 @@ const _createFingerprint = () => { |
|
|
|
return component.value |
|
|
|
}) |
|
|
|
browserId = Fingerprint2.x64hash128(values.join(''), 31) |
|
|
|
localStorage.setItem('PushBrowserId', browserId) // 存储浏览器指纹,在项目中用于校验用户身份和埋点 |
|
|
|
if (_isWx()) { |
|
|
|
wx.setStorageSync('PushBrowserId', browserId) |
|
|
|
} else localStorage.setItem('PushBrowserId', browserId) // 存储浏览器指纹,在项目中用于校验用户身份和埋点 |
|
|
|
resolve(browserId) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
const _connect = (res, resolve, reject) => { |
|
|
|
_imClient.setHostAndPort('192.168.115.137', '15774') |
|
|
|
|
|
|
|
_imUser._account = '56465456' |
|
|
|
|
|
|
|
_imUser._userName = 'xuqm' |
|
|
|
_imUser._password = 'xuqm' |
|
|
|
|
|
|
|
_imClient.connect(_imUser).then(() => resolve()).catch(error => reject(error)) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
const SzyxPush = { |
|
|
|
init: function (tenantNo, osType) { |
|
|
|
console.log(`${tenantNo}${osType}`) |
|
|
|
|
|
|
|
_imUser._tenantNo = tenantNo |
|
|
|
_imClient.setDeviceType(osType === 'ios' ? 1 : osType === 'android' ? 2 : osType === 'web' ? 3 : osType === 'windows' ? 4 : osType === 'mac' ? 5 : osType === 'wx' ? 6 : -1) |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
if (!tenantNo) reject('租户id不能为空') |
|
|
|
_createFingerprint().then(r => { |
|
|
|
_imUser._deviceId = r |
|
|
|
_imUser._tenantNo = tenantNo |
|
|
|
_imClient.setDeviceType(osType === 'ios' ? 1 : osType === 'android' ? 2 : osType === 'web' ? 3 : osType === 'windows' ? 4 : osType === 'mac' ? 5 : -1) |
|
|
|
resolve() |
|
|
|
}) |
|
|
|
}) |
|
|
|
}, |
|
|
|
onMessage: function (callback) { |
|
|
|
}, onMessage: function (callback) { |
|
|
|
return _imClient.onMessage(callback) |
|
|
|
}, |
|
|
|
unMessage: function (callId) { |
|
|
|
}, unMessage: function (callId) { |
|
|
|
_imClient.unMessage(callId) |
|
|
|
}, |
|
|
|
register: function (userId) { |
|
|
|
}, register: function (userId) { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
if (!userId) reject('用户id不能为空') |
|
|
|
|
|
|
|
axios.create({ |
|
|
|
timeout: 60000 |
|
|
|
}).get('http://192.168.115.137:8888/hello/123') |
|
|
|
.then(() => { |
|
|
|
_imClient.setHostAndPort('192.168.115.137', '61614') |
|
|
|
|
|
|
|
_imUser._userId = userId |
|
|
|
_imUser._account = '56465456' |
|
|
|
|
|
|
|
_imUser._userName = 'xuqm' |
|
|
|
_imUser._password = 'xuqm' |
|
|
|
|
|
|
|
_imClient.connect(_imUser).then(() => resolve()).catch(error => reject(error)) |
|
|
|
|
|
|
|
}) |
|
|
|
.catch((error) => { |
|
|
|
reject(`注册im服务失败::${error}`) |
|
|
|
}) |
|
|
|
_imUser._userId = userId |
|
|
|
if (_isWx()) { |
|
|
|
uni.request({ |
|
|
|
url: 'http://192.168.115.137:8888/hello/123', //仅为示例,并非真实接口地址。 |
|
|
|
success: (res) => { |
|
|
|
_connect(res.data, resolve, reject) |
|
|
|
}, fail: e => { |
|
|
|
reject(`注册im服务失败::${error}`) |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
} else { |
|
|
|
axios.create({ |
|
|
|
timeout: 60000 |
|
|
|
}).get('http://192.168.115.137:8888/hello/123') |
|
|
|
.then((res) => { |
|
|
|
_connect(res.data, resolve, reject) |
|
|
|
}) |
|
|
|
.catch((error) => { |
|
|
|
reject(`注册im服务失败::${error}`) |
|
|
|
}) |
|
|
|
} |
|
|
|
}) |
|
|
|
}, |
|
|
|
sendTextMsg: function (userId, text) { |
|
|
|
}, sendTextMsg: function (userId, text) { |
|
|
|
return _imClient.sendTextMsg(userId, text) |
|
|
|
} |
|
|
|
}; |
|
|
|