mirror of
https://github.com/anikeen-com/print-utils.git
synced 2026-03-13 13:46:07 +00:00
Add cast prototype
This commit is contained in:
92
cast.js
Normal file
92
cast.js
Normal file
@@ -0,0 +1,92 @@
|
||||
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()
|
||||
8
index.js
8
index.js
@@ -10,6 +10,8 @@ const port = 1903
|
||||
|
||||
const upload = multer({ dest: 'uploads/' })
|
||||
|
||||
const discovery = discover()
|
||||
|
||||
app.use(cors())
|
||||
app.use(bodyParser.json())
|
||||
app.use(bodyParser.urlencoded({ extended: true }))
|
||||
@@ -19,7 +21,9 @@ app.get('/', (req, res) => {
|
||||
})
|
||||
|
||||
app.get('/printers', async (req, res) => {
|
||||
try {
|
||||
const printers = await getPrinters()
|
||||
|
||||
return res.json(printers.map(printer => {
|
||||
return {
|
||||
default: false,
|
||||
@@ -28,6 +32,10 @@ app.get('/printers', async (req, res) => {
|
||||
name: printer.printer || printer.name,
|
||||
}
|
||||
}))
|
||||
} catch (e) {
|
||||
console.log('Error getting printers', e)
|
||||
return res.json([])
|
||||
}
|
||||
})
|
||||
|
||||
app.post('/printers/:printer/print', upload.single('file'), async (req, res) => {
|
||||
|
||||
Reference in New Issue
Block a user