Skip to content

Commit b98cf75

Browse files
committed
added plugin code, pending connections and examples
1 parent 4d1f721 commit b98cf75

File tree

5 files changed

+239
-1
lines changed

5 files changed

+239
-1
lines changed

package-lock.json

Lines changed: 130 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
"version": "1.0.0",
44
"description": "A hapijs plugin to generate signed url for response objects",
55
"main": "index.js",
6+
"engines": {
7+
"node": "14.x",
8+
"npm": "6.x.x"
9+
},
610
"scripts": {
711
"start": "npx ts-node src/index.ts",
812
"pretty": "npx prettier '**/*.{json,js,ts,md}' --write",
@@ -23,5 +27,11 @@
2327
"bugs": {
2428
"url": "https://github.com/AP-Atul/hapi-signed-url/issues"
2529
},
26-
"homepage": "https://github.com/AP-Atul/hapi-signed-url#readme"
30+
"homepage": "https://github.com/AP-Atul/hapi-signed-url#readme",
31+
"dependencies": {
32+
"prettier": "^2.7.1",
33+
"ramda": "^0.28.0",
34+
"ts-node": "^10.9.1",
35+
"typescript": "^4.7.4"
36+
}
2737
}

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// TODO: add the plugin export
2+
console.log('Hello world');

src/signedUrl/plugin.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import * as _ from 'ramda';
2+
import { RouteOptions } from './types';
3+
4+
const isPluginActive = (request): boolean => {
5+
return (
6+
(request.route.settings.plugins &&
7+
request.route.settings.plugins.signedUrl) ||
8+
false
9+
);
10+
};
11+
12+
const isResponseAbsent = (request): boolean => {
13+
const response = request.response;
14+
return (
15+
response.statusCode !== 200 ||
16+
_.isEmpty(response.source) ||
17+
_.isNil(response.source)
18+
);
19+
};
20+
21+
const getRouteOptions = (request, getSignedUrl): RouteOptions => {
22+
const options = request.route.settings.plugins.signedUrl;
23+
const source = options.pathToSource
24+
? _.view(options.pathToSource, request.response.source)
25+
: request.response.source;
26+
return {
27+
...options,
28+
source: source,
29+
getSignedUrl: getSignedUrl,
30+
};
31+
};
32+
33+
const updateSignedUrl = async (options: RouteOptions) => {
34+
const { source, lenses, getSignedUrl } = options;
35+
const toUpdateLinks: string[] = lenses.map((lens) => _.view(lens, source));
36+
const promises = toUpdateLinks.map(
37+
async (link: string) => await getSignedUrl(link),
38+
);
39+
const updatedLinks = await Promise.all(promises);
40+
const updatedSource = updatedLinks.reduce((source, link, index) => {
41+
return _.set(lenses[index], link, source);
42+
}, source);
43+
return updatedSource as object;
44+
};
45+
46+
const processSource = async (options: RouteOptions) => {
47+
// single object
48+
if (_.type(options.source) !== 'Array') {
49+
return updateSignedUrl(options);
50+
}
51+
52+
// if source is array
53+
const promises = (options.source as any[]).map(async (src) => {
54+
return updateSignedUrl({
55+
...options,
56+
source: src,
57+
});
58+
});
59+
return Promise.all(promises);
60+
};
61+
62+
const signUrl = (getSignedUrl) => async (request, h) => {
63+
if (!isPluginActive(request)) {
64+
return h.continue;
65+
}
66+
if (isResponseAbsent(request)) {
67+
return h.continue;
68+
}
69+
70+
const routeOptions = getRouteOptions(request, getSignedUrl);
71+
const updated = await processSource(routeOptions);
72+
const updatedSource = routeOptions.pathToSource
73+
? _.set(routeOptions.pathToSource, updated, request.response.source)
74+
: updated;
75+
76+
request.response.source = updatedSource;
77+
return h.continue;
78+
};
79+
80+
export const signedUrl = {
81+
name: 'signedUrl',
82+
version: '1.0.0',
83+
register: async function (server, options) {
84+
server.ext('onPreResponse', signUrl(options.getSignedUrl));
85+
},
86+
};

src/signedUrl/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export interface RouteOptions {
2+
// lenses for properties to update
3+
lenses: any[];
4+
// path from which source to extract
5+
pathToSource: any;
6+
// source object can also be array
7+
source: object | any[];
8+
// function to generate signed urls
9+
getSignedUrl(key: string): Promise<string>;
10+
}

0 commit comments

Comments
 (0)