@eik/core 1.3.54 → 1.3.55
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/lib/classes/alias.js +48 -48
- package/lib/classes/asset.js +99 -92
- package/lib/classes/author.js +20 -20
- package/lib/classes/http-incoming.js +52 -52
- package/lib/classes/http-outgoing.js +84 -83
- package/lib/classes/meta.js +20 -23
- package/lib/classes/package.js +73 -70
- package/lib/classes/versions.js +62 -60
- package/lib/handlers/alias.delete.js +125 -120
- package/lib/handlers/alias.get.js +92 -87
- package/lib/handlers/alias.post.js +196 -203
- package/lib/handlers/alias.put.js +196 -202
- package/lib/handlers/auth.post.js +95 -93
- package/lib/handlers/map.get.js +110 -111
- package/lib/handlers/map.put.js +256 -231
- package/lib/handlers/pkg.get.js +120 -122
- package/lib/handlers/pkg.log.js +112 -110
- package/lib/handlers/pkg.put.js +223 -213
- package/lib/handlers/versions.get.js +92 -101
- package/lib/main.js +47 -47
- package/lib/multipart/form-field.js +20 -23
- package/lib/multipart/form-file.js +22 -24
- package/lib/multipart/parser.js +231 -217
- package/lib/sinks/mem-entry.js +26 -31
- package/lib/sinks/test.js +287 -273
- package/lib/utils/defaults.js +11 -11
- package/lib/utils/globals.js +5 -5
- package/lib/utils/healthcheck.js +131 -108
- package/lib/utils/path-builders-fs.js +61 -29
- package/lib/utils/path-builders-uri.js +26 -18
- package/lib/utils/utils.js +76 -79
- package/package.json +20 -15
- package/types/classes/alias.d.ts +28 -0
- package/types/classes/asset.d.ts +48 -0
- package/types/classes/author.d.ts +17 -0
- package/types/classes/http-incoming.d.ts +37 -0
- package/types/classes/http-outgoing.d.ts +20 -0
- package/types/classes/meta.d.ts +17 -0
- package/types/classes/package.d.ts +40 -0
- package/types/classes/versions.d.ts +28 -0
- package/types/handlers/alias.delete.d.ts +33 -0
- package/types/handlers/alias.get.d.ts +48 -0
- package/types/handlers/alias.post.d.ts +83 -0
- package/types/handlers/alias.put.d.ts +83 -0
- package/types/handlers/auth.post.d.ts +82 -0
- package/types/handlers/map.get.d.ts +51 -0
- package/types/handlers/map.put.d.ts +78 -0
- package/types/handlers/pkg.get.d.ts +51 -0
- package/types/handlers/pkg.log.d.ts +51 -0
- package/types/handlers/pkg.put.d.ts +107 -0
- package/types/handlers/versions.get.d.ts +48 -0
- package/types/main.d.ts +44 -0
- package/types/multipart/form-field.d.ts +17 -0
- package/types/multipart/form-file.d.ts +17 -0
- package/types/multipart/parser.d.ts +52 -0
- package/types/sinks/mem-entry.d.ts +15 -0
- package/types/sinks/test.d.ts +32 -0
- package/types/utils/defaults.d.ts +9 -0
- package/types/utils/globals.d.ts +8 -0
- package/types/utils/healthcheck.d.ts +24 -0
- package/types/utils/path-builders-fs.d.ts +41 -0
- package/types/utils/path-builders-uri.d.ts +26 -0
- package/types/utils/utils.d.ts +6 -0
package/lib/handlers/pkg.put.js
CHANGED
|
@@ -1,219 +1,229 @@
|
|
|
1
|
-
import { validators } from
|
|
2
|
-
import originalUrl from
|
|
3
|
-
import HttpError from
|
|
4
|
-
import Metrics from
|
|
5
|
-
import abslog from
|
|
1
|
+
import { validators } from "@eik/common";
|
|
2
|
+
import originalUrl from "original-url";
|
|
3
|
+
import HttpError from "http-errors";
|
|
4
|
+
import Metrics from "@metrics/client";
|
|
5
|
+
import abslog from "abslog";
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import
|
|
8
|
+
createFilePathToPackage,
|
|
9
|
+
createFilePathToVersion,
|
|
10
|
+
createFilePathToEikJson,
|
|
11
|
+
} from "../utils/path-builders-fs.js";
|
|
12
|
+
import {
|
|
13
|
+
decodeUriComponent,
|
|
14
|
+
writeJSON,
|
|
15
|
+
readJSON,
|
|
16
|
+
readEikJson,
|
|
17
|
+
} from "../utils/utils.js";
|
|
18
|
+
import { createURIPathToPkgLog } from "../utils/path-builders-uri.js";
|
|
19
|
+
import MultipartParser from "../multipart/parser.js";
|
|
20
|
+
import HttpIncoming from "../classes/http-incoming.js";
|
|
21
|
+
import HttpOutgoing from "../classes/http-outgoing.js";
|
|
22
|
+
import Versions from "../classes/versions.js";
|
|
23
|
+
import Package from "../classes/package.js";
|
|
24
|
+
import Author from "../classes/author.js";
|
|
25
|
+
import config from "../utils/defaults.js";
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @typedef {object} PkgPutOptions
|
|
29
|
+
* @property {number} [pkgMaxFileSize=10000000]
|
|
30
|
+
* @property {string} [cacheControl]
|
|
31
|
+
* @property {Array<[string, string]>} [organizations] List of key-value pairs [hostname, organization]
|
|
32
|
+
* @property {import("@eik/sink").default} [sink]
|
|
33
|
+
* @property {import("abslog").AbstractLoggerOptions} [logger]
|
|
34
|
+
*/
|
|
21
35
|
|
|
22
36
|
const PkgPut = class PkgPut {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
end({ labels: { status: outgoing.statusCode, type } });
|
|
215
|
-
|
|
216
|
-
return outgoing;
|
|
217
|
-
}
|
|
37
|
+
/**
|
|
38
|
+
* @param {PkgPutOptions} options
|
|
39
|
+
*/
|
|
40
|
+
constructor({
|
|
41
|
+
pkgMaxFileSize,
|
|
42
|
+
organizations,
|
|
43
|
+
cacheControl,
|
|
44
|
+
logger,
|
|
45
|
+
sink,
|
|
46
|
+
} = {}) {
|
|
47
|
+
this._pkgMaxFileSize = pkgMaxFileSize || config.pkgMaxFileSize;
|
|
48
|
+
this._organizations = organizations || config.organizations;
|
|
49
|
+
this._cacheControl = cacheControl;
|
|
50
|
+
this._sink = sink;
|
|
51
|
+
this._log = abslog(logger);
|
|
52
|
+
this._metrics = new Metrics();
|
|
53
|
+
this._histogram = this._metrics.histogram({
|
|
54
|
+
name: "eik_core_pkg_put_handler",
|
|
55
|
+
description:
|
|
56
|
+
"Histogram measuring time taken in @eik/core PkgPut handler method",
|
|
57
|
+
labels: {
|
|
58
|
+
success: true,
|
|
59
|
+
type: "unknown",
|
|
60
|
+
},
|
|
61
|
+
buckets: [0.005, 0.01, 0.06, 0.1, 0.6, 1.0, 2.0, 4.0],
|
|
62
|
+
});
|
|
63
|
+
this._orgRegistry = new Map(this._organizations);
|
|
64
|
+
|
|
65
|
+
this._multipart = new MultipartParser({
|
|
66
|
+
pkgMaxFileSize: this._pkgMaxFileSize,
|
|
67
|
+
legalFiles: ["package"],
|
|
68
|
+
sink: this._sink,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
get metrics() {
|
|
73
|
+
return this._metrics;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async _parser(incoming) {
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
this._multipart
|
|
79
|
+
.parse(incoming)
|
|
80
|
+
.then((result) => {
|
|
81
|
+
const pkg = new Package(incoming);
|
|
82
|
+
result.forEach((obj) => {
|
|
83
|
+
if (obj.constructor.name === "FormField") {
|
|
84
|
+
pkg.setMeta(obj);
|
|
85
|
+
}
|
|
86
|
+
if (obj.constructor.name === "FormFile") {
|
|
87
|
+
obj.value.forEach((o) => {
|
|
88
|
+
pkg.setAsset(o);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return pkg;
|
|
93
|
+
})
|
|
94
|
+
.then(async (pkg) => {
|
|
95
|
+
const path = createFilePathToPackage(pkg);
|
|
96
|
+
await writeJSON(this._sink, path, pkg, "application/json");
|
|
97
|
+
|
|
98
|
+
this._log.info(
|
|
99
|
+
`pkg:put - Successfully wrote package meta file to sink - Pathname: ${path}`,
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
resolve(pkg);
|
|
103
|
+
})
|
|
104
|
+
.catch((error) => {
|
|
105
|
+
reject(error);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async _readVersions(incoming) {
|
|
111
|
+
const path = createFilePathToVersion(incoming);
|
|
112
|
+
let versions;
|
|
113
|
+
try {
|
|
114
|
+
const obj = await readJSON(this._sink, path);
|
|
115
|
+
versions = new Versions(obj);
|
|
116
|
+
this._log.info(
|
|
117
|
+
`pkg:put - Successfully read version meta file from sink - Pathname: ${path}`,
|
|
118
|
+
);
|
|
119
|
+
// eslint-disable-next-line no-unused-vars
|
|
120
|
+
} catch (error) {
|
|
121
|
+
// File does not exist, its probably a new package
|
|
122
|
+
versions = new Versions(incoming);
|
|
123
|
+
this._log.info(
|
|
124
|
+
`pkg:put - Version meta file did not exist in sink - Create new - Pathname: ${path}`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
return versions;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async _readVersion(incoming) {
|
|
131
|
+
const path = createFilePathToEikJson(incoming);
|
|
132
|
+
try {
|
|
133
|
+
await readEikJson(this._sink, path);
|
|
134
|
+
this._log.info(
|
|
135
|
+
`pkg:put - Found version meta file from sink - Pathname: ${path}`,
|
|
136
|
+
);
|
|
137
|
+
return true;
|
|
138
|
+
// eslint-disable-next-line no-unused-vars
|
|
139
|
+
} catch (error) {
|
|
140
|
+
// File does not exist, its probably a new package
|
|
141
|
+
this._log.info(
|
|
142
|
+
`pkg:put - Did not find meta file in sink - Create new - Pathname: ${path}`,
|
|
143
|
+
);
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async _writeVersions(incoming, versions) {
|
|
149
|
+
const path = createFilePathToVersion(incoming);
|
|
150
|
+
await writeJSON(this._sink, path, versions, "application/json");
|
|
151
|
+
this._log.info(
|
|
152
|
+
`pkg:put - Successfully wrote version meta file to sink - Pathname: ${path}`,
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async handler(req, user, type, name, version) {
|
|
157
|
+
const end = this._histogram.timer();
|
|
158
|
+
|
|
159
|
+
const pVersion = decodeUriComponent(version);
|
|
160
|
+
const pName = decodeUriComponent(name);
|
|
161
|
+
|
|
162
|
+
try {
|
|
163
|
+
validators.version(pVersion);
|
|
164
|
+
validators.name(pName);
|
|
165
|
+
validators.type(type);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
this._log.info(`pkg:put - Validation failed - ${error.message}`);
|
|
168
|
+
const e = new HttpError.BadRequest();
|
|
169
|
+
end({ labels: { success: false, status: e.status } });
|
|
170
|
+
throw e;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const url = originalUrl(req);
|
|
174
|
+
const org = this._orgRegistry.get(url.hostname);
|
|
175
|
+
|
|
176
|
+
if (!org) {
|
|
177
|
+
this._log.info(
|
|
178
|
+
`pkg:put - Hostname does not match a configured organization - ${url.hostname}`,
|
|
179
|
+
);
|
|
180
|
+
const e = new HttpError.BadRequest();
|
|
181
|
+
end({ labels: { success: false, status: e.status, type } });
|
|
182
|
+
throw e;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const author = new Author(user);
|
|
186
|
+
|
|
187
|
+
const incoming = new HttpIncoming(req, {
|
|
188
|
+
version: pVersion,
|
|
189
|
+
author,
|
|
190
|
+
type,
|
|
191
|
+
name: pName,
|
|
192
|
+
org,
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const versionExists = await this._readVersion(incoming);
|
|
196
|
+
|
|
197
|
+
if (versionExists) {
|
|
198
|
+
this._log.info(
|
|
199
|
+
`pkg:put - Semver version already exists for the package - Org: ${org} - Name: ${pName} - Version: ${pVersion}`,
|
|
200
|
+
);
|
|
201
|
+
const e = new HttpError.Conflict();
|
|
202
|
+
end({ labels: { success: false, status: e.status, type } });
|
|
203
|
+
throw e;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const versions = await this._readVersions(incoming);
|
|
207
|
+
const pkg = await this._parser(incoming);
|
|
208
|
+
versions.setVersion(pVersion, pkg.integrity);
|
|
209
|
+
|
|
210
|
+
try {
|
|
211
|
+
await this._writeVersions(incoming, versions);
|
|
212
|
+
// eslint-disable-next-line no-unused-vars
|
|
213
|
+
} catch (error) {
|
|
214
|
+
const e = new HttpError.BadGateway();
|
|
215
|
+
end({ labels: { success: false, status: e.status, type } });
|
|
216
|
+
throw e;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const outgoing = new HttpOutgoing();
|
|
220
|
+
outgoing.cacheControl = this._cacheControl;
|
|
221
|
+
outgoing.statusCode = 303;
|
|
222
|
+
outgoing.location = createURIPathToPkgLog(pkg);
|
|
223
|
+
|
|
224
|
+
end({ labels: { status: outgoing.statusCode, type } });
|
|
225
|
+
|
|
226
|
+
return outgoing;
|
|
227
|
+
}
|
|
218
228
|
};
|
|
219
229
|
export default PkgPut;
|
|
@@ -1,118 +1,109 @@
|
|
|
1
|
-
import { validators } from
|
|
2
|
-
import originalUrl from
|
|
3
|
-
import HttpError from
|
|
4
|
-
import Metrics from
|
|
5
|
-
import abslog from
|
|
1
|
+
import { validators } from "@eik/common";
|
|
2
|
+
import originalUrl from "original-url";
|
|
3
|
+
import HttpError from "http-errors";
|
|
4
|
+
import Metrics from "@metrics/client";
|
|
5
|
+
import abslog from "abslog";
|
|
6
6
|
|
|
7
|
-
import { createFilePathToVersion } from
|
|
8
|
-
import { decodeUriComponent } from
|
|
9
|
-
import HttpOutgoing from
|
|
10
|
-
import config from
|
|
7
|
+
import { createFilePathToVersion } from "../utils/path-builders-fs.js";
|
|
8
|
+
import { decodeUriComponent } from "../utils/utils.js";
|
|
9
|
+
import HttpOutgoing from "../classes/http-outgoing.js";
|
|
10
|
+
import config from "../utils/defaults.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {object} VersionsGetOptions
|
|
14
|
+
* @property {string} [cacheControl="no-cache"]
|
|
15
|
+
* @property {boolean} [etag=true]
|
|
16
|
+
* @property {Array<[string, string]>} [organizations]
|
|
17
|
+
* @property {import("@eik/sink").default} [sink]
|
|
18
|
+
* @property {import("abslog").AbstractLoggerOptions} [logger]
|
|
19
|
+
*/
|
|
11
20
|
|
|
12
21
|
const VersionsGet = class VersionsGet {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
0.005,
|
|
36
|
-
0.01,
|
|
37
|
-
0.06,
|
|
38
|
-
0.1,
|
|
39
|
-
0.6,
|
|
40
|
-
1.0,
|
|
41
|
-
2.0,
|
|
42
|
-
4.0,
|
|
43
|
-
],
|
|
44
|
-
});
|
|
45
|
-
this._orgRegistry = new Map(this._organizations);
|
|
46
|
-
}
|
|
22
|
+
/**
|
|
23
|
+
* @param {VersionsGetOptions} options
|
|
24
|
+
*/
|
|
25
|
+
constructor({ organizations, cacheControl, logger, sink, etag } = {}) {
|
|
26
|
+
this._organizations = organizations || config.organizations;
|
|
27
|
+
this._cacheControl = cacheControl || "no-cache";
|
|
28
|
+
this._sink = sink;
|
|
29
|
+
this._etag = etag || config.etag;
|
|
30
|
+
this._log = abslog(logger);
|
|
31
|
+
this._metrics = new Metrics();
|
|
32
|
+
this._histogram = this._metrics.histogram({
|
|
33
|
+
name: "eik_core_versions_get_handler",
|
|
34
|
+
description:
|
|
35
|
+
"Histogram measuring time taken in @eik/core VersionsGet handler method",
|
|
36
|
+
labels: {
|
|
37
|
+
success: true,
|
|
38
|
+
type: "unknown",
|
|
39
|
+
},
|
|
40
|
+
buckets: [0.005, 0.01, 0.06, 0.1, 0.6, 1.0, 2.0, 4.0],
|
|
41
|
+
});
|
|
42
|
+
this._orgRegistry = new Map(this._organizations);
|
|
43
|
+
}
|
|
47
44
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
get metrics() {
|
|
46
|
+
return this._metrics;
|
|
47
|
+
}
|
|
51
48
|
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
async handler(req, type, name) {
|
|
50
|
+
const end = this._histogram.timer();
|
|
54
51
|
|
|
55
|
-
|
|
52
|
+
const pName = decodeUriComponent(name);
|
|
56
53
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
throw e;
|
|
67
|
-
}
|
|
54
|
+
try {
|
|
55
|
+
validators.name(pName);
|
|
56
|
+
validators.type(type);
|
|
57
|
+
} catch (error) {
|
|
58
|
+
this._log.debug(`pkg:latest - Validation failed - ${error.message}`);
|
|
59
|
+
const e = new HttpError.NotFound();
|
|
60
|
+
end({ labels: { success: false, status: e.status } });
|
|
61
|
+
throw e;
|
|
62
|
+
}
|
|
68
63
|
|
|
69
|
-
|
|
70
|
-
|
|
64
|
+
const url = originalUrl(req);
|
|
65
|
+
const org = this._orgRegistry.get(url.hostname);
|
|
71
66
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
67
|
+
if (!org) {
|
|
68
|
+
this._log.info(
|
|
69
|
+
`pkg:latest - Hostname does not match a configured organization - ${url.hostname}`,
|
|
70
|
+
);
|
|
71
|
+
const e = new HttpError.BadRequest();
|
|
72
|
+
end({ labels: { success: false, status: e.status, type } });
|
|
73
|
+
throw e;
|
|
74
|
+
}
|
|
75
|
+
const path = createFilePathToVersion({ org, type, name: pName });
|
|
79
76
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
77
|
+
try {
|
|
78
|
+
const file = await this._sink.read(path);
|
|
79
|
+
const outgoing = new HttpOutgoing();
|
|
80
|
+
outgoing.cacheControl = this._cacheControl;
|
|
81
|
+
outgoing.mimeType = "application/json";
|
|
85
82
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
83
|
+
if (this._etag) {
|
|
84
|
+
outgoing.etag = file.etag;
|
|
85
|
+
}
|
|
89
86
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
outgoing.statusCode = 200;
|
|
98
|
-
outgoing.stream = file.stream;
|
|
99
|
-
}
|
|
87
|
+
if (this._etag && req.headers["if-none-match"] === file.etag) {
|
|
88
|
+
outgoing.statusCode = 304;
|
|
89
|
+
file.stream.destroy();
|
|
90
|
+
} else {
|
|
91
|
+
outgoing.statusCode = 200;
|
|
92
|
+
outgoing.stream = file.stream;
|
|
93
|
+
}
|
|
100
94
|
|
|
101
|
-
|
|
102
|
-
`pkg:latest - Package log found - Pathname: ${path}`,
|
|
103
|
-
);
|
|
95
|
+
this._log.debug(`pkg:latest - Package log found - Pathname: ${path}`);
|
|
104
96
|
|
|
105
|
-
|
|
97
|
+
end({ labels: { status: outgoing.statusCode, type } });
|
|
106
98
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
99
|
+
return outgoing;
|
|
100
|
+
// eslint-disable-next-line no-unused-vars
|
|
101
|
+
} catch (error) {
|
|
102
|
+
this._log.debug(`pkg:latest - Package log found - Pathname: ${path}`);
|
|
103
|
+
const e = new HttpError.NotFound();
|
|
104
|
+
end({ labels: { success: false, status: e.status, type } });
|
|
105
|
+
throw e;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
117
108
|
};
|
|
118
109
|
export default VersionsGet;
|