{"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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"}