UNPKG

@illgrenoble/visa-print-client

Version:

[![npm version](https://badge.fury.io/js/%40illgrenoble%2Fvisa-print-client.svg)](https://badge.fury.io/js/%40illgrenoble%2Fvisa-print-client)

1 lines 22.4 kB
{"version":3,"file":"illgrenoble-visa-print-client.mjs","sources":["../../../lib/src/models/print-event.model.ts","../../../lib/src/models/print-job-chunk-event.model.ts","../../../lib/src/models/print-job-available-event.model.ts","../../../lib/src/models/error-event.model.ts","../../../lib/src/services/visa-print.service.ts","../../../lib/src/visa-print.module.ts","../../../lib/public-api.ts","../../../lib/illgrenoble-visa-print-client.ts"],"sourcesContent":["import {ErrorEvent} from \"./error-event.model\";\nimport {PrintJobChunkEvent} from \"./print-job-chunk-event.model\";\nimport {PrintJobAvailableEvent} from \"./print-job-available-event.model\";\n\nexport type PrintEventType =\n 'CONNECTING' |\n 'CONNECTED' |\n 'DISCONNECTED' |\n 'ERROR' |\n 'PRINT_JOB_CHUNK_RECEIVED' |\n 'PRINT_JOB_TRANSFER_STARTED' |\n 'PRINT_JOB_TRANSFER_TERMINATED' |\n 'PRINT_JOB_AVAILABLE' |\n 'PRINT_JOB_HANDLED' |\n 'PRINT_DIALOG_FAILED' |\n 'PRINT_ENABLED' |\n 'PRINT_DISABLED';\n\nexport class PrintEvent {\n type: PrintEventType\n connectionId: string;\n jobId?: number;\n data?: ErrorEvent | PrintJobChunkEvent | PrintJobAvailableEvent;\n\n constructor(data?: Partial<PrintEvent>) {\n Object.assign(this, data);\n }\n}\n","export class PrintJobChunkEvent {\n jobId: number;\n chunkId: number;\n chunkCount: number;\n chunkLength: number;\n\n constructor(data?: Partial<PrintJobChunkEvent>) {\n Object.assign(this, data);\n }\n}\n","export class PrintJobAvailableEvent {\n jobId: number;\n fileName: string;\n fileLength: number;\n\n constructor(data?: Partial<PrintJobAvailableEvent>) {\n Object.assign(this, data);\n }\n}\n","export class ErrorEvent {\n type: 'CONNECTION_ERROR' | 'ERROR' | 'EXCEPTION';\n message: string;\n\n constructor(data?: Partial<ErrorEvent>) {\n Object.assign(this, data);\n }\n}\n","import {Injectable} from \"@angular/core\";\nimport {BehaviorSubject, Observable, Subject} from \"rxjs\";\nimport {\n PrintEvent,\n PrintJob,\n ErrorEvent,\n PrintJobChunkEvent,\n PrintJobAvailableEvent\n} from \"../models\";\nimport io from 'socket.io-client'\nimport * as SocketIOClient from 'socket.io-client'\nimport Socket = SocketIOClient.Socket;\nimport {ManagerOptions} from \"socket.io-client/build/esm/manager\";\nimport {SocketOptions} from \"socket.io-client/build/esm/socket\";\n\nexport type ConnectionData = {\n host?: string;\n path?: string;\n token?: string;\n}\n\ntype Printable = {\n jobId: number;\n data: string;\n}\n\nexport type Connection = {\n id: string;\n socket: Socket;\n event$: Subject<PrintEvent>;\n jobs: Map<number, PrintJob[]>;\n printables: Printable[];\n}\n\n@Injectable({\n providedIn: 'root'\n})export class VisaPrintService {\n\n private _connections: Connection[] = [];\n private static _connectionCounter = 1;\n\n private _iframe: HTMLIFrameElement;\n private _pdfUrl: string;\n private _pdfDidOpen = false;\n\n public connect(data: ConnectionData, connectionOptions?: Partial<ManagerOptions & SocketOptions>): Observable<PrintEvent> {\n\n connectionOptions = connectionOptions || {};\n const socketOptions: Partial<ManagerOptions & SocketOptions> = {\n transports: ['websocket'],\n timeout: 1000,\n reconnection: true,\n reconnectionDelayMax: 10000,\n ...connectionOptions\n }\n\n if (data.path) {\n socketOptions.path = data.path;\n }\n\n if (data.token) {\n socketOptions.auth = {\n token: data.token\n };\n socketOptions.query = {\n token: data.token\n }\n }\n\n const connectionId = `print-connection-${VisaPrintService._connectionCounter++} `;\n\n const location = window.location;\n const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';\n const hostname = location.hostname;\n const port = location.port ? `:${location.port}` : '';\n\n const host = data.host ? `${data.host}` : `${protocol}//${hostname}${port}`;\n const socket = io(`${host}`, socketOptions);\n\n const printEvents$ = new BehaviorSubject<PrintEvent>(new PrintEvent({type: 'CONNECTING', connectionId}));\n const connection: Connection = {\n id: connectionId,\n event$: printEvents$,\n socket: socket,\n jobs: new Map<number, PrintJob[]>(),\n printables: [],\n };\n\n this._connections.push(connection);\n\n socket.on('connect', () => {\n printEvents$.next(new PrintEvent({type: 'CONNECTED', connectionId}));\n });\n\n socket.on('print_job_handled', (jobId: number) => {\n connection.printables = connection.printables.filter(printable => printable.jobId !== jobId);\n printEvents$.next(new PrintEvent({type: 'PRINT_JOB_HANDLED', connectionId, jobId}));\n });\n\n socket.on('connect_error', (error) => {\n printEvents$.next(new PrintEvent({type: 'ERROR', connectionId, data: new ErrorEvent({type: 'CONNECTION_ERROR', message: error.message})}));\n });\n\n socket.on('disconnect', () => {\n printEvents$.next(new PrintEvent({type: 'DISCONNECTED', connectionId}));\n });\n\n socket.on('error', (error) => {\n printEvents$.next(new PrintEvent({type: 'ERROR', connectionId, data: new ErrorEvent({type: 'ERROR', message: error.message})}));\n });\n\n socket.on('exception', (e) => {\n printEvents$.next(new PrintEvent({type: 'ERROR', connectionId, data: new ErrorEvent({type: 'EXCEPTION', message: e.message})}));\n });\n\n socket.on('print_job_start', (jobId: number) => {\n printEvents$.next(new PrintEvent({type: 'PRINT_JOB_TRANSFER_STARTED', connectionId, jobId}));\n });\n\n socket.on('print_job_end', (jobId: number) => {\n printEvents$.next(new PrintEvent({type: 'PRINT_JOB_TRANSFER_TERMINATED', connectionId, jobId}));\n });\n\n socket.on('print_job_data', (printJob: PrintJob, ack) => {\n const {jobId, chunkId, chunkCount, chunkLength, data} = printJob;\n if (chunkLength !== data.length) {\n console.error(`printer job data of chunk ${chunkId}/${chunkCount} for job ${jobId} ${printJob.fileName} has incorrect length`)\n printEvents$.next(new PrintEvent({type: 'ERROR', connectionId, data: new ErrorEvent({type: 'ERROR', message: 'Incorrect data length in chunk'})}));\n ack(false);\n return;\n }\n\n ack(true);\n printEvents$.next(new PrintEvent({type: 'PRINT_JOB_CHUNK_RECEIVED', connectionId, jobId, data: new PrintJobChunkEvent({jobId, chunkId, chunkCount, chunkLength})}));\n this.handlePrintJob(connection, printJob);\n });\n\n return printEvents$;\n }\n\n public disconnect(connectionId: string): void {\n const connection = this._connections.find(connection => connection.id === connectionId);\n if (connection) {\n connection.socket.disconnect();\n }\n this._connections = this._connections.filter(connection => connection.id !== connectionId);\n }\n\n public enablePrinting(connectionId: string): void {\n const connection = this._connections.find(connection => connection.id === connectionId);\n if (connection) {\n connection.socket.emit('enable_print', null, (data: boolean) => {\n connection.event$.next(new PrintEvent({type: 'PRINT_ENABLED', connectionId}));\n });\n }\n }\n\n public disablePrinting(connectionId: string): void {\n const connection = this._connections.find(connection => connection.id === connectionId);\n if (connection) {\n connection.socket.emit('disable_print', null, (data: boolean) => {\n connection.event$.next(new PrintEvent({type: 'PRINT_DISABLED', connectionId}));\n });\n }\n }\n\n public openPrintable(connectionId: string, jobId: number): void {\n const connection = this._connections.find(connection => connection.id === connectionId);\n if (connection) {\n const printable = connection.printables.find(printable => printable.jobId === jobId);\n if (printable) {\n connection.socket.emit('print_job_handled', printable.jobId);\n connection.printables = connection.printables.filter(printable => printable.jobId !== jobId);\n this.openPDF(printable.data, connection, jobId);\n }\n }\n }\n\n private initialiseReceiver(): void {\n if (!this._iframe) {\n this._iframe = document.createElement('iframe');\n this._iframe.style.display = 'none';\n document.body.appendChild(this._iframe);\n this._iframe.onload = () => {\n URL.revokeObjectURL(this._pdfUrl);\n\n this._iframe.focus();\n try {\n this._iframe.contentWindow?.print();\n this._pdfDidOpen = true;\n\n } catch (error) {\n }\n };\n }\n }\n\n private handlePrintJob(connection: Connection, printJob: PrintJob): void {\n const { jobId, chunkId, chunkCount } = printJob;\n if (!connection.jobs.has(jobId)) {\n connection.jobs.set(jobId, []);\n }\n connection.jobs.get(jobId)?.push(printJob);\n\n if (chunkId === chunkCount) {\n this.processJob(connection, printJob);\n }\n }\n\n private processJob(connection: Connection, printJob: PrintJob): void {\n const {jobId, chunkCount, fileLength, fileName} = printJob;\n const chunks = connection.jobs.get(jobId);\n if (chunks) {\n // Remove from jobs\n connection.jobs.delete(jobId);\n\n // Concatenate all the data\n if (chunks.length > 0 && chunks.length === chunkCount) {\n const base64 = chunks.reduce((acc, chunk) => {\n return acc + chunk.data\n }, '');\n\n const data = atob(base64);\n if (data.length === fileLength) {\n connection.printables.push({jobId, data})\n connection.event$.next(new PrintEvent({type: 'PRINT_JOB_AVAILABLE', connectionId: connection.id, data: new PrintJobAvailableEvent({jobId, fileLength, fileName})}));\n } else {\n connection.event$.next(new PrintEvent({type: 'ERROR', connectionId: connection.id, data: new ErrorEvent({type: 'ERROR', message: 'Processes print data has inconsistent length'})}));\n }\n }\n }\n }\n\n private openPDF(data: string, connection: Connection, jobId: number): void {\n // Convert to binary data\n const bytes = new Uint8Array(data.length);\n for (let i = 0; i < data.length; i++) {\n bytes[i] = data.charCodeAt(i);\n }\n const blob = new Blob([bytes], {type: 'application/pdf'});\n this._pdfUrl = URL.createObjectURL(blob);\n\n this.initialiseReceiver();\n\n // Set the pdf in the iframe\n this._pdfDidOpen = false;\n this._iframe.src = this._pdfUrl;\n setTimeout(() => {\n if (this._pdfDidOpen === false) {\n connection.event$.next(new PrintEvent({type: 'PRINT_DIALOG_FAILED', connectionId: connection.id, jobId}));\n }\n }, 200);\n\n }\n}\n","import { NgModule } from '@angular/core';\nimport {VisaPrintService} from './services';\n\n@NgModule({\n declarations: [\n ],\n imports: [\n ],\n exports: [\n ],\n providers: [\n VisaPrintService,\n ]\n})\nexport class VisaPrintModule {\n}\n","/*\n * Public API Surface of lib\n */\n\nexport * from './src';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}