emailjs-tcp-socket
Version:
This shim brings the W3C Raw Socket API to node.js and Chromium. Its purpose is to enable apps to use the same api in Firefox OS, Chrome OS, and on the server.
89 lines (81 loc) • 2.37 kB
JavaScript
import {
EVENT_HANDSHAKE,
EVENT_INBOUND, EVENT_OUTBOUND,
EVENT_OPEN, EVENT_CLOSE,
EVENT_CONFIG, EVENT_CERT,
EVENT_ERROR,
createMessage
} from './worker-utils'
import TLS from './tls'
import TlsWorkerBlob from '../res/tls.worker.blob'
export default function createTls (socket) {
socket.tlscert = cert => { socket.oncert(cert) }
socket.tlsclose = () => { socket.close() }
socket.tlsoutbound = buffer => { socket._send(buffer) }
socket.tlsinbound = buffer => { socket._emit('data', buffer) }
socket.tlserror = function (message) {
socket._emit('error', new Error(message))
socket.close()
}
socket.tlsopen = function () {
socket.ssl = true
if (socket._useTLS) {
if (socket._proxyHostname) {
socket._emit('open', {
proxyHostname: socket._proxyHostname
})
} else {
socket._emit('open')
}
}
}
if (window.Worker) {
createTlsWithWorker(socket)
} else {
createTlsNoWorker(socket)
}
}
var createTlsNoWorker = function (socket) {
socket._tls = new TLS()
socket._tls.tlserror = socket.tlserror
socket._tls.tlscert = socket.tlscert
socket._tls.tlsclose = socket.tlsclose
socket._tls.tlsopen = socket.tlsopen
socket._tls.tlsoutbound = socket.tlsoutbound
socket._tls.tlsinbound = socket.tlsinbound
// configure the tls client
socket._tls.configure({
host: socket.host,
ca: socket._ca
})
// start the handshake
socket._tls.handshake()
}
var createTlsWithWorker = function (socket) {
socket._tlsWorker = new Worker(URL.createObjectURL(new Blob([TlsWorkerBlob])))
socket._tlsWorker.onerror = ({message}) => socket.tlserror(message)
socket._tlsWorker.onmessage = function ({data: {event, message}}) {
switch (event) {
case EVENT_CERT:
socket.tlscert(message)
break
case EVENT_ERROR:
socket.tlserror(message)
break
case EVENT_CLOSE:
socket.tlsclose(message)
break
case EVENT_OPEN:
socket.tlsopen(message)
break
case EVENT_OUTBOUND:
socket.tlsoutbound(message)
break
case EVENT_INBOUND:
socket.tlsinbound(message)
break
}
}
socket._tlsWorker.postMessage(createMessage(EVENT_CONFIG, { host: socket.host, ca: socket._ca }))
socket._tlsWorker.postMessage(createMessage(EVENT_HANDSHAKE))
}