1- // eslint-disable-next-line import/no-unresolved
2- import { type RenderResult , WASM_HASH as DotVizWorkerHash } from 'dotviz' ;
1+ import {
2+ type Graph ,
3+ RenderOptions ,
4+ type RenderResult ,
5+ WASM_HASH as DotVizWorkerHash ,
6+ // eslint-disable-next-line import/no-unresolved
7+ } from 'dotviz' ;
38import DotVizWorkerSource from 'dotviz/dotviz-inline-worker' ;
4- import { type RenderRequest , type RenderResponse } from 'dotviz/dotviz-worker' ;
9+ import { type RenderResponse } from 'dotviz/dotviz-worker' ;
510
611import { computeHash } from '../utils/compute-hash.ts' ;
712import { LocalStorageLRUCache } from '../utils/local-storage-lru-cache.ts' ;
813
14+ export interface RenderArgs {
15+ input : string | Graph ;
16+ options : RenderOptions ;
17+ }
18+
919export class VizWorker {
1020 private _cache = new LocalStorageLRUCache ( {
1121 localStorageKey : 'VoyagerSVGCache' ,
@@ -37,8 +47,8 @@ export class VizWorker {
3747 } ) ;
3848 }
3949
40- async renderString ( dot : string ) : Promise < string > {
41- const cacheKey = await this . generateCacheKey ( dot ) ;
50+ async render ( renderArgs : RenderArgs ) : Promise < string > {
51+ const cacheKey = await this . generateCacheKey ( renderArgs ) ;
4252
4353 if ( cacheKey != null ) {
4454 try {
@@ -52,7 +62,7 @@ export class VizWorker {
5262 }
5363 }
5464
55- const svg = await this . _renderString ( dot ) ;
65+ const svg = await this . _render ( renderArgs ) ;
5666
5767 if ( cacheKey != null ) {
5868 try {
@@ -64,24 +74,18 @@ export class VizWorker {
6474 return svg ;
6575 }
6676
67- async generateCacheKey ( dot : string ) : Promise < string | null > {
68- const dotHash = await computeHash ( dot ) ;
77+ async generateCacheKey ( renderArgs : RenderArgs ) : Promise < string | null > {
78+ const dotHash = await computeHash ( JSON . stringify ( renderArgs ) ) ;
6979 return dotHash == null ? null : `worker:${ DotVizWorkerHash } :dot:${ dotHash } ` ;
7080 }
7181
72- _renderString ( src : string ) : Promise < string > {
73- const id = this . _listeners . size ;
74- const renderRequest : RenderRequest = {
75- id,
76- input : src ,
77- options : { engine : 'dot' , format : 'svg' } ,
78- } ;
79-
82+ _render ( renderArgs : RenderArgs ) : Promise < string > {
8083 return new Promise ( ( resolve , reject ) => {
84+ const id = this . _listeners . size ;
8185 this . _listeners . set ( id , RenderResponseListener ) ;
8286
8387 console . time ( 'graphql-voyager: Rendering SVG' ) ;
84- this . _worker . postMessage ( renderRequest ) ;
88+ this . _worker . postMessage ( { id , ... renderArgs } ) ;
8589
8690 function RenderResponseListener ( result : RenderResult ) : void {
8791 console . timeEnd ( 'graphql-voyager: Rendering SVG' ) ;
0 commit comments