Skip to content
This repository has been archived by the owner on Sep 10, 2019. It is now read-only.

Commit

Permalink
feat(index): add serialize/deserialize option
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanomackey authored and jlengstorf committed Apr 9, 2018
1 parent a39cb65 commit 4449311
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 57 deletions.
37 changes: 35 additions & 2 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ initSevenBoom([...customErrorFields]);
* @param {string?} config.graphqlModel which GraphQL model errored
* @param {string?} config.targetEndpoint where data was loaded from
* @param {string?} config.docsLink link to help docs
* @return {Error} SevenBoom error for output
* @param {boolean?} serializeError whether to serialize the error into JSON
* @return {Error} SevenBoom error for output, or normal Error if serialized
*/
export function GrampsError(
{
Expand All @@ -75,6 +76,7 @@ export function GrampsError(
targetEndpoint = null,
docsLink = null,
} = {},
serializeError = false,
) {
const httpErrorCode = statusCode || error.statusCode || 500;

Expand All @@ -94,7 +96,17 @@ export function GrampsError(
]);

// Call the function and spread the args array into individual arguments.
return SevenBoom[fn](...args);
const boom = SevenBoom[fn](...args);

// If specified, serialize the error into a JSON string so it can be parsed later.
if (serializeError) {
const serializedBoom = JSON.stringify(boom);

return Error(serializedBoom);
}

// Otherwise, just return the error.
return boom;
}

/**
Expand Down Expand Up @@ -196,6 +208,27 @@ export const formatClientErrorData = error => {
return error;
};

/**
* Attempts to deserialize a stringified error message.
* @param {Error} error
* @return {Error}
*/
export const deserializeError = error => {
// If the error message is valid JSON, we convert it back to a GrAMPS error.
try {
const deserialized = JSON.parse(error.message);
const payload = deserialized.output.payload;

return GrampsError({
...payload,
error: Error(),
});
} catch (exception) {
// If not, we just pass it through
return error;
}
};

/**
* Custom error formatting for the GraphQL server.
* @see http://dev.apollodata.com/tools/apollo-server/setup.html#graphqlOptions
Expand Down
54 changes: 54 additions & 0 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
formatClientErrorData,
printDetailedServerLog,
handleQueryErrors,
deserializeError,
} from '../src';

const defaultLogger = {
Expand Down Expand Up @@ -286,5 +287,58 @@ describe('GrAMPS Errors', () => {
);
expect(error.output.payload.docsLink).toBe('https://example.org/docs');
});

it('serializes errors', () => {
const payload = {
statusCode: 418,
message: 'error message',
description: 'error description',
graphqlModel: 'TestModel',
targetEndpoint: 'https://example.org/test/endpoint',
docsLink: 'https://example.org/docs',
};

const serializedError = GrampsError(payload, true);
const deserializedError = JSON.parse(serializedError.message);

expect(deserializedError.isBoom).toBe(true);
expect(deserializedError.output.statusCode).toBe(418);
expect(deserializedError.output.payload.message).toBe('error message');
expect(deserializedError.output.payload.description).toBe(
'error description',
);
expect(deserializedError.output.payload.graphqlModel).toBe('TestModel');
expect(deserializedError.output.payload.targetEndpoint).toBe(
'https://example.org/test/endpoint',
);
expect(deserializedError.output.payload.docsLink).toBe(
'https://example.org/docs',
);
});
});

describe('deserializeError()', () => {
it('can deserialize errors', () => {
const payload = {
statusCode: 418,
message: 'error message',
description: 'error description',
graphqlModel: 'TestModel',
targetEndpoint: 'https://example.org/test/endpoint',
docsLink: 'https://example.org/docs',
};

const serializedError = GrampsError(payload, true);
const deserializedError = deserializeError(serializedError);

expect(deserializedError.message).toBe('error message');
});

it('can handle invalid json', () => {
const regularError = Error('Whoops! Something went wrong.');
const deserializedError = deserializeError(regularError);

expect(deserializedError.message).toBe('Whoops! Something went wrong.');
});
});
});
75 changes: 20 additions & 55 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,6 @@ acorn@^5.1.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7"

agent-base@2:
version "2.1.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7"
dependencies:
extend "~3.0.0"
semver "~5.0.1"

agent-base@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.1.1.tgz#92d8a4fc2524a3b09b3666a33b6c97960f23d6a4"
Expand Down Expand Up @@ -1400,7 +1393,7 @@ dateformat@^1.0.11, dateformat@^1.0.12:
get-stdin "^4.0.1"
meow "^3.3.0"

debug@2, debug@^2.2.0, debug@^2.4.1, debug@^2.6.8, debug@^2.6.9:
debug@^2.2.0, debug@^2.4.1, debug@^2.6.8, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
Expand Down Expand Up @@ -1750,7 +1743,7 @@ expect@^21.2.1:
jest-message-util "^21.2.1"
jest-regex-util "^21.2.0"

extend@3, extend@~3.0.0, extend@~3.0.1:
extend@~3.0.0, extend@~3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"

Expand Down Expand Up @@ -1850,13 +1843,6 @@ flat-cache@^1.2.1:
graceful-fs "^4.1.2"
write "^0.2.1"

follow-redirects@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-0.0.7.tgz#34b90bab2a911aa347571da90f22bd36ecd8a919"
dependencies:
debug "^2.2.0"
stream-consume "^0.1.0"

follow-redirects@1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.5.tgz#ffd3e14cbdd5eaa72f61b6368c1f68516c2a26cc"
Expand Down Expand Up @@ -2052,15 +2038,6 @@ gitconfiglocal@^1.0.0:
dependencies:
ini "^1.3.2"

github@^11.0.0:
version "11.0.0"
resolved "https://registry.yarnpkg.com/github/-/github-11.0.0.tgz#edb32df5efb33cad004ebf0bdd2a4b30bb63a854"
dependencies:
follow-redirects "0.0.7"
https-proxy-agent "^1.0.0"
mime "^1.2.11"
netrc "^0.1.4"

github@^12.0.0:
version "12.0.1"
resolved "https://registry.yarnpkg.com/github/-/github-12.0.1.tgz#4f7467434d8d01152782e669e925b3115aa0b219"
Expand Down Expand Up @@ -2154,8 +2131,8 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"

graphql-apollo-errors@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/graphql-apollo-errors/-/graphql-apollo-errors-2.0.2.tgz#af6724924520b6727e7820cb13b31886fd520a6f"
version "2.0.3"
resolved "https://registry.yarnpkg.com/graphql-apollo-errors/-/graphql-apollo-errors-2.0.3.tgz#c4e0c605e0581a9514b3d3e03218328f2c4700bb"
dependencies:
lodash "^4.17.4"
minilog "^3.1.0"
Expand Down Expand Up @@ -2253,8 +2230,8 @@ hoek@2.x.x:
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"

hoek@4.x.x:
version "4.2.0"
resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
version "4.2.1"
resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"

home-or-tmp@^2.0.0:
version "2.0.0"
Expand Down Expand Up @@ -2289,14 +2266,6 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"

https-proxy-agent@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6"
dependencies:
agent-base "2"
debug "2"
extend "3"

https-proxy-agent@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.0.tgz#1391bee7fd66aeabc0df2a1fa90f58954f43e443"
Expand Down Expand Up @@ -3109,10 +3078,14 @@ lodash.templatesettings@^4.0.0:
dependencies:
lodash._reinterpolate "~3.0.0"

lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
lodash@^4.0.0, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"

lodash@^4.17.4:
version "4.17.5"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"

lodash@~1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.3.1.tgz#a4663b53686b895ff074e2ba504dfb76a8e2b770"
Expand Down Expand Up @@ -3218,10 +3191,6 @@ mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7:
dependencies:
mime-db "~1.30.0"

mime@^1.2.11:
version "1.4.1"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"

mime@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.0.3.tgz#4353337854747c48ea498330dc034f9f4bbbcc0b"
Expand Down Expand Up @@ -4066,9 +4035,9 @@ sax@^1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"

semantic-release@^8.0.3:
version "8.2.0"
resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-8.2.0.tgz#972aa3a7246065d8a405991005a210e46995d4b6"
semantic-release@^8.2.0:
version "8.2.3"
resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-8.2.3.tgz#a746a0a588be1c24aa8c212ee8dc3bda9ec85d46"
dependencies:
"@semantic-release/commit-analyzer" "^3.0.1"
"@semantic-release/condition-travis" "^6.0.0"
Expand All @@ -4078,7 +4047,7 @@ semantic-release@^8.0.3:
execa "^0.8.0"
fs-extra "^4.0.2"
git-head "^1.2.1"
github "^11.0.0"
github "^12.0.0"
lodash "^4.0.0"
nerf-dart "^1.0.0"
nopt "^4.0.0"
Expand All @@ -4104,10 +4073,6 @@ semver-diff@^2.0.0:
version "4.3.6"
resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"

semver@~5.0.1:
version "5.0.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a"

set-blocking@^2.0.0, set-blocking@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
Expand Down Expand Up @@ -4234,10 +4199,6 @@ ssri@^4.1.2:
dependencies:
safe-buffer "^5.1.0"

stream-consume@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f"

string-length@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
Expand Down Expand Up @@ -4562,10 +4523,14 @@ util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"

uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
uuid@^3.0.0, uuid@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"

uuid@^3.0.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"

v8flags@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
Expand Down

0 comments on commit 4449311

Please sign in to comment.