| 12 | } |
| 13 | |
| 14 | function createSocket() { |
| 15 | let paused |
| 16 | , resume |
| 17 | , keepAlive |
| 18 | |
| 19 | const socket = { |
| 20 | error, |
| 21 | success, |
| 22 | readyState: 'open', |
| 23 | setKeepAlive: x => { |
| 24 | keepAlive = x |
| 25 | socket.raw && socket.raw.setKeepAlive && socket.raw.setKeepAlive(x) |
| 26 | }, |
| 27 | connect: (port, hostname) => { |
| 28 | socket.raw = null |
| 29 | socket.readyState = 'connecting' |
| 30 | typeof port === 'string' |
| 31 | ? Deno.connect({ transport: 'unix', path: socket.path = port }).then(success, error) |
| 32 | : Deno.connect({ transport: 'tcp', port: socket.port = port, hostname: socket.hostname = hostname || 'localhost' }).then(success, error) // eslint-disable-line |
| 33 | return socket |
| 34 | }, |
| 35 | pause: () => { |
| 36 | paused = new Promise(r => resume = r) |
| 37 | }, |
| 38 | resume: () => { |
| 39 | resume && resume() |
| 40 | paused = null |
| 41 | }, |
| 42 | isPaused: () => !!paused, |
| 43 | removeAllListeners: () => socket.events = events(), |
| 44 | events: events(), |
| 45 | raw: null, |
| 46 | on: (x, fn) => socket.events[x].push(fn), |
| 47 | once: (x, fn) => { |
| 48 | if (x === 'data') |
| 49 | socket.break = true |
| 50 | const e = socket.events[x] |
| 51 | e.push(once) |
| 52 | once.once = fn |
| 53 | function once(...args) { |
| 54 | fn(...args) |
| 55 | e.indexOf(once) > -1 && e.splice(e.indexOf(once), 1) |
| 56 | } |
| 57 | }, |
| 58 | removeListener: (x, fn) => { |
| 59 | socket.events[x] = socket.events[x].filter(x => x !== fn && x.once !== fn) |
| 60 | }, |
| 61 | write: (x, cb) => { |
| 62 | socket.raw.write(x).then(l => { |
| 63 | l < x.length |
| 64 | ? socket.write(x.slice(l), cb) |
| 65 | : (cb && cb(null)) |
| 66 | }).catch(err => { |
| 67 | cb && cb() |
| 68 | call(socket.events.error, err) |
| 69 | }) |
| 70 | return false |
| 71 | }, |