UNPKG

5.56 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 return new (P || (P = Promise))(function (resolve, reject) {
4 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
7 step((generator = generator.apply(thisArg, _arguments || [])).next());
8 });
9};
10Object.defineProperty(exports, "__esModule", { value: true });
11// tslint:disable:max-classes-per-file
12/**
13 * transporters
14 */
15const createDebug = require("debug");
16const http_status_1 = require("http-status");
17const request = require("request");
18const debug = createDebug('coa-service:transporters');
19// tslint:disable-next-line
20const pkg = require('../package.json');
21/**
22 * リクエスト成功の場合のレスポンス本文のstatus属性の値
23 * 失敗の場合はstring型だが、成功の場合のみnumber型が返却されるので注意すること。
24 */
25const RESPONSE_BODY_STAUS_SUCCESS = 0;
26/**
27 * transporter abstract class
28 * トランスポーター抽象クラス
29 */
30class Transporter {
31}
32exports.Transporter = Transporter;
33/**
34 * COAServiceError
35 */
36class COAServiceError extends Error {
37 constructor(code, status, message) {
38 super(message);
39 this.name = 'COAServiceError';
40 this.code = code;
41 this.status = status;
42 }
43}
44exports.COAServiceError = COAServiceError;
45/**
46 * DefaultTransporter
47 */
48class DefaultTransporter {
49 constructor(expectedStatusCodes) {
50 this.expectedStatusCodes = expectedStatusCodes;
51 }
52 /**
53 * Configures request options before making a request.
54 */
55 static CONFIGURE(options) {
56 // set transporter user agent
57 options.headers = (options.headers !== undefined) ? options.headers : {};
58 // tslint:disable-next-line:no-single-line-block-comment
59 /* istanbul ignore else */
60 if (!options.headers['User-Agent']) {
61 options.headers['User-Agent'] = DefaultTransporter.USER_AGENT;
62 }
63 else if (options.headers['User-Agent'].indexOf(DefaultTransporter.USER_AGENT) === -1) {
64 options.headers['User-Agent'] = `${options.headers['User-Agent']} ${DefaultTransporter.USER_AGENT}`;
65 }
66 else {
67 // no operation
68 }
69 return options;
70 }
71 /**
72 * Makes a request with given options and invokes callback.
73 */
74 request(options) {
75 return __awaiter(this, void 0, void 0, function* () {
76 const requestOptions = DefaultTransporter.CONFIGURE(options);
77 debug('requesting...', requestOptions);
78 return new Promise((resolve, reject) => {
79 request(requestOptions, (error, response, body) => {
80 try {
81 resolve(this.wrapCallback(error, response, body));
82 }
83 catch (callbackErr) {
84 reject(callbackErr);
85 }
86 });
87 });
88 });
89 }
90 /**
91 * Wraps the response callback.
92 */
93 wrapCallback(error, response, body) {
94 let err = new COAServiceError(http_status_1.INTERNAL_SERVER_ERROR, '', 'An unexpected error occurred.');
95 if (error instanceof Error) {
96 throw new COAServiceError(http_status_1.INTERNAL_SERVER_ERROR, '', error.message);
97 }
98 debug('request processed', error, body);
99 // tslint:disable-next-line:no-single-line-block-comment
100 /* istanbul ignore else */
101 if (response.statusCode !== undefined) {
102 if (this.expectedStatusCodes.indexOf(response.statusCode) < 0) {
103 if (typeof body === 'string') {
104 // Consider all 4xx and 5xx responses errors.
105 err = new COAServiceError(response.statusCode, '', body);
106 }
107 else {
108 // エラーレスポンスにステータスがあった場合
109 // tslint:disable-next-line:no-single-line-block-comment
110 /* istanbul ignore else */
111 if (body.status !== undefined) {
112 err = new COAServiceError(response.statusCode, body.status, body.message);
113 }
114 else {
115 // no operation
116 }
117 }
118 }
119 else {
120 // HTTPステータスコード2xxでも、レスポンス本文のステータスが0でなければBadRequest
121 if (body.status !== undefined && body.status !== RESPONSE_BODY_STAUS_SUCCESS) {
122 err = new COAServiceError(response.statusCode, body.status, body.message);
123 }
124 else {
125 if (response.statusCode === http_status_1.NO_CONTENT) {
126 // consider 204
127 return;
128 }
129 else {
130 // consider 200,201
131 return body;
132 }
133 }
134 }
135 }
136 else {
137 // no operation
138 }
139 throw err;
140 }
141}
142/**
143 * Default user agent.
144 */
145DefaultTransporter.USER_AGENT = `coa-service/${pkg.version}`;
146exports.DefaultTransporter = DefaultTransporter;