From 5bcca99f60a795a53f9b659c5d8bff5bf4bbf260 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Thu, 2 Apr 2020 14:33:29 +0200 Subject: [PATCH] mol-plugin: support request body in Download(Blob) transforms --- src/mol-plugin-state/transforms/data.ts | 6 ++++-- src/mol-util/data-source.ts | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mol-plugin-state/transforms/data.ts b/src/mol-plugin-state/transforms/data.ts index 2f0c474f1..d1b8ecf51 100644 --- a/src/mol-plugin-state/transforms/data.ts +++ b/src/mol-plugin-state/transforms/data.ts @@ -29,12 +29,13 @@ const Download = PluginStateTransform.BuiltIn({ params: { url: PD.Text('https://www.ebi.ac.uk/pdbe/static/entry/1cbs_updated.cif', { description: 'Resource URL. Must be the same domain or support CORS.' }), label: PD.Optional(PD.Text('')), - isBinary: PD.Optional(PD.Boolean(false, { description: 'If true, download data as binary (string otherwise)' })) + isBinary: PD.Optional(PD.Boolean(false, { description: 'If true, download data as binary (string otherwise)' })), + body: PD.Optional(PD.Text('')) } })({ apply({ params: p }, globalCtx: PluginContext) { return Task.create('Download', async ctx => { - const data = await globalCtx.fetch({ url: p.url, type: p.isBinary ? 'binary' : 'string' }).runInContext(ctx); + const data = await globalCtx.fetch({ url: p.url, type: p.isBinary ? 'binary' : 'string', body: p.body }).runInContext(ctx); return p.isBinary ? new SO.Data.Binary(data as Uint8Array, { label: p.label ? p.label : p.url }) : new SO.Data.String(data as string, { label: p.label ? p.label : p.url }); @@ -62,6 +63,7 @@ const DownloadBlob = PluginStateTransform.BuiltIn({ id: PD.Text('', { label: 'Unique ID' }), url: PD.Text('https://www.ebi.ac.uk/pdbe/static/entry/1cbs_updated.cif', { description: 'Resource URL. Must be the same domain or support CORS.' }), isBinary: PD.Optional(PD.Boolean(false, { description: 'If true, download data as binary (string otherwise)' })), + body: PD.Optional(PD.Text('')), canFail: PD.Optional(PD.Boolean(false, { description: 'Indicate whether the download can fail and not be included in the blob as a result.' })) }, e => `${e.id}: ${e.url}`), maxConcurrency: PD.Optional(PD.Numeric(4, { min: 1, max: 12, step: 1 }, { description: 'The maximum number of concurrent downloads.' })) diff --git a/src/mol-util/data-source.ts b/src/mol-util/data-source.ts index 5568bf8a2..d12b2a91d 100644 --- a/src/mol-util/data-source.ts +++ b/src/mol-util/data-source.ts @@ -276,7 +276,7 @@ function ajaxGetInternal<T extends DataType>(title: string | undefined, url: str } export type AjaxGetManyEntry<T> = { kind: 'ok', id: string, result: T } | { kind: 'error', id: string, error: any } -export async function ajaxGetMany(ctx: RuntimeContext, sources: { id: string, url: string, isBinary?: boolean, canFail?: boolean }[], maxConcurrency: number) { +export async function ajaxGetMany(ctx: RuntimeContext, sources: { id: string, url: string, isBinary?: boolean, body?: string, canFail?: boolean }[], maxConcurrency: number) { const len = sources.length; const slots: AjaxGetManyEntry<string | Uint8Array>[] = new Array(sources.length); @@ -307,7 +307,7 @@ export async function ajaxGetMany(ctx: RuntimeContext, sources: { id: string, ur promiseKeys = promiseKeys.filter(_filterRemoveIndex, idx); if (currentSrc < len) { const current = sources[currentSrc]; - promises.push(wrapPromise(currentSrc, current.id, ajaxGet({ url: current.url, type: current.isBinary ? 'binary' : 'string' }).runAsChild(ctx))); + promises.push(wrapPromise(currentSrc, current.id, ajaxGet({ url: current.url, type: current.isBinary ? 'binary' : 'string', body: current.body }).runAsChild(ctx))); promiseKeys.push(currentSrc); currentSrc++; } -- GitLab