@ogcio/sag-client 0.7.4 → 0.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-gateway-download.d.ts","sourceRoot":"","sources":["../../src/react/use-gateway-download.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,SAAS,EAEd,aAAa,EACd,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"use-gateway-download.d.ts","sourceRoot":"","sources":["../../src/react/use-gateway-download.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,SAAS,EAEd,aAAa,EACd,MAAM,UAAU,CAAA;AAkBjB,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gGAAgG;IAChG,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,aAAa,EAAE,OAAO,CAAA;IACtB,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;CAC5B;AAgBD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,CAAC,EAAE,yBAAyB,GAClC,wBAAwB,CAsI1B"}
|
|
@@ -3,6 +3,31 @@ import { useCallback, useState } from "react";
|
|
|
3
3
|
import { signIn } from "../auth";
|
|
4
4
|
import { ACTOR_TYPE_HEADER, ORGANIZATION_ID_HEADER, SagFetchError, } from "../types";
|
|
5
5
|
import { useSagClient } from "./provider";
|
|
6
|
+
/**
|
|
7
|
+
* How long to keep a preview's object URL alive before revoking it, when the
|
|
8
|
+
* file is opened in a new tab. Long enough for the tab's navigation to
|
|
9
|
+
* commit (revoking too early can blank the tab), short enough to bound the
|
|
10
|
+
* leak. A tab-lifecycle event (e.g. `unload`) would be more precise, but
|
|
11
|
+
* attaching it right after `location.href = objectUrl` binds to the
|
|
12
|
+
* *current* (about:blank) document, which unloads as soon as the browser
|
|
13
|
+
* proceeds to the blob: page — revoking before the target document has
|
|
14
|
+
* loaded it, not when the user is actually done with it.
|
|
15
|
+
*/
|
|
16
|
+
const NEW_TAB_OBJECT_URL_TTL_MS = 60000;
|
|
17
|
+
/** Error code for any "no working tab to render the preview into" case. */
|
|
18
|
+
const PREVIEW_POPUP_BLOCKED = "PREVIEW_POPUP_BLOCKED";
|
|
19
|
+
function triggerAnchorDownload(objectUrl, filename) {
|
|
20
|
+
const anchor = document.createElement("a");
|
|
21
|
+
anchor.href = objectUrl;
|
|
22
|
+
anchor.download = filename;
|
|
23
|
+
anchor.style.display = "none";
|
|
24
|
+
document.body.appendChild(anchor);
|
|
25
|
+
anchor.click();
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
URL.revokeObjectURL(objectUrl);
|
|
28
|
+
anchor.remove();
|
|
29
|
+
}, 100);
|
|
30
|
+
}
|
|
6
31
|
/**
|
|
7
32
|
* Hook that returns an authenticated `download(path, filename)` function
|
|
8
33
|
* for fetching binary files through the Secure API Gateway.
|
|
@@ -24,6 +49,15 @@ export function useGatewayDownload(options) {
|
|
|
24
49
|
// avoid popup-blockers on mobile browsers.
|
|
25
50
|
const newTab = openInNewTab ? window.open("about:blank", "_blank") : null;
|
|
26
51
|
try {
|
|
52
|
+
// Fail fast: a blocked popup (or an embedded WebView that refuses
|
|
53
|
+
// `window.open`) leaves us with no tab to render the preview in.
|
|
54
|
+
// Surface it as an error instead of silently doing nothing or
|
|
55
|
+
// silently downgrading to a save-file download, so the caller can
|
|
56
|
+
// log it and give the user feedback (and skip the fetch entirely —
|
|
57
|
+
// there's nowhere to show the result).
|
|
58
|
+
if (openInNewTab && !newTab) {
|
|
59
|
+
throw new SagFetchError("Could not open a new tab for the preview. Please allow pop-ups and try again.", 0, PREVIEW_POPUP_BLOCKED);
|
|
60
|
+
}
|
|
27
61
|
const url = `${client.gatewayUrl}${path}`;
|
|
28
62
|
const headers = {
|
|
29
63
|
"X-Application": client.appName,
|
|
@@ -64,19 +98,30 @@ export function useGatewayDownload(options) {
|
|
|
64
98
|
const blob = await response.blob();
|
|
65
99
|
const objectUrl = URL.createObjectURL(blob);
|
|
66
100
|
if (newTab) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
101
|
+
// The tab can still have been closed (or refuse navigation)
|
|
102
|
+
// between `window.open` and here — treat that the same as a
|
|
103
|
+
// blocked popup rather than silently downgrading to a download.
|
|
104
|
+
if (newTab.closed) {
|
|
105
|
+
throw new SagFetchError("The preview tab was closed before the file could load. Please try again.", 0, PREVIEW_POPUP_BLOCKED);
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
newTab.location.href = objectUrl;
|
|
109
|
+
}
|
|
110
|
+
catch (_c) {
|
|
111
|
+
throw new SagFetchError("Could not open the preview tab. Please try again.", 0, PREVIEW_POPUP_BLOCKED);
|
|
112
|
+
}
|
|
113
|
+
// Release the object URL once the new tab has had time to start
|
|
114
|
+
// loading it. Without this the preview path leaked a blob for
|
|
115
|
+
// the lifetime of the opener document (the anchor path below
|
|
116
|
+
// already revoked). The delay is deliberately generous: revoking
|
|
117
|
+
// too eagerly can abort the in-flight navigation and leave the
|
|
118
|
+
// tab blank on some browsers.
|
|
76
119
|
setTimeout(() => {
|
|
77
120
|
URL.revokeObjectURL(objectUrl);
|
|
78
|
-
|
|
79
|
-
|
|
121
|
+
}, NEW_TAB_OBJECT_URL_TTL_MS);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
triggerAnchorDownload(objectUrl, filename);
|
|
80
125
|
}
|
|
81
126
|
}
|
|
82
127
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-gateway-download.js","sourceRoot":"","sources":["../../src/react/use-gateway-download.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EACL,iBAAiB,EAEjB,sBAAsB,EACtB,aAAa,GACd,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"use-gateway-download.js","sourceRoot":"","sources":["../../src/react/use-gateway-download.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EACL,iBAAiB,EAEjB,sBAAsB,EACtB,aAAa,GACd,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC;;;;;;;;;GASG;AACH,MAAM,yBAAyB,GAAG,KAAM,CAAA;AAExC,2EAA2E;AAC3E,MAAM,qBAAqB,GAAG,uBAAuB,CAAA;AAgBrD,SAAS,qBAAqB,CAAC,SAAiB,EAAE,QAAgB;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAC1C,MAAM,CAAC,IAAI,GAAG,SAAS,CAAA;IACvB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACjC,MAAM,CAAC,KAAK,EAAE,CAAA;IAEd,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,EAAE,CAAA;IACjB,CAAC,EAAE,GAAG,CAAC,CAAA;AACT,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAmC;IAEnC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;IAC7B,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAA;IAE9D,MAAM,QAAQ,GAAG,WAAW,CAC1B,KAAK,EAAE,IAAY,EAAE,QAAgB,EAAE,EAAE;;QACvC,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACtB,QAAQ,CAAC,IAAI,CAAC,CAAA;QAEd,MAAM,YAAY,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,mCAAI,KAAK,CAAA;QAEnD,8DAA8D;QAC9D,2CAA2C;QAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAEzE,IAAI,CAAC;YACH,kEAAkE;YAClE,iEAAiE;YACjE,8DAA8D;YAC9D,kEAAkE;YAClE,mEAAmE;YACnE,uCAAuC;YACvC,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,IAAI,aAAa,CACrB,+EAA+E,EAC/E,CAAC,EACD,qBAAqB,CACtB,CAAA;YACH,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,EAAE,CAAA;YACzC,MAAM,OAAO,GAA2B;gBACtC,eAAe,EAAE,MAAM,CAAC,OAAO;aAChC,CAAA;YACD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,CAAC;gBACvB,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,SAAS,CAAA;YAChD,CAAC;YACD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,EAAE,CAAC;gBAC5B,OAAO,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,cAAc,CAAA;YAC1D,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,WAAW,EAAE,SAAS;gBACtB,OAAO;aACR,CAAC,CAAA;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,EAAE,CAAA;gBACf,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;gBACzC,MAAM,IAAI,aAAa,CACrB,+CAA+C,EAC/C,GAAG,CACJ,CAAA;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,EAAE,CAAA;gBACf,IAAI,OAAO,GAAG,uBAAuB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAA;gBAC7E,IAAI,IAAwB,CAAA;gBAC5B,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIlC,CAAA;oBACD,IAAI,IAAI,CAAC,OAAO;wBAAE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;yBACnC,IAAI,IAAI,CAAC,KAAK;wBAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAA;oBACzC,IAAI,IAAI,CAAC,IAAI;wBAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;gBACjC,CAAC;gBAAC,WAAM,CAAC;oBACP,gBAAgB;gBAClB,CAAC;gBACD,MAAM,IAAI,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACzD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YAE3C,IAAI,MAAM,EAAE,CAAC;gBACX,4DAA4D;gBAC5D,4DAA4D;gBAC5D,gEAAgE;gBAChE,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,MAAM,IAAI,aAAa,CACrB,0EAA0E,EAC1E,CAAC,EACD,qBAAqB,CACtB,CAAA;gBACH,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAA;gBAClC,CAAC;gBAAC,WAAM,CAAC;oBACP,MAAM,IAAI,aAAa,CACrB,mDAAmD,EACnD,CAAC,EACD,qBAAqB,CACtB,CAAA;gBACH,CAAC;gBACD,gEAAgE;gBAChE,8DAA8D;gBAC9D,6DAA6D;gBAC7D,iEAAiE;gBACjE,+DAA+D;gBAC/D,8BAA8B;gBAC9B,UAAU,CAAC,GAAG,EAAE;oBACd,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;gBAChC,CAAC,EAAE,yBAAyB,CAAC,CAAA;YAC/B,CAAC;iBAAM,CAAC;gBACN,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,EAAE,CAAA;YACf,MAAM,QAAQ,GACZ,GAAG,YAAY,aAAa;gBAC1B,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,IAAI,aAAa,CACf,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,EACtD,CAAC,CACF,CAAA;YACP,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAClB,MAAM,QAAQ,CAAA;QAChB,CAAC;gBAAS,CAAC;YACT,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC;IACH,CAAC,EACD;QACE,MAAM;QACN,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS;QAClB,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc;QACvB,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY;KACtB,CACF,CAAA;IAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;AAC3C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ogcio/sag-client",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.5",
|
|
4
4
|
"description": "Framework-agnostic client for the Secure API Gateway — authentication, health checks, and authenticated fetching",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"jsdom": "29.1.1",
|
|
59
59
|
"react": "19.2.4",
|
|
60
60
|
"react-dom": "19.2.4",
|
|
61
|
-
"swr": "2.4.
|
|
61
|
+
"swr": "2.4.2",
|
|
62
62
|
"typescript": "6.0.3"
|
|
63
63
|
},
|
|
64
64
|
"engines": {
|