Skip to content

Instantly share code, notes, and snippets.

@kgilpin
Created March 3, 2023 14:08
Show Gist options
  • Save kgilpin/bc20a400859d1faf363a10032b345bd3 to your computer and use it in GitHub Desktop.
Save kgilpin/bc20a400859d1faf363a10032b345bd3 to your computer and use it in GitHub Desktop.
Read diagram data from a ZIP file
const params = new URL(document.location).searchParams;
const diagramUrl = params.get('diagram');
let diagramData;
if (diagramUrl.endsWith('.zip')) {
const resourceId = params.get('resourceId');
if (!resourceId) throw new Error(`resourceId is required with diagram resource ZIP file`);
const localStorageKey = ['appmap', 'diagram', diagramUrl].join('-');
let diagramDataEncoded;
if (!['false', 'no'].includes(params.get('cache')))
diagramDataEncoded = localStorage.getItem(localStorageKey);
if (diagramDataEncoded) {
diagramData = await base64UrltoBlob(diagramDataEncoded);
} else {
diagramData = await (await fetch(diagramUrl)).blob();
diagramDataEncoded = await blobToBase64(diagramData);
localStorage.setItem(localStorageKey, diagramDataEncoded);
}
// Creates a BlobReader object used to read `zipFileBlob`.
const zipFileReader = new BlobReader(diagramData);
// Creates a TransformStream object, the content of the first entry in the zip
// will be written in the `writable` property.
const dataStream = new TransformStream();
// Creates a Promise object resolved to the content of the first entry returned
// as text from `helloWorldStream.readable`.
const dataStreamPromise = new Response(dataStream.readable).text();
// Creates a ZipReader object reading the zip content via `zipFileReader`,
// retrieves metadata (name, dates, etc.) of the first entry, retrieves its
// content into `helloWorldStream.writable`, and closes the reader.
const zipReader = new ZipReader(zipFileReader);
const entries = await zipReader.getEntries();
const requestedEntry = entries.find((entry) => entry.filename === resourceId);
if (!requestedEntry) throw new Error(`Resource ${resourceId} not found in ${diagramUrl}`);
await requestedEntry.getData(dataStream.writable);
await zipReader.close();
const diagramDataRaw = await dataStreamPromise;
diagramData = JSON.parse(diagramDataRaw);
} else {
diagramData = (await fetch(diagramUrl)).json();
}
const { ui } = this.$refs;
ui.loadData((await diagramData) || {});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment