@helia/verified-fetch 2.5.0 → 2.5.2
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.
- package/dist/index.min.js +110 -94
- package/dist/src/plugins/plugin-handle-dir-index-html.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dir-index-html.js +9 -4
- package/dist/src/plugins/plugin-handle-dir-index-html.js.map +1 -1
- package/dist/src/utils/dir-index-html.d.ts.map +1 -1
- package/dist/src/utils/dir-index-html.js +53 -56
- package/dist/src/utils/dir-index-html.js.map +1 -1
- package/dist/src/utils/response-headers.d.ts.map +1 -1
- package/dist/src/utils/response-headers.js +4 -0
- package/dist/src/utils/response-headers.js.map +1 -1
- package/package.json +29 -29
- package/src/plugins/plugin-handle-dir-index-html.ts +10 -4
- package/src/utils/dir-index-html.ts +56 -59
- package/src/utils/response-headers.ts +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-handle-dir-index-html.d.ts","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-dir-index-html.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-handle-dir-index-html.d.ts","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-dir-index-html.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAE3E,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,QAAQ,CAAC,KAAK,QAAc;IAC5B,SAAS,CAAE,OAAO,EAAE,aAAa,GAAG,OAAO;IAgBrC,MAAM,CAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;CAwBzD;AAED,eAAO,MAAM,yBAAyB,EAAE,0BAAmE,CAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { code as dagPbCode } from '@ipld/dag-pb';
|
|
2
2
|
import { dirIndexHtml } from '../utils/dir-index-html.js';
|
|
3
|
-
import { okResponse } from '../utils/responses.js';
|
|
4
3
|
import { BasePlugin } from './plugin-base.js';
|
|
5
4
|
export class DirIndexHtmlPlugin extends BasePlugin {
|
|
6
5
|
codes = [dagPbCode];
|
|
@@ -28,9 +27,15 @@ export class DirIndexHtmlPlugin extends BasePlugin {
|
|
|
28
27
|
const terminalElement = pathDetails.terminalElement;
|
|
29
28
|
const gatewayURL = resource;
|
|
30
29
|
const htmlResponse = dirIndexHtml(terminalElement, directoryEntries, { gatewayURL, log: this.log });
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
return new Response(htmlResponse, {
|
|
31
|
+
status: 200,
|
|
32
|
+
statusText: 'OK',
|
|
33
|
+
headers: {
|
|
34
|
+
'Content-Type': 'text/html',
|
|
35
|
+
// see https://github.com/ipfs/gateway-conformance/pull/219
|
|
36
|
+
'Cache-Control': 'public, max-age=604800, stale-while-revalidate=2678400'
|
|
37
|
+
}
|
|
38
|
+
});
|
|
34
39
|
}
|
|
35
40
|
}
|
|
36
41
|
export const dirIndexHtmlPluginFactory = (opts) => new DirIndexHtmlPlugin(opts);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-handle-dir-index-html.js","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-dir-index-html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"plugin-handle-dir-index-html.js","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-dir-index-html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IACvC,KAAK,GAAG,CAAC,SAAS,CAAC,CAAA;IAC5B,SAAS,CAAE,OAAsB;QAC/B,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAA;QACtD,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,WAAW,CAAC,eAAe,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YACtD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAE,OAAsB;QAClC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAA;QAE3D,IAAI,WAAW,EAAE,eAAe,IAAI,IAAI,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAC9C,CAAC;QACD,IAAI,gBAAgB,IAAI,IAAI,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QACD,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe,CAAA;QAEnD,MAAM,UAAU,GAAG,QAAQ,CAAA;QAC3B,MAAM,YAAY,GAAG,YAAY,CAAC,eAAe,EAAE,gBAAgB,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAEnG,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE;YAChC,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE;gBACP,cAAc,EAAE,WAAW;gBAC3B,2DAA2D;gBAC3D,eAAe,EAAE,wDAAwD;aAC1E;SACF,CAAC,CAAA;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,yBAAyB,GAA+B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dir-index-html.d.ts","sourceRoot":"","sources":["../../../src/utils/dir-index-html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAwCvD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;CACZ;AA0CD;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,QAAS,WAAW,SAAS,WAAW,EAAE,gCAAgC,mBAAmB,KAAG,
|
|
1
|
+
{"version":3,"file":"dir-index-html.d.ts","sourceRoot":"","sources":["../../../src/utils/dir-index-html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAwCvD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;CACZ;AA0CD;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,QAAS,WAAW,SAAS,WAAW,EAAE,gCAAgC,mBAAmB,KAAG,MAwFxH,CAAA"}
|
|
@@ -61,70 +61,67 @@ export const dirIndexHtml = (dir, items, { gatewayURL, dnsLink, log }) => {
|
|
|
61
61
|
backLink: '',
|
|
62
62
|
hash: dir.cid.toString()
|
|
63
63
|
};
|
|
64
|
-
return
|
|
65
|
-
<!DOCTYPE html>
|
|
66
|
-
<!--{{ $root := . }}-->
|
|
64
|
+
return `<!DOCTYPE html>
|
|
67
65
|
<html lang="en">
|
|
68
|
-
<head>
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
</head>
|
|
76
|
-
<body>
|
|
77
|
-
<!--
|
|
78
|
-
# Some JSON content for debugging:
|
|
79
|
-
|
|
80
|
-
## dirData
|
|
81
|
-
${JSON.stringify(dirData, null, 2)}
|
|
82
|
-
-->
|
|
83
|
-
<header id="header">
|
|
84
|
-
<div class="ipfs-logo"> </div>
|
|
66
|
+
<head>
|
|
67
|
+
<meta charset="utf-8">
|
|
68
|
+
<meta name="description" content="A directory of content-addressed files hosted on IPFS.">
|
|
69
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
70
|
+
<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlo89/56ZQ/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUjDu1lo89/6mhTP+zrVP/nplD/5+aRK8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNiIS6Wjz3/ubFY/761W/+vp1D/urRZ/8vDZf/GvmH/nplD/1BNIm8AAAAAAAAAAAAAAAAAAAAAAAAAAJaPPf+knEj/vrVb/761W/++tVv/r6dQ/7q0Wf/Lw2X/y8Nl/8vDZf+tpk7/nplD/wAAAAAAAAAAAAAAAJaPPf+2rVX/vrVb/761W/++tVv/vrVb/6+nUP+6tFn/y8Nl/8vDZf/Lw2X/y8Nl/8G6Xv+emUP/AAAAAAAAAACWjz3/vrVb/761W/++tVv/vrVb/761W/+vp1D/urRZ/8vDZf/Lw2X/y8Nl/8vDZf/Lw2X/nplD/wAAAAAAAAAAlo89/761W/++tVv/vrVb/761W/++tVv/r6dQ/7q0Wf/Lw2X/y8Nl/8vDZf/Lw2X/y8Nl/56ZQ/8AAAAAAAAAAJaPPf++tVv/vrVb/761W/++tVv/vbRa/5aPPf+emUP/y8Nl/8vDZf/Lw2X/y8Nl/8vDZf+emUP/AAAAAAAAAACWjz3/vrVb/761W/++tVv/vrVb/5qTQP+inkb/op5G/6KdRv/Lw2X/y8Nl/8vDZf/Lw2X/nplD/wAAAAAAAAAAlo89/761W/++tVv/sqlS/56ZQ//LxWb/0Mlp/9DJaf/Kw2X/oJtE/7+3XP/Lw2X/y8Nl/56ZQ/8AAAAAAAAAAJaPPf+9tFr/mJE+/7GsUv/Rymr/0cpq/9HKav/Rymr/0cpq/9HKav+xrFL/nplD/8vDZf+emUP/AAAAAAAAAACWjz3/op5G/9HKav/Rymr/0cpq/9HKav/Rymr/0cpq/9HKav/Rymr/0cpq/9HKav+inkb/nplD/wAAAAAAAAAAAAAAAKKeRv+3slb/0cpq/9HKav/Rymr/0cpq/9HKav/Rymr/0cpq/9HKav+1sFX/op5G/wAAAAAAAAAAAAAAAAAAAAAAAAAAop5GUKKeRv/Nxmf/0cpq/9HKav/Rymr/0cpq/83GZ/+inkb/op5GSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAop5G16KeRv/LxWb/y8Vm/6KeRv+inkaPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAop5G/6KeRtcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/n8AAPgfAADwDwAAwAMAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAwAMAAPAPAAD4HwAA/n8AAA==">
|
|
71
|
+
<title>${dirData.path}</title>
|
|
72
|
+
<style>${style}</style>
|
|
73
|
+
</head>
|
|
74
|
+
<body>
|
|
85
75
|
<!--
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
76
|
+
# Some JSON content for debugging:
|
|
77
|
+
|
|
78
|
+
## dirData
|
|
79
|
+
${JSON.stringify(dirData, null, 2)}
|
|
90
80
|
-->
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
<
|
|
95
|
-
<
|
|
96
|
-
|
|
81
|
+
<header id="header">
|
|
82
|
+
<div class="ipfs-logo"> </div>
|
|
83
|
+
<!--
|
|
84
|
+
<nav>
|
|
85
|
+
<a href="https://ipfs.tech" target="_blank" rel="noopener noreferrer">About<span class="dn-mobile"> IPFS</span></a>
|
|
86
|
+
<a href="https://docs.ipfs.tech/install/" target="_blank" rel="noopener noreferrer">Install<span class="dn-mobile"> IPFS</span></a>
|
|
87
|
+
</nav>
|
|
88
|
+
-->
|
|
89
|
+
</header>
|
|
90
|
+
<main id="main">
|
|
91
|
+
<header class="flex flex-wrap">
|
|
92
|
+
<div>
|
|
93
|
+
<strong>${dirListingTitle(dirData)}</strong>
|
|
94
|
+
${dirData.hash == null
|
|
97
95
|
? ''
|
|
98
96
|
: `<div class="ipfs-hash" translate="no">
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
97
|
+
${dirData.hash}
|
|
98
|
+
</div>`}
|
|
99
|
+
</div>
|
|
100
|
+
${dirData.size == null
|
|
103
101
|
? ''
|
|
104
102
|
: `<div class="nowrap flex-shrink ml-auto">
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
103
|
+
<strong title="Cumulative size of IPFS DAG (data + metadata)"> ${dirData.size}</strong>
|
|
104
|
+
</div>`}
|
|
105
|
+
</header>
|
|
106
|
+
<div>
|
|
107
|
+
<div class="grid dir">
|
|
108
|
+
<!--{{ if .BackLink }}
|
|
109
|
+
<div class="type-icon">
|
|
110
|
+
<div class="ipfs-_blank"> </div>
|
|
111
|
+
</div>
|
|
112
|
+
<div>
|
|
113
|
+
<a href="{{.BackLink | urlEscape}}">..</a>
|
|
114
|
+
</div>
|
|
115
|
+
<div></div>
|
|
116
|
+
<div></div>
|
|
117
|
+
</tr>
|
|
118
|
+
{{ end }}-->
|
|
119
|
+
${getAllDirListingRows(dirData)}
|
|
120
|
+
</div>
|
|
122
121
|
</div>
|
|
123
|
-
</
|
|
124
|
-
</
|
|
125
|
-
</
|
|
126
|
-
</html>
|
|
127
|
-
`;
|
|
122
|
+
</main>
|
|
123
|
+
</body>
|
|
124
|
+
</html>`;
|
|
128
125
|
};
|
|
129
126
|
const style = `
|
|
130
127
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dir-index-html.js","sourceRoot":"","sources":["../../../src/utils/dir-index-html.ts"],"names":[],"mappings":"AA+CA,yHAAyH;AACzH,SAAS,WAAW,CAAE,IAAY;IAChC,sBAAsB;IACtB,4EAA4E;IAC5E,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,SAAS,iBAAiB,CAAE,IAAmB,EAAE,OAA8B;IAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,SAAS,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,IAAI,EAAE,CAAA;IAEhK,OAAO,6CAA6C,IAAI,KAAK,IAAI,CAAC,SAAS,MAAM,CAAA;AACnF,CAAC;AAED,SAAS,eAAe,CAAE,OAA8B;IACtD,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,CAAA;QAC/D,OAAO,qBAAqB,IAAI,KAAK,OAAO,CAAC,IAAI,MAAM,CAAA;IACzD,CAAC;IACD,OAAO,YAAY,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAA;AACnD,CAAC;AAED,SAAS,oBAAoB,CAAE,OAA8B;IAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBACnB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;;iBAGzB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;;;QAGhC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC;;gFAEwC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC5G,CAAC;AAED,SAAS,WAAW,CAAE,IAAiB;IACrC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE1C,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAA;AACzC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAgB,EAAE,KAAoB,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAuB,EAAU,EAAE;IAChI,GAAG,CAAC,+BAA+B,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IAE9C,MAAM,OAAO,GAA0B;QACrC,UAAU,EAAE;YACV,UAAU;YACV,OAAO,EAAE,OAAO,IAAI,KAAK;SAC1B;QACD,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1B,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;gBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACnB,CAAA;QAC3B,CAAC,CAAC;QACF,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE;QACzB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE;KACzB,CAAA;IAED,OAAO
|
|
1
|
+
{"version":3,"file":"dir-index-html.js","sourceRoot":"","sources":["../../../src/utils/dir-index-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-headers.d.ts","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,UAAU,yBAAyB;IACjC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,yBAAyB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"response-headers.d.ts","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,UAAU,yBAAyB;IACjC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,yBAAyB,GAAG,IAAI,CAoBnG;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,CAmC7K;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAIzE"}
|
|
@@ -7,6 +7,10 @@ import { InvalidRangeError } from '../errors.js';
|
|
|
7
7
|
* @see https://specs.ipfs.tech/http-gateways/path-gateway/#cache-control-response-header
|
|
8
8
|
*/
|
|
9
9
|
export function setCacheControlHeader({ ttl, protocol, response }) {
|
|
10
|
+
if (response.headers.has('cache-control')) {
|
|
11
|
+
// don't set the header if it's already set by a plugin
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
10
14
|
let headerValue;
|
|
11
15
|
if (protocol === 'ipfs') {
|
|
12
16
|
headerValue = 'public, max-age=29030400, immutable';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-headers.js","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAchD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAA6B;IAC3F,IAAI,WAAmB,CAAA;IACvB,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,WAAW,GAAG,qCAAqC,CAAA;IACrD,CAAC;SAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB;;;;WAIG;QACH,WAAW,GAAG,qBAAqB,CAAA;IACrC,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,mBAAmB,GAAG,EAAE,CAAA;IACxC,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAAA;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAgG;IACnK,MAAM,KAAK,GAAG,QAAQ,IAAI,GAAG,CAAA,CAAC,mDAAmD;IAEjF,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,iBAAiB,CAAC,kFAAkF,CAAC,CAAA;IACjH,CAAC;IACD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,iBAAiB,CAAC,oFAAoF,CAAC,CAAA;IACnH,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,0BAA0B;QAC1B,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,KAAK,EAAE,CAAA;QAC3B,CAAC;QACD,OAAO,SAAS,SAAS,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAA;IACzD,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,wBAAwB;QACxB,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,KAAK,EAAE,CAAA;QAC3B,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAA;QACxB,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,CAAC,CAAA;QAE/B,OAAO,SAAS,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC5C,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,uDAAuD;QACvD,OAAO,WAAW,KAAK,EAAE,CAAA;IAC3B,CAAC;IAED,OAAO,SAAS,SAAS,IAAI,OAAO,IAAI,KAAK,EAAE,CAAA;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAE,QAAkB,EAAE,SAAiB;IACjE,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7F,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"response-headers.js","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAchD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAA6B;IAC3F,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;QAC1C,uDAAuD;QACvD,OAAM;IACR,CAAC;IACD,IAAI,WAAmB,CAAA;IACvB,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,WAAW,GAAG,qCAAqC,CAAA;IACrD,CAAC;SAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB;;;;WAIG;QACH,WAAW,GAAG,qBAAqB,CAAA;IACrC,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,mBAAmB,GAAG,EAAE,CAAA;IACxC,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAAA;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAgG;IACnK,MAAM,KAAK,GAAG,QAAQ,IAAI,GAAG,CAAA,CAAC,mDAAmD;IAEjF,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,iBAAiB,CAAC,kFAAkF,CAAC,CAAA;IACjH,CAAC;IACD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,iBAAiB,CAAC,oFAAoF,CAAC,CAAA;IACnH,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,0BAA0B;QAC1B,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,KAAK,EAAE,CAAA;QAC3B,CAAC;QACD,OAAO,SAAS,SAAS,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAA;IACzD,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,wBAAwB;QACxB,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,KAAK,EAAE,CAAA;QAC3B,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAA;QACxB,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,CAAC,CAAA;QAE/B,OAAO,SAAS,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC5C,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,uDAAuD;QACvD,OAAO,WAAW,KAAK,EAAE,CAAA;IAC3B,CAAC;IAED,OAAO,SAAS,SAAS,IAAI,OAAO,IAAI,KAAK,EAAE,CAAA;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAE,QAAkB,EAAE,SAAiB;IACjE,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7F,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helia/verified-fetch",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.2",
|
|
4
4
|
"description": "A fetch-like API for obtaining verified & trustless IPFS content on the web",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/ipfs/helia-verified-fetch/tree/main/packages/verified-fetch#readme",
|
|
@@ -147,50 +147,50 @@
|
|
|
147
147
|
"release": "aegir release"
|
|
148
148
|
},
|
|
149
149
|
"dependencies": {
|
|
150
|
-
"@helia/block-brokers": "^4.0.
|
|
151
|
-
"@helia/car": "^4.0.
|
|
152
|
-
"@helia/delegated-routing-v1-http-api-client": "^4.2.
|
|
153
|
-
"@helia/interface": "^5.
|
|
154
|
-
"@helia/ipns": "^8.0
|
|
155
|
-
"@helia/routers": "^
|
|
156
|
-
"@helia/unixfs": "^4.0.
|
|
157
|
-
"@ipld/dag-cbor": "^9.2.
|
|
158
|
-
"@ipld/dag-json": "^10.2.
|
|
159
|
-
"@ipld/dag-pb": "^4.1.
|
|
160
|
-
"@libp2p/interface": "^2.
|
|
161
|
-
"@libp2p/kad-dht": "^14.
|
|
162
|
-
"@libp2p/logger": "^5.1.
|
|
163
|
-
"@libp2p/peer-id": "^5.0.
|
|
164
|
-
"@libp2p/webrtc": "^5.0
|
|
165
|
-
"@libp2p/websockets": "^9.
|
|
150
|
+
"@helia/block-brokers": "^4.0.4",
|
|
151
|
+
"@helia/car": "^4.0.2",
|
|
152
|
+
"@helia/delegated-routing-v1-http-api-client": "^4.2.2",
|
|
153
|
+
"@helia/interface": "^5.2.0",
|
|
154
|
+
"@helia/ipns": "^8.1.0",
|
|
155
|
+
"@helia/routers": "^3.0.0",
|
|
156
|
+
"@helia/unixfs": "^4.0.2",
|
|
157
|
+
"@ipld/dag-cbor": "^9.2.2",
|
|
158
|
+
"@ipld/dag-json": "^10.2.3",
|
|
159
|
+
"@ipld/dag-pb": "^4.1.3",
|
|
160
|
+
"@libp2p/interface": "^2.5.0",
|
|
161
|
+
"@libp2p/kad-dht": "^14.2.5",
|
|
162
|
+
"@libp2p/logger": "^5.1.8",
|
|
163
|
+
"@libp2p/peer-id": "^5.0.12",
|
|
164
|
+
"@libp2p/webrtc": "^5.1.0",
|
|
165
|
+
"@libp2p/websockets": "^9.1.5",
|
|
166
166
|
"@multiformats/dns": "^1.0.6",
|
|
167
|
-
"cborg": "^4.2.
|
|
167
|
+
"cborg": "^4.2.8",
|
|
168
168
|
"hashlru": "^2.3.0",
|
|
169
|
-
"helia": "^5.1
|
|
169
|
+
"helia": "^5.2.1",
|
|
170
170
|
"interface-blockstore": "^5.3.1",
|
|
171
171
|
"interface-datastore": "^8.3.1",
|
|
172
172
|
"ipfs-unixfs-exporter": "^13.6.1",
|
|
173
|
-
"ipns": "^10.0.
|
|
173
|
+
"ipns": "^10.0.1",
|
|
174
174
|
"it-map": "^3.1.1",
|
|
175
175
|
"it-pipe": "^3.0.1",
|
|
176
176
|
"it-tar": "^6.0.5",
|
|
177
177
|
"it-to-browser-readablestream": "^2.0.9",
|
|
178
|
-
"libp2p": "^2.2
|
|
178
|
+
"libp2p": "^2.6.2",
|
|
179
179
|
"lru-cache": "^11.0.2",
|
|
180
|
-
"multiformats": "^13.3.
|
|
180
|
+
"multiformats": "^13.3.2",
|
|
181
181
|
"progress-events": "^1.0.1",
|
|
182
182
|
"uint8arrays": "^5.1.0"
|
|
183
183
|
},
|
|
184
184
|
"devDependencies": {
|
|
185
|
-
"@helia/dag-cbor": "^4.0.
|
|
186
|
-
"@helia/dag-json": "^4.0.
|
|
187
|
-
"@helia/http": "^2.0.
|
|
188
|
-
"@helia/json": "^4.0.
|
|
189
|
-
"@ipld/car": "^5.
|
|
190
|
-
"@libp2p/crypto": "^5.0.
|
|
185
|
+
"@helia/dag-cbor": "^4.0.2",
|
|
186
|
+
"@helia/dag-json": "^4.0.2",
|
|
187
|
+
"@helia/http": "^2.0.4",
|
|
188
|
+
"@helia/json": "^4.0.2",
|
|
189
|
+
"@ipld/car": "^5.4.0",
|
|
190
|
+
"@libp2p/crypto": "^5.0.11",
|
|
191
191
|
"@sgtpooki/file-type": "^1.0.1",
|
|
192
192
|
"@types/sinon": "^17.0.3",
|
|
193
|
-
"aegir": "^45.0.
|
|
193
|
+
"aegir": "^45.0.9",
|
|
194
194
|
"blockstore-core": "^5.0.2",
|
|
195
195
|
"browser-readablestream-to-it": "^2.0.7",
|
|
196
196
|
"datastore-core": "^10.0.2",
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { code as dagPbCode } from '@ipld/dag-pb'
|
|
2
2
|
import { dirIndexHtml } from '../utils/dir-index-html.js'
|
|
3
|
-
import { okResponse } from '../utils/responses.js'
|
|
4
3
|
import { BasePlugin } from './plugin-base.js'
|
|
5
4
|
import type { PluginContext, VerifiedFetchPluginFactory } from './types.js'
|
|
6
5
|
|
|
@@ -35,9 +34,16 @@ export class DirIndexHtmlPlugin extends BasePlugin {
|
|
|
35
34
|
|
|
36
35
|
const gatewayURL = resource
|
|
37
36
|
const htmlResponse = dirIndexHtml(terminalElement, directoryEntries, { gatewayURL, log: this.log })
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
|
|
38
|
+
return new Response(htmlResponse, {
|
|
39
|
+
status: 200,
|
|
40
|
+
statusText: 'OK',
|
|
41
|
+
headers: {
|
|
42
|
+
'Content-Type': 'text/html',
|
|
43
|
+
// see https://github.com/ipfs/gateway-conformance/pull/219
|
|
44
|
+
'Cache-Control': 'public, max-age=604800, stale-while-revalidate=2678400'
|
|
45
|
+
}
|
|
46
|
+
})
|
|
41
47
|
}
|
|
42
48
|
}
|
|
43
49
|
|
|
@@ -117,72 +117,69 @@ export const dirIndexHtml = (dir: UnixFSEntry, items: UnixFSEntry[], { gatewayUR
|
|
|
117
117
|
hash: dir.cid.toString()
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
return
|
|
121
|
-
<!DOCTYPE html>
|
|
122
|
-
<!--{{ $root := . }}-->
|
|
120
|
+
return `<!DOCTYPE html>
|
|
123
121
|
<html lang="en">
|
|
124
|
-
<head>
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
</head>
|
|
132
|
-
<body>
|
|
133
|
-
<!--
|
|
134
|
-
# Some JSON content for debugging:
|
|
135
|
-
|
|
136
|
-
## dirData
|
|
137
|
-
${JSON.stringify(dirData, null, 2)}
|
|
138
|
-
-->
|
|
139
|
-
<header id="header">
|
|
140
|
-
<div class="ipfs-logo"> </div>
|
|
122
|
+
<head>
|
|
123
|
+
<meta charset="utf-8">
|
|
124
|
+
<meta name="description" content="A directory of content-addressed files hosted on IPFS.">
|
|
125
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
126
|
+
<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlo89/56ZQ/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUjDu1lo89/6mhTP+zrVP/nplD/5+aRK8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNiIS6Wjz3/ubFY/761W/+vp1D/urRZ/8vDZf/GvmH/nplD/1BNIm8AAAAAAAAAAAAAAAAAAAAAAAAAAJaPPf+knEj/vrVb/761W/++tVv/r6dQ/7q0Wf/Lw2X/y8Nl/8vDZf+tpk7/nplD/wAAAAAAAAAAAAAAAJaPPf+2rVX/vrVb/761W/++tVv/vrVb/6+nUP+6tFn/y8Nl/8vDZf/Lw2X/y8Nl/8G6Xv+emUP/AAAAAAAAAACWjz3/vrVb/761W/++tVv/vrVb/761W/+vp1D/urRZ/8vDZf/Lw2X/y8Nl/8vDZf/Lw2X/nplD/wAAAAAAAAAAlo89/761W/++tVv/vrVb/761W/++tVv/r6dQ/7q0Wf/Lw2X/y8Nl/8vDZf/Lw2X/y8Nl/56ZQ/8AAAAAAAAAAJaPPf++tVv/vrVb/761W/++tVv/vbRa/5aPPf+emUP/y8Nl/8vDZf/Lw2X/y8Nl/8vDZf+emUP/AAAAAAAAAACWjz3/vrVb/761W/++tVv/vrVb/5qTQP+inkb/op5G/6KdRv/Lw2X/y8Nl/8vDZf/Lw2X/nplD/wAAAAAAAAAAlo89/761W/++tVv/sqlS/56ZQ//LxWb/0Mlp/9DJaf/Kw2X/oJtE/7+3XP/Lw2X/y8Nl/56ZQ/8AAAAAAAAAAJaPPf+9tFr/mJE+/7GsUv/Rymr/0cpq/9HKav/Rymr/0cpq/9HKav+xrFL/nplD/8vDZf+emUP/AAAAAAAAAACWjz3/op5G/9HKav/Rymr/0cpq/9HKav/Rymr/0cpq/9HKav/Rymr/0cpq/9HKav+inkb/nplD/wAAAAAAAAAAAAAAAKKeRv+3slb/0cpq/9HKav/Rymr/0cpq/9HKav/Rymr/0cpq/9HKav+1sFX/op5G/wAAAAAAAAAAAAAAAAAAAAAAAAAAop5GUKKeRv/Nxmf/0cpq/9HKav/Rymr/0cpq/83GZ/+inkb/op5GSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAop5G16KeRv/LxWb/y8Vm/6KeRv+inkaPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAop5G/6KeRtcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/n8AAPgfAADwDwAAwAMAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAwAMAAPAPAAD4HwAA/n8AAA==">
|
|
127
|
+
<title>${dirData.path}</title>
|
|
128
|
+
<style>${style}</style>
|
|
129
|
+
</head>
|
|
130
|
+
<body>
|
|
141
131
|
<!--
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
132
|
+
# Some JSON content for debugging:
|
|
133
|
+
|
|
134
|
+
## dirData
|
|
135
|
+
${JSON.stringify(dirData, null, 2)}
|
|
146
136
|
-->
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
<
|
|
151
|
-
<
|
|
152
|
-
|
|
137
|
+
<header id="header">
|
|
138
|
+
<div class="ipfs-logo"> </div>
|
|
139
|
+
<!--
|
|
140
|
+
<nav>
|
|
141
|
+
<a href="https://ipfs.tech" target="_blank" rel="noopener noreferrer">About<span class="dn-mobile"> IPFS</span></a>
|
|
142
|
+
<a href="https://docs.ipfs.tech/install/" target="_blank" rel="noopener noreferrer">Install<span class="dn-mobile"> IPFS</span></a>
|
|
143
|
+
</nav>
|
|
144
|
+
-->
|
|
145
|
+
</header>
|
|
146
|
+
<main id="main">
|
|
147
|
+
<header class="flex flex-wrap">
|
|
148
|
+
<div>
|
|
149
|
+
<strong>${dirListingTitle(dirData)}</strong>
|
|
150
|
+
${dirData.hash == null
|
|
151
|
+
? ''
|
|
152
|
+
: `<div class="ipfs-hash" translate="no">
|
|
153
|
+
${dirData.hash}
|
|
154
|
+
</div>`
|
|
155
|
+
}
|
|
156
|
+
</div>
|
|
157
|
+
${dirData.size == null
|
|
153
158
|
? ''
|
|
154
|
-
: `<div class="
|
|
155
|
-
|
|
159
|
+
: `<div class="nowrap flex-shrink ml-auto">
|
|
160
|
+
<strong title="Cumulative size of IPFS DAG (data + metadata)"> ${dirData.size}</strong>
|
|
156
161
|
</div>`
|
|
157
162
|
}
|
|
163
|
+
</header>
|
|
164
|
+
<div>
|
|
165
|
+
<div class="grid dir">
|
|
166
|
+
<!--{{ if .BackLink }}
|
|
167
|
+
<div class="type-icon">
|
|
168
|
+
<div class="ipfs-_blank"> </div>
|
|
169
|
+
</div>
|
|
170
|
+
<div>
|
|
171
|
+
<a href="{{.BackLink | urlEscape}}">..</a>
|
|
172
|
+
</div>
|
|
173
|
+
<div></div>
|
|
174
|
+
<div></div>
|
|
175
|
+
</tr>
|
|
176
|
+
{{ end }}-->
|
|
177
|
+
${getAllDirListingRows(dirData)}
|
|
178
|
+
</div>
|
|
158
179
|
</div>
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
<strong title="Cumulative size of IPFS DAG (data + metadata)"> ${dirData.size}</strong>
|
|
163
|
-
</div>`
|
|
164
|
-
}
|
|
165
|
-
</header>
|
|
166
|
-
<section>
|
|
167
|
-
<div class="grid dir">
|
|
168
|
-
<!--{{ if .BackLink }}
|
|
169
|
-
<div class="type-icon">
|
|
170
|
-
<div class="ipfs-_blank"> </div>
|
|
171
|
-
</div>
|
|
172
|
-
<div>
|
|
173
|
-
<a href="{{.BackLink | urlEscape}}">..</a>
|
|
174
|
-
</div>
|
|
175
|
-
<div></div>
|
|
176
|
-
<div></div>
|
|
177
|
-
</tr>
|
|
178
|
-
{{ end }}-->
|
|
179
|
-
${getAllDirListingRows(dirData)}
|
|
180
|
-
</div>
|
|
181
|
-
</section>
|
|
182
|
-
</main>
|
|
183
|
-
</body>
|
|
184
|
-
</html>
|
|
185
|
-
`
|
|
180
|
+
</main>
|
|
181
|
+
</body>
|
|
182
|
+
</html>`
|
|
186
183
|
}
|
|
187
184
|
|
|
188
185
|
const style = `
|
|
@@ -20,6 +20,10 @@ interface CacheControlHeaderOptions {
|
|
|
20
20
|
* @see https://specs.ipfs.tech/http-gateways/path-gateway/#cache-control-response-header
|
|
21
21
|
*/
|
|
22
22
|
export function setCacheControlHeader ({ ttl, protocol, response }: CacheControlHeaderOptions): void {
|
|
23
|
+
if (response.headers.has('cache-control')) {
|
|
24
|
+
// don't set the header if it's already set by a plugin
|
|
25
|
+
return
|
|
26
|
+
}
|
|
23
27
|
let headerValue: string
|
|
24
28
|
if (protocol === 'ipfs') {
|
|
25
29
|
headerValue = 'public, max-age=29030400, immutable'
|