-
-
Save phanmn/de0929fc4945c435cebfb6635366e87c to your computer and use it in GitHub Desktop.
const SIP = require('sip.js'); | |
const net = require('net'); | |
const TransportStatus = { | |
STATUS_CONNECTING: 'STATUS_CONNECTING', | |
STATUS_CONNECTED: 'STATUS_CONNECTED', | |
STATUS_CLOSING: 'STATUS_CLOSING', | |
STATUS_CLOSED: 'STATUS_CLOSED' | |
}; | |
class SipTcpTransport extends SIP.Transport { | |
constructor(logger, options) { | |
super(logger, options); | |
this.type = SIP.TypeStrings.Transport; | |
this.status = TransportStatus.STATUS_CONNECTING; | |
this.configuration = options; | |
} | |
isConnected() { | |
return this.status === TransportStatus.STATUS_CONNECTED; | |
} | |
connectPromise(options) { | |
let socket = new net.Socket(); | |
this._tcpSocket = socket; | |
let { ip, port } = this.configuration; | |
let promise = new Promise((resolve, reject) => { | |
socket.connect(port, ip, {}, () => { | |
this.status = TransportStatus.STATUS_CONNECTED; | |
this.emit('connected'); | |
resolve({ overrideEvent: true }); | |
}); | |
}); | |
socket.setEncoding('utf8'); | |
this.boundOnMessage = this.onMessage.bind(this); | |
this.boundOnError = this.onError.bind(this); | |
this.boundOnClose = this.onClose.bind(this); | |
socket.on('data', this.boundOnMessage); | |
socket.on('error', this.boundOnError); | |
socket.on('close', this.boundOnClose); | |
return promise; | |
} | |
sendPromise(message, options) { | |
if (!this._tcpSocket) { | |
return Promise.reject(); | |
} | |
this._tcpSocket.write(message); | |
return Promise.resolve({ msg: message }); | |
} | |
disconnectPromise(options) { | |
if (!this._tcpSocket) { | |
return Promise.reject(); | |
} | |
this._tcpSocket.destroy(); | |
return Promise.resolve(); | |
} | |
onMessage(data) { | |
let finishedData; | |
if (/^(\r\n)+$/.test(data)) { | |
// this.clearKeepAliveTimeout(); | |
// if (this.configuration.traceSip === true) { | |
// this.logger.log( | |
// 'received WebSocket message with CRLF Keep Alive response' | |
// ); | |
// } | |
return; | |
} else if (!data) { | |
this.logger.warn('received empty message, message discarded'); | |
return; | |
} else if (typeof data !== 'string') { | |
// WebSocket binary message. | |
// try { | |
// // the UInt8Data was here prior to types, and doesn't check | |
// finishedData = String.fromCharCode.apply(null, (new Uint8Array(data) as unknown as Array<number>)); | |
// } catch (err) { | |
// this.logger.warn("received WebSocket binary message failed to be converted into string, message discarded"); | |
// return; | |
// } | |
// if (this.configuration.traceSip === true) { | |
// this.logger.log("received WebSocket binary message:\n\n" + data + "\n"); | |
// } | |
} else { | |
// WebSocket text message. | |
// if (this.configuration.traceSip === true) { | |
// this.logger.log("received WebSocket text message:\n\n" + data + "\n"); | |
// } | |
finishedData = data; | |
} | |
this.emit('message', finishedData); | |
} | |
onError(e) { | |
this.logger.warn('Transport error: ' + e); | |
this.emit('transportError'); | |
} | |
onClose(e) { | |
this.logger.log( | |
'TCPSocket disconnected (code: ' + | |
e.code + | |
(e.reason ? '| reason: ' + e.reason : '') + | |
')' | |
); | |
this.status = TransportStatus.STATUS_CLOSED; | |
this.emit('disconnected', { code: e.code, reason: e.reason }); | |
} | |
} | |
module.exports = SipTcpTransport; |
const SIP = require('sip.js'); | |
const SipTcpTransport = require('./sipTcpTransport'); | |
let uri = '[email protected]'; // Update your sip uri | |
let authorizationUser = 'xxxx'; // Update your sip user | |
let password = 'yyyyyyy'; // Update your sip password | |
let ip = '123.456.789.012'; // Update your sip ip | |
var userAgent = new SIP.UA({ | |
uri, | |
authorizationUser, | |
password, | |
hackViaTcp: true, | |
contactTransport: 'tcp', | |
transportConstructor: SipTcpTransport, | |
transportOptions: { | |
ip, | |
port: 5060, | |
}, | |
}); | |
userAgent.on('invite', (session) => session.accept()); |
@phanmn
This code is working well for me, but It seems I have problems closing the transport object at the end of my code, I'm using userAgent.stop() and the log shows "| sip.transport | TCPSocket disconnected (code: undefined)", it's like the transport object was never shut down, in the next execution I get: "| sip.ua | UA failed to parse incoming SIP message - discarding." and after 1 minute I'm able to register the UA correctly.
This is my code:
`var userAgent = new SIP.UA({
uri: uri,
authorizationUser: authorizationUser,
password: password,
hackViaTcp: true,
transportConstructor: SipTcpTransport,
transportOptions: {
ip,
port: 5060,
},
});
userAgent.on('invite', (session) => session.accept());
await userAgent.start();
await userAgent.register();
let i =0;
while(i<3){
console.log(userAgent.isRegistered())
if(userAgent.isRegistered()===true){
console.log("User agent is registered!!!")
break;
}
await page.waitForTimeout(1000);
i++;
}
userAgent.stop();`
What sip.js version did you use for this code?