1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
|
"use strict";
import jwt from "jsonwebtoken";
function expect(value) {
return {
toEqual: expected => {
if (typeof value === "object") {
if (typeof expected === "object") {
for (const propertyName in expected) {
expect(value[propertyName]).toEqual(expected[propertyName]);
}
return;
}
throw new Error(`Expected ${value} to strictly equal ${expected}`);
}
if (value !== expected) {
throw new Error(`Expected ${value} to equal ${expected}`);
}
},
toStrictEqual: expected => {
if (typeof value === "object") {
if (typeof expected === "object") {
for (const propertyName in expected) {
expect(value[propertyName]).toStrictEqual(expected[propertyName]);
}
return;
}
throw new Error(`Expected ${value} to strictly equal ${expected}`);
}
if (value !== expected) {
throw new Error(`Expected ${value} to strictly equal ${expected}`);
}
},
};
}
/**
* Correctly report errors that occur in an asynchronous callback
* @param {function(err): void} done The mocha callback
* @param {function(): void} testFunction The assertions function
*/
function asyncCheck(done, testFunction) {
try {
testFunction();
done();
} catch (err) {
done(err);
}
}
/**
* Base64-url encode a string
* @param str {string} The string to encode
* @returns {string} The encoded string
*/
function base64UrlEncode(str) {
return Buffer.from(str).toString("base64").replace(/[=]/g, "").replace(/\+/g, "-").replace(/\//g, "_");
}
/**
* Verify a JWT, ensuring that the asynchronous and synchronous calls to `verify` have the same result
* @param {string} jwtString The JWT as a string
* @param {string} secretOrPrivateKey The shared secret or private key
* @param {object} options Verify options
* @param {function(err, token):void} callback
*/
function verifyJWTHelper(jwtString, secretOrPrivateKey, options, callback) {
let error;
let syncVerified;
try {
syncVerified = jwt.verify(jwtString, secretOrPrivateKey, options);
} catch (err) {
error = err;
}
jwt.verify(jwtString, secretOrPrivateKey, options, (err, asyncVerifiedToken) => {
if (error) {
callback(err);
} else {
expect(syncVerified).toStrictEqual(asyncVerifiedToken);
callback(null, syncVerified);
}
});
}
/**
* Sign a payload to create a JWT, ensuring that the asynchronous and synchronous calls to `sign` have the same result
* @param {object} payload The JWT payload
* @param {string} secretOrPrivateKey The shared secret or private key
* @param {object} options Sign options
* @param {function(err, token):void} callback
*/
function signJWTHelper(payload, secretOrPrivateKey, options, callback) {
let error;
let syncSigned;
try {
syncSigned = jwt.sign(payload, secretOrPrivateKey, options);
} catch (err) {
error = err;
}
jwt.sign(payload, secretOrPrivateKey, options, (err, asyncSigned) => {
if (error) {
callback(err);
} else {
expect(syncSigned).toEqual(asyncSigned);
callback(null, syncSigned);
}
});
}
export { asyncCheck, base64UrlEncode, signJWTHelper, verifyJWTHelper };
export default {
asyncCheck,
base64UrlEncode,
signJWTHelper,
verifyJWTHelper,
};
|