mirror of
https://github.com/anikeen-com/print-utils.git
synced 2026-03-13 13:46:07 +00:00
92 lines
3.0 KiB
JavaScript
92 lines
3.0 KiB
JavaScript
import dgram from 'dgram'
|
|
import { getPrinters } from './print.js'
|
|
|
|
export function discover() {
|
|
const socket = dgram.createSocket({ type: 'udp4', reuseAddr: true })
|
|
const origin = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)
|
|
const discoveredPrinters = []
|
|
const discoverInterval = 10000
|
|
const timeoutInterval = 30000
|
|
|
|
const broadcast = (event, payload) => {
|
|
socket.send(Buffer.from(JSON.stringify({
|
|
event,
|
|
origin,
|
|
...payload,
|
|
})), 4446, '230.0.0.0', function (err) {
|
|
if (err) console.error(err)
|
|
})
|
|
}
|
|
|
|
socket.bind(4446, function () {
|
|
socket.addMembership('230.0.0.0')
|
|
})
|
|
|
|
socket.on('listening', function () {
|
|
console.log('UDP Socket listening on ' + JSON.stringify(socket.address()))
|
|
})
|
|
|
|
socket.on('message', async function (message, rinfo) {
|
|
console.log(`Received message: ${message} from ${rinfo.address}:${rinfo.port}`)
|
|
try {
|
|
const payload = JSON.parse(message.toString())
|
|
if (payload.event === 'printer-list') {
|
|
const printers = await getPrinters()
|
|
|
|
printers.map(printer => {
|
|
broadcast('printer', {
|
|
printer: {
|
|
default: false,
|
|
format: 'PDF',
|
|
id: printer.printer || printer.deviceId,
|
|
name: printer.printer || printer.name,
|
|
},
|
|
})
|
|
})
|
|
} else if (payload.event === 'printer') {
|
|
console.log('Printer list received')
|
|
const { printer } = payload
|
|
const existingPrinter = discoveredPrinters.find(p => p.id === printer.id)
|
|
const last_seen = new Date().getTime()
|
|
|
|
if (existingPrinter) {
|
|
existingPrinter.last_seen = last_seen
|
|
} else {
|
|
discoveredPrinters.push({
|
|
...printer,
|
|
uri: `http://${rinfo.address}/printers/${encodeURIComponent(printer.id)}/print`,
|
|
last_seen,
|
|
})
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.log('Error parsing message', e)
|
|
}
|
|
})
|
|
|
|
// Your list
|
|
let list = [{ origin, port: 1903 }]
|
|
|
|
// Serialize the list to JSON
|
|
let jsonList = JSON.stringify(list)
|
|
|
|
setInterval(() => broadcast('printer-list'), discoverInterval)
|
|
broadcast('printer-list')
|
|
|
|
setInterval(() => {
|
|
const now = new Date().getTime()
|
|
discoveredPrinters.forEach(printer => {
|
|
if (now - printer.last_seen > timeoutInterval) {
|
|
const index = discoveredPrinters.indexOf(printer)
|
|
discoveredPrinters.splice(index, 1)
|
|
}
|
|
})
|
|
console.log('Discovered printers', discoveredPrinters)
|
|
}, 5000)
|
|
|
|
return {
|
|
printers: list,
|
|
}
|
|
}
|
|
|
|
discover() |