@helia/verified-fetch 2.4.0 → 2.5.1
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/README.md +192 -0
- package/dist/index.min.js +354 -32
- package/dist/src/index.d.ts +198 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +192 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugins/errors.d.ts +25 -0
- package/dist/src/plugins/errors.d.ts.map +1 -0
- package/dist/src/plugins/errors.js +33 -0
- package/dist/src/plugins/errors.js.map +1 -0
- package/dist/src/plugins/index.d.ts +8 -0
- package/dist/src/plugins/index.d.ts.map +1 -0
- package/dist/src/plugins/index.js +7 -0
- package/dist/src/plugins/index.js.map +1 -0
- package/dist/src/plugins/plugin-base.d.ts +19 -0
- package/dist/src/plugins/plugin-base.d.ts.map +1 -0
- package/dist/src/plugins/plugin-base.js +26 -0
- package/dist/src/plugins/plugin-base.js.map +1 -0
- package/dist/src/plugins/plugin-handle-car.d.ts +11 -0
- package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -0
- package/dist/src/plugins/plugin-handle-car.js +28 -0
- package/dist/src/plugins/plugin-handle-car.js.map +1 -0
- package/dist/src/plugins/plugin-handle-dag-cbor.d.ts +11 -0
- package/dist/src/plugins/plugin-handle-dag-cbor.d.ts.map +1 -0
- package/dist/src/plugins/plugin-handle-dag-cbor.js +73 -0
- package/dist/src/plugins/plugin-handle-dag-cbor.js.map +1 -0
- package/dist/src/plugins/plugin-handle-dag-pb.d.ts +15 -0
- package/dist/src/plugins/plugin-handle-dag-pb.d.ts.map +1 -0
- package/dist/src/plugins/plugin-handle-dag-pb.js +152 -0
- package/dist/src/plugins/plugin-handle-dag-pb.js.map +1 -0
- package/dist/src/plugins/plugin-handle-dag-walk.d.ts +16 -0
- package/dist/src/plugins/plugin-handle-dag-walk.d.ts.map +1 -0
- package/dist/src/plugins/plugin-handle-dag-walk.js +45 -0
- package/dist/src/plugins/plugin-handle-dag-walk.js.map +1 -0
- package/dist/src/plugins/plugin-handle-dir-index-html.d.ts +9 -0
- package/dist/src/plugins/plugin-handle-dir-index-html.d.ts.map +1 -0
- package/dist/src/plugins/plugin-handle-dir-index-html.js +42 -0
- package/dist/src/plugins/plugin-handle-dir-index-html.js.map +1 -0
- package/dist/src/plugins/plugin-handle-ipns-record.d.ts +12 -0
- package/dist/src/plugins/plugin-handle-ipns-record.d.ts.map +1 -0
- package/dist/src/plugins/plugin-handle-ipns-record.js +62 -0
- package/dist/src/plugins/plugin-handle-ipns-record.js.map +1 -0
- package/dist/src/plugins/plugin-handle-json.d.ts +11 -0
- package/dist/src/plugins/plugin-handle-json.d.ts.map +1 -0
- package/dist/src/plugins/plugin-handle-json.js +51 -0
- package/dist/src/plugins/plugin-handle-json.js.map +1 -0
- package/dist/src/plugins/plugin-handle-raw.d.ts +8 -0
- package/dist/src/plugins/plugin-handle-raw.d.ts.map +1 -0
- package/dist/src/plugins/plugin-handle-raw.js +80 -0
- package/dist/src/plugins/plugin-handle-raw.js.map +1 -0
- package/dist/src/plugins/plugin-handle-tar.d.ts +12 -0
- package/dist/src/plugins/plugin-handle-tar.d.ts.map +1 -0
- package/dist/src/plugins/plugin-handle-tar.js +36 -0
- package/dist/src/plugins/plugin-handle-tar.js.map +1 -0
- package/dist/src/plugins/plugins.d.ts +5 -0
- package/dist/src/plugins/plugins.d.ts.map +1 -0
- package/dist/src/plugins/plugins.js +5 -0
- package/dist/src/plugins/plugins.js.map +1 -0
- package/dist/src/plugins/types.d.ts +68 -0
- package/dist/src/plugins/types.d.ts.map +1 -0
- package/dist/src/plugins/types.js +2 -0
- package/dist/src/plugins/types.js.map +1 -0
- package/dist/src/types.d.ts +0 -27
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +1 -2
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/dir-index-html.d.ts +16 -0
- package/dist/src/utils/dir-index-html.d.ts.map +1 -0
- package/dist/src/utils/dir-index-html.js +384 -0
- package/dist/src/utils/dir-index-html.js.map +1 -0
- package/dist/src/utils/get-e-tag.d.ts +1 -1
- package/dist/src/utils/get-e-tag.d.ts.map +1 -1
- package/dist/src/utils/get-e-tag.js +18 -3
- package/dist/src/utils/get-e-tag.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/dist/src/utils/walk-path.d.ts +3 -2
- package/dist/src/utils/walk-path.d.ts.map +1 -1
- package/dist/src/utils/walk-path.js +1 -1
- package/dist/src/utils/walk-path.js.map +1 -1
- package/dist/src/verified-fetch.d.ts +6 -24
- package/dist/src/verified-fetch.d.ts.map +1 -1
- package/dist/src/verified-fetch.js +164 -387
- package/dist/src/verified-fetch.js.map +1 -1
- package/dist/typedoc-urls.json +32 -24
- package/package.json +6 -2
- package/src/index.ts +199 -0
- package/src/plugins/errors.ts +37 -0
- package/src/plugins/index.ts +8 -0
- package/src/plugins/plugin-base.ts +30 -0
- package/src/plugins/plugin-handle-car.ts +32 -0
- package/src/plugins/plugin-handle-dag-cbor.ts +84 -0
- package/src/plugins/plugin-handle-dag-pb.ts +168 -0
- package/src/plugins/plugin-handle-dag-walk.ts +53 -0
- package/src/plugins/plugin-handle-dir-index-html.ts +50 -0
- package/src/plugins/plugin-handle-ipns-record.ts +69 -0
- package/src/plugins/plugin-handle-json.ts +57 -0
- package/src/plugins/plugin-handle-raw.ts +92 -0
- package/src/plugins/plugin-handle-tar.ts +44 -0
- package/src/plugins/plugins.ts +4 -0
- package/src/plugins/types.ts +73 -0
- package/src/types.ts +0 -34
- package/src/utils/dir-index-html.ts +442 -0
- package/src/utils/get-e-tag.ts +20 -3
- package/src/utils/response-headers.ts +4 -0
- package/src/utils/walk-path.ts +3 -3
- package/src/verified-fetch.ts +187 -430
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
// see https://github.com/ipfs/boxo/blob/09b0013e1c3e09468009b02dfc9b2b9041199d5d/gateway/assets/templates.go#L19C1-L25C2
|
|
2
|
+
function iconFromExt(name) {
|
|
3
|
+
// not implemented yet
|
|
4
|
+
// TODO: optimize icons: https://github.com/ipfs-shipyard/ipfs-css/issues/71
|
|
5
|
+
return 'ipfs-_blank';
|
|
6
|
+
}
|
|
7
|
+
function itemShortHashCell(item, dirData) {
|
|
8
|
+
const href = dirData.globalData.dnsLink ? `https://inbrowser.dev/ipfs/${item.hash}` : `${dirData.globalData.gatewayURL}/ipfs/${item.hash}?filename=${item.name}`;
|
|
9
|
+
return `<a class="ipfs-hash" translate="no" href="${href}">${item.shortHash}</a>`;
|
|
10
|
+
}
|
|
11
|
+
function dirListingTitle(dirData) {
|
|
12
|
+
if (dirData.path != null) {
|
|
13
|
+
const href = `${dirData.globalData.gatewayURL}/${dirData.path}`;
|
|
14
|
+
return `Index of <a href="${href}">${dirData.name}</a>`;
|
|
15
|
+
}
|
|
16
|
+
return `Index of ${dirData.name} ${dirData.path}`;
|
|
17
|
+
}
|
|
18
|
+
function getAllDirListingRows(dirData) {
|
|
19
|
+
return dirData.listing.map((item) => `<div class="type-icon">
|
|
20
|
+
<div class="${iconFromExt(item.name)}"> </div>
|
|
21
|
+
</div>
|
|
22
|
+
<div>
|
|
23
|
+
<a href="${item.path}">${item.name}</a>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="nowrap">
|
|
26
|
+
${itemShortHashCell(item, dirData)}
|
|
27
|
+
</div>
|
|
28
|
+
<div class="nowrap" title="Cumulative size of IPFS DAG (data + metadata)">${item.size}</div>`).join(' ');
|
|
29
|
+
}
|
|
30
|
+
function getItemPath(item) {
|
|
31
|
+
const itemPathParts = item.path.split('/');
|
|
32
|
+
return itemPathParts.pop() ?? item.path;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* todo: https://github.com/ipfs/boxo/blob/09b0013e1c3e09468009b02dfc9b2b9041199d5d/gateway/handler_unixfs_dir.go#L200-L208
|
|
36
|
+
*
|
|
37
|
+
* @see https://github.com/ipfs/boxo/blob/09b0013e1c3e09468009b02dfc9b2b9041199d5d/gateway/assets/directory.html
|
|
38
|
+
* @see https://github.com/ipfs/boxo/pull/298
|
|
39
|
+
* @see https://github.com/ipfs/kubo/pull/8555
|
|
40
|
+
*/
|
|
41
|
+
export const dirIndexHtml = (dir, items, { gatewayURL, dnsLink, log }) => {
|
|
42
|
+
log('loading directory html for %s', dir.path);
|
|
43
|
+
const dirData = {
|
|
44
|
+
globalData: {
|
|
45
|
+
gatewayURL,
|
|
46
|
+
dnsLink: dnsLink ?? false
|
|
47
|
+
},
|
|
48
|
+
listing: items.map((item) => {
|
|
49
|
+
return {
|
|
50
|
+
size: item.size.toString(),
|
|
51
|
+
name: item.name,
|
|
52
|
+
path: getItemPath(item),
|
|
53
|
+
hash: item.cid.toString(),
|
|
54
|
+
shortHash: item.cid.toString().slice(0, 8)
|
|
55
|
+
};
|
|
56
|
+
}),
|
|
57
|
+
name: dir.name,
|
|
58
|
+
size: dir.size.toString(),
|
|
59
|
+
path: dir.path,
|
|
60
|
+
breadcrumbs: [],
|
|
61
|
+
backLink: '',
|
|
62
|
+
hash: dir.cid.toString()
|
|
63
|
+
};
|
|
64
|
+
return `<!DOCTYPE html>
|
|
65
|
+
<html lang="en">
|
|
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>
|
|
75
|
+
<!--
|
|
76
|
+
# Some JSON content for debugging:
|
|
77
|
+
|
|
78
|
+
## dirData
|
|
79
|
+
${JSON.stringify(dirData, null, 2)}
|
|
80
|
+
-->
|
|
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
|
|
95
|
+
? ''
|
|
96
|
+
: `<div class="ipfs-hash" translate="no">
|
|
97
|
+
${dirData.hash}
|
|
98
|
+
</div>`}
|
|
99
|
+
</div>
|
|
100
|
+
${dirData.size == null
|
|
101
|
+
? ''
|
|
102
|
+
: `<div class="nowrap flex-shrink ml-auto">
|
|
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>
|
|
121
|
+
</div>
|
|
122
|
+
</main>
|
|
123
|
+
</body>
|
|
124
|
+
</html>`;
|
|
125
|
+
};
|
|
126
|
+
const style = `
|
|
127
|
+
|
|
128
|
+
.ipfs-_blank {
|
|
129
|
+
background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72 100'%3E%3ClinearGradient id='a' gradientUnits='userSpaceOnUse' x1='36' y1='1' x2='36' y2='99' gradientTransform='matrix(1 0 0 -1 0 100)'%3E%3Cstop offset='0' stop-color='%23c8d4db'/%3E%3Cstop offset='.139' stop-color='%23d8e1e6'/%3E%3Cstop offset='.359' stop-color='%23ebf0f3'/%3E%3Cstop offset='.617' stop-color='%23f9fafb'/%3E%3Cstop offset='1' stop-color='%23fff'/%3E%3C/linearGradient%3E%3Cpath d='M45 1l27 26.7V99H0V1h45z' fill='url(%23a)'/%3E%3Cpath d='M45 1l27 26.7V99H0V1h45z' fill-opacity='0' stroke='%237191a1' stroke-width='2'/%3E%3ClinearGradient id='b' gradientUnits='userSpaceOnUse' x1='45.068' y1='72.204' x2='58.568' y2='85.705' gradientTransform='matrix(1 0 0 -1 0 100)'%3E%3Cstop offset='0' stop-color='%23fff'/%3E%3Cstop offset='.35' stop-color='%23fafbfb'/%3E%3Cstop offset='.532' stop-color='%23edf1f4'/%3E%3Cstop offset='.675' stop-color='%23dde5e9'/%3E%3Cstop offset='.799' stop-color='%23c7d3da'/%3E%3Cstop offset='.908' stop-color='%23adbdc7'/%3E%3Cstop offset='1' stop-color='%2392a5b0'/%3E%3C/linearGradient%3E%3Cpath d='M45 1l27 26.7H45V1z' fill='url(%23b)'/%3E%3Cpath d='M45 1l27 26.7H45V1z' fill-opacity='0' stroke='%237191a1' stroke-width='2' stroke-linejoin='bevel'/%3E%3C/svg%3E");
|
|
130
|
+
background-repeat: no-repeat;
|
|
131
|
+
background-size: contain
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
:root {
|
|
135
|
+
--sans-serif: "Plex",system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;
|
|
136
|
+
--monospace: Consolas, monaco, monospace;
|
|
137
|
+
--navy: #073a53;
|
|
138
|
+
--teal: #6bc4ce;
|
|
139
|
+
--turquoise: #47AFB4;
|
|
140
|
+
--steel-gray: #3f5667;
|
|
141
|
+
--dark-white: #d9dbe2;
|
|
142
|
+
--light-white: #edf0f4;
|
|
143
|
+
--near-white: #f7f8fa;
|
|
144
|
+
--radius: 4px;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
body {
|
|
148
|
+
color: #34373f;
|
|
149
|
+
font-family: var(--sans-serif);
|
|
150
|
+
line-height: 1.43;
|
|
151
|
+
margin: 0;
|
|
152
|
+
word-break: break-all;
|
|
153
|
+
-webkit-text-size-adjust: 100%;
|
|
154
|
+
-ms-text-size-adjust: 100%;
|
|
155
|
+
-webkit-tap-highlight-color: transparent;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
pre, code {
|
|
159
|
+
font-family: var(--monospace);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
a {
|
|
163
|
+
color: #117eb3;
|
|
164
|
+
text-decoration: none;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
a:hover {
|
|
168
|
+
color: #00b0e9;
|
|
169
|
+
text-decoration: underline;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
a:active,a:visited {
|
|
173
|
+
color: #00b0e9;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.flex {
|
|
177
|
+
display: flex;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.flex-wrap {
|
|
181
|
+
flex-flow: wrap;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.flex-shrink {
|
|
185
|
+
flex-shrink: 1;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.ml-auto {
|
|
189
|
+
margin-left: auto;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.nowrap {
|
|
193
|
+
white-space: nowrap
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.ipfs-hash {
|
|
197
|
+
color: #7f8491;
|
|
198
|
+
font-family: var(--monospace);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
#header {
|
|
202
|
+
align-items: center;
|
|
203
|
+
background: var(--navy);
|
|
204
|
+
border-bottom: 4px solid var(--teal);
|
|
205
|
+
color: #fff;
|
|
206
|
+
display: flex;
|
|
207
|
+
font-weight: 500;
|
|
208
|
+
justify-content: space-between;
|
|
209
|
+
padding: 0 1em;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
#header a {
|
|
213
|
+
color: var(--teal);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
#header a:active {
|
|
217
|
+
color: #9ad4db;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
#header a:hover {
|
|
221
|
+
color: #fff;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
#header .ipfs-logo {
|
|
225
|
+
height: 2.25em;
|
|
226
|
+
margin: .7em .7em .7em 0;
|
|
227
|
+
width: 7.15em
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
#header nav {
|
|
231
|
+
align-items: center;
|
|
232
|
+
display: flex;
|
|
233
|
+
margin: .65em 0;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
#header nav a {
|
|
237
|
+
margin: 0 .6em;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
#header nav a:last-child {
|
|
241
|
+
margin: 0 0 0 .6em;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
#header nav svg {
|
|
245
|
+
fill: var(--teal);
|
|
246
|
+
height: 1.8em;
|
|
247
|
+
margin-top: .125em;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
#header nav svg:hover {
|
|
251
|
+
fill: #fff;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
main {
|
|
255
|
+
border: 1px solid var(--dark-white);
|
|
256
|
+
border-radius: var(--radius);
|
|
257
|
+
overflow: hidden;
|
|
258
|
+
margin: 1em;
|
|
259
|
+
font-size: .875em;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
main header,main .container {
|
|
263
|
+
padding-left: 1em;
|
|
264
|
+
padding-right: 1em;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
main header {
|
|
268
|
+
padding-top: .7em;
|
|
269
|
+
padding-bottom: .7em;
|
|
270
|
+
background-color: var(--light-white);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
main header,main section:not(:last-child) {
|
|
274
|
+
border-bottom: 1px solid var(--dark-white);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
main section header {
|
|
278
|
+
background-color: var(--near-white);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.grid {
|
|
282
|
+
display: grid;
|
|
283
|
+
overflow-x: auto;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.grid .grid {
|
|
287
|
+
overflow-x: visible;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.grid > div {
|
|
291
|
+
padding: .7em;
|
|
292
|
+
border-bottom: 1px solid var(--dark-white);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.grid.dir {
|
|
296
|
+
grid-template-columns: min-content 1fr min-content min-content;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.grid.dir > div:nth-of-type(4n+1) {
|
|
300
|
+
padding-left: 1em;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.grid.dir > div:nth-of-type(4n+4) {
|
|
304
|
+
padding-right: 1em;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.grid.dir > div:nth-last-child(-n+4) {
|
|
308
|
+
border-bottom: 0;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.grid.dir > div:nth-of-type(8n+5),.grid.dir > div:nth-of-type(8n+6),.grid.dir > div:nth-of-type(8n+7),.grid.dir > div:nth-of-type(8n+8) {
|
|
312
|
+
background-color: var(--near-white);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.grid.dag {
|
|
316
|
+
grid-template-columns: max-content 1fr;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.grid.dag pre {
|
|
320
|
+
margin: 0;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.grid.dag .grid {
|
|
324
|
+
padding: 0;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.grid.dag > div:nth-last-child(-n+2) {
|
|
328
|
+
border-bottom: 0;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.grid.dag > div {
|
|
332
|
+
background: white
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.grid.dag > div:nth-child(4n),.grid.dag > div:nth-child(4n+3) {
|
|
336
|
+
background-color: var(--near-white);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
section > .grid.dag > div:nth-of-type(2n+1) {
|
|
340
|
+
padding-left: 1em;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.type-icon,.type-icon > * {
|
|
344
|
+
width: 1.15em
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.terminal {
|
|
348
|
+
background: var(--steel-gray);
|
|
349
|
+
color: white;
|
|
350
|
+
padding: .7em;
|
|
351
|
+
border-radius: var(--radius);
|
|
352
|
+
word-wrap: break-word;
|
|
353
|
+
white-space: break-spaces;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
@media print {
|
|
357
|
+
#header {
|
|
358
|
+
display: none;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
#main header,.ipfs-hash,body {
|
|
362
|
+
color: #000;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
#main,#main header {
|
|
366
|
+
border-color: #000;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
a,a:visited {
|
|
370
|
+
color: #000;
|
|
371
|
+
text-decoration: underline;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
a[href]:after {
|
|
375
|
+
content: " (" attr(href) ")"
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
@media only screen and (max-width: 500px) {
|
|
380
|
+
.dn-mobile {
|
|
381
|
+
display: none;
|
|
382
|
+
}
|
|
383
|
+
}`;
|
|
384
|
+
//# sourceMappingURL=dir-index-html.js.map
|
|
@@ -0,0 +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;;;;;;;aAOI,OAAO,CAAC,IAAI;aACZ,KAAK;;;;;;;MAOZ,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;oBAclB,eAAe,CAAC,OAAO,CAAC;YAChC,OAAO,CAAC,IAAI,IAAI,IAAI;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;kBACI,OAAO,CAAC,IAAI;qBAEpB;;UAEA,OAAO,CAAC,IAAI,IAAI,IAAI;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;oFACwE,OAAO,CAAC,IAAI;mBAExF;;;;;;;;;;;;;;;YAeI,oBAAoB,CAAC,OAAO,CAAC;;;;;QAKjC,CAAA;AACR,CAAC,CAAA;AAED,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiQR,CAAA"}
|
|
@@ -17,7 +17,7 @@ interface GetETagArg {
|
|
|
17
17
|
/**
|
|
18
18
|
* etag
|
|
19
19
|
* you need to wrap cid with ""
|
|
20
|
-
* we use strong Etags for immutable responses and weak one (prefixed with W/ ) for mutable/generated ones (ipns and generated HTML).
|
|
20
|
+
* we use strong Etags for immutable responses and weak one (prefixed with W/ ) for mutable/generated ones (ipns, car, tar, and generated HTML).
|
|
21
21
|
* block and car responses should have different etag than deserialized one, so you can add some prefix like we do in existing gateway
|
|
22
22
|
*
|
|
23
23
|
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-e-tag.d.ts","sourceRoot":"","sources":["../../../src/utils/get-e-tag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,UAAU,UAAU;IAClB,GAAG,EAAE,GAAG,CAAA;IACR,SAAS,CAAC,EAAE,sBAAsB,CAAA;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;
|
|
1
|
+
{"version":3,"file":"get-e-tag.d.ts","sourceRoot":"","sources":["../../../src/utils/get-e-tag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,UAAU,UAAU;IAClB,GAAG,EAAE,GAAG,CAAA;IACR,SAAS,CAAC,EAAE,sBAAsB,CAAA;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,UAAU,GAAG,MAAM,CAQ3F"}
|
|
@@ -1,15 +1,30 @@
|
|
|
1
|
+
const getPrefix = ({ weak, reqFormat }) => {
|
|
2
|
+
if (reqFormat === 'tar' || reqFormat === 'car' || reqFormat === 'ipns-record' || weak === true) {
|
|
3
|
+
return 'W/';
|
|
4
|
+
}
|
|
5
|
+
return '';
|
|
6
|
+
};
|
|
7
|
+
const getFormatSuffix = ({ reqFormat }) => {
|
|
8
|
+
if (reqFormat == null) {
|
|
9
|
+
return '';
|
|
10
|
+
}
|
|
11
|
+
if (reqFormat === 'tar') {
|
|
12
|
+
return '.x-tar';
|
|
13
|
+
}
|
|
14
|
+
return `.${reqFormat}`;
|
|
15
|
+
};
|
|
1
16
|
/**
|
|
2
17
|
* etag
|
|
3
18
|
* you need to wrap cid with ""
|
|
4
|
-
* we use strong Etags for immutable responses and weak one (prefixed with W/ ) for mutable/generated ones (ipns and generated HTML).
|
|
19
|
+
* we use strong Etags for immutable responses and weak one (prefixed with W/ ) for mutable/generated ones (ipns, car, tar, and generated HTML).
|
|
5
20
|
* block and car responses should have different etag than deserialized one, so you can add some prefix like we do in existing gateway
|
|
6
21
|
*
|
|
7
22
|
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag
|
|
8
23
|
* @see https://specs.ipfs.tech/http-gateways/path-gateway/#etag-response-header
|
|
9
24
|
*/
|
|
10
25
|
export function getETag({ cid, reqFormat, weak, rangeStart, rangeEnd }) {
|
|
11
|
-
const prefix = weak
|
|
12
|
-
let suffix = reqFormat
|
|
26
|
+
const prefix = getPrefix({ weak, reqFormat });
|
|
27
|
+
let suffix = getFormatSuffix({ reqFormat });
|
|
13
28
|
if (rangeStart != null || rangeEnd != null) {
|
|
14
29
|
suffix += `.${rangeStart ?? '0'}-${rangeEnd ?? 'N'}`;
|
|
15
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-e-tag.js","sourceRoot":"","sources":["../../../src/utils/get-e-tag.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-e-tag.js","sourceRoot":"","sources":["../../../src/utils/get-e-tag.ts"],"names":[],"mappings":"AAiBA,MAAM,SAAS,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAuB,EAAU,EAAE;IACrE,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,aAAa,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC/F,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,EAAE,SAAS,EAAuB,EAAU,EAAE;IACrE,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,OAAO,IAAI,SAAS,EAAE,CAAA;AACxB,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAc;IACjF,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;IAC7C,IAAI,MAAM,GAAG,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;IAC3C,IAAI,UAAU,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,IAAI,UAAU,IAAI,GAAG,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAA;IACtD,CAAC;IAED,OAAO,GAAG,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,MAAM,GAAG,CAAA;AAChD,CAAC"}
|
|
@@ -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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Logger } from '@libp2p/interface';
|
|
2
2
|
import { type Blockstore } from 'interface-blockstore';
|
|
3
3
|
import { type ExporterOptions, type ReadableStorage, type ObjectNode, type UnixFSEntry } from 'ipfs-unixfs-exporter';
|
|
4
|
-
import {
|
|
4
|
+
import type { PluginContext } from '../plugins/types.js';
|
|
5
5
|
import type { CID } from 'multiformats/cid';
|
|
6
6
|
export interface PathWalkerOptions extends ExporterOptions {
|
|
7
7
|
}
|
|
@@ -18,8 +18,9 @@ export declare function isObjectNode(node: UnixFSEntry): node is ObjectNode;
|
|
|
18
18
|
* If the signal is aborted, the function will throw an AbortError
|
|
19
19
|
* If a terminal element is not found, a notFoundResponse is returned
|
|
20
20
|
* If another unknown error occurs, a badGatewayResponse is returned
|
|
21
|
+
*
|
|
21
22
|
*/
|
|
22
|
-
export declare function handlePathWalking({ cid, path, resource, options, blockstore, log }:
|
|
23
|
+
export declare function handlePathWalking({ cid, path, resource, options, blockstore, log }: PluginContext & {
|
|
23
24
|
blockstore: Blockstore;
|
|
24
25
|
log: Logger;
|
|
25
26
|
}): Promise<PathWalkerResponse | Response>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walk-path.d.ts","sourceRoot":"","sources":["../../../src/utils/walk-path.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAA4B,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"walk-path.d.ts","sourceRoot":"","sources":["../../../src/utils/walk-path.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAA4B,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAE9I,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,WAAW,iBAAkB,SAAQ,eAAe;CAEzD;AACD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,GAAG,EAAE,CAAA;IAChB,eAAe,EAAE,WAAW,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;CACtG;AAqBD,wBAAgB,YAAY,CAAE,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,UAAU,CAEnE;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,aAAa,GAAG;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,GAAG,QAAQ,CAAC,CAY3L"}
|
|
@@ -2,7 +2,6 @@ import { DoesNotExistError } from '@helia/unixfs/errors';
|
|
|
2
2
|
import {} from '@libp2p/interface';
|
|
3
3
|
import {} from 'interface-blockstore';
|
|
4
4
|
import { walkPath as exporterWalk } from 'ipfs-unixfs-exporter';
|
|
5
|
-
import {} from '../types.js';
|
|
6
5
|
import { badGatewayResponse, notFoundResponse } from './responses.js';
|
|
7
6
|
async function walkPath(blockstore, path, options) {
|
|
8
7
|
const ipfsRoots = [];
|
|
@@ -27,6 +26,7 @@ export function isObjectNode(node) {
|
|
|
27
26
|
* If the signal is aborted, the function will throw an AbortError
|
|
28
27
|
* If a terminal element is not found, a notFoundResponse is returned
|
|
29
28
|
* If another unknown error occurs, a badGatewayResponse is returned
|
|
29
|
+
*
|
|
30
30
|
*/
|
|
31
31
|
export async function handlePathWalking({ cid, path, resource, options, blockstore, log }) {
|
|
32
32
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walk-path.js","sourceRoot":"","sources":["../../../src/utils/walk-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAmB,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAiF,MAAM,sBAAsB,CAAA;AAC9I,OAAO,
|
|
1
|
+
{"version":3,"file":"walk-path.js","sourceRoot":"","sources":["../../../src/utils/walk-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAmB,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAiF,MAAM,sBAAsB,CAAA;AAC9I,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAgBrE,KAAK,UAAU,QAAQ,CAAE,UAA2B,EAAE,IAAY,EAAE,OAA2B;IAC7F,MAAM,SAAS,GAAU,EAAE,CAAA;IAC3B,IAAI,eAAwC,CAAA;IAE5C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACzB,eAAe,GAAG,KAAK,CAAA;IACzB,CAAC;IAED,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO;QACL,SAAS;QACT,eAAe;KAChB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAE,IAAiB;IAC7C,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAA;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAA2D;IACjJ,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAA;IACzE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,IAAI,CAAC,aAAa,EAAE,yBAAyB,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnF,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACnC,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QAC7C,OAAO,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC"}
|
|
@@ -13,32 +13,9 @@ export declare class VerifiedFetch {
|
|
|
13
13
|
private readonly blockstoreSessions;
|
|
14
14
|
private serverTimingHeaders;
|
|
15
15
|
private readonly withServerTiming;
|
|
16
|
+
private readonly plugins;
|
|
16
17
|
constructor({ helia, ipns }: VerifiedFetchComponents, init?: CreateVerifiedFetchOptions);
|
|
17
18
|
private getBlockstore;
|
|
18
|
-
/**
|
|
19
|
-
* Accepts an `ipns://...` or `https?://<ipnsname>.ipns.<domain>` URL as a string and returns a `Response` containing
|
|
20
|
-
* a raw IPNS record.
|
|
21
|
-
*/
|
|
22
|
-
private handleIPNSRecord;
|
|
23
|
-
/**
|
|
24
|
-
* Accepts a `CID` and returns a `Response` with a body stream that is a CAR
|
|
25
|
-
* of the `DAG` referenced by the `CID`.
|
|
26
|
-
*/
|
|
27
|
-
private handleCar;
|
|
28
|
-
/**
|
|
29
|
-
* Accepts a UnixFS `CID` and returns a `.tar` file containing the file or
|
|
30
|
-
* directory structure referenced by the `CID`.
|
|
31
|
-
*/
|
|
32
|
-
private handleTar;
|
|
33
|
-
private handleJson;
|
|
34
|
-
private handleDagCbor;
|
|
35
|
-
private handleDagPb;
|
|
36
|
-
private handleRaw;
|
|
37
|
-
/**
|
|
38
|
-
* If the user has not specified an Accept header or format query string arg,
|
|
39
|
-
* use the CID codec to choose an appropriate handler for the block data.
|
|
40
|
-
*/
|
|
41
|
-
private readonly codecHandlers;
|
|
42
19
|
private handleServerTiming;
|
|
43
20
|
/**
|
|
44
21
|
* The last place a Response touches in verified-fetch before being returned to the user. This is where we add the
|
|
@@ -46,6 +23,11 @@ export declare class VerifiedFetch {
|
|
|
46
23
|
* response before it is returned to the user.
|
|
47
24
|
*/
|
|
48
25
|
private handleFinalResponse;
|
|
26
|
+
/**
|
|
27
|
+
* Runs plugins in a loop. After each plugin that returns `null` (partial/no final),
|
|
28
|
+
* we re-check `canHandle()` for all plugins in the next iteration if the context changed.
|
|
29
|
+
*/
|
|
30
|
+
private runPluginPipeline;
|
|
49
31
|
/**
|
|
50
32
|
* We're starting to get to the point where we need a queue or pipeline of
|
|
51
33
|
* operations to perform and a single place to handle errors.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,IAAI,EAAE,MAAM,aAAa,CAAA;AAyB1D,OAAO,KAAK,EAAgC,0BAA0B,EAAE,QAAQ,EAAkB,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAG/J,OAAO,KAAK,EAAE,KAAK,EAAqB,MAAM,kBAAkB,CAAA;AAMhE,UAAU,uBAAuB;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AA8BD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;IACjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqC;IACxE,OAAO,CAAC,mBAAmB,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAEvC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,uBAAuB,EAAE,IAAI,CAAC,EAAE,0BAA0B;IAoDxF,OAAO,CAAC,aAAa;YAgBP,kBAAkB;IAahC;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAkD3B;;;OAGG;YACW,iBAAiB;IA8E/B;;;;;;OAMG;IACG,KAAK,CAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAqEhF;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAI7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|