routup 3.1.0 → 3.2.0

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/dist/index.cjs CHANGED
@@ -844,6 +844,78 @@ function setResponseHeaderContentType(res, input, ifNotExists) {
844
844
  }
845
845
  }
846
846
 
847
+ async function sendStream(res, stream, next) {
848
+ if (isWebStream(stream)) {
849
+ return stream.pipeTo(new WritableStream({
850
+ write (chunk) {
851
+ res.write(chunk);
852
+ }
853
+ })).then(()=>{
854
+ if (next) {
855
+ return next();
856
+ }
857
+ res.end();
858
+ return Promise.resolve();
859
+ }).catch((err)=>{
860
+ if (next) {
861
+ return next(err);
862
+ }
863
+ return Promise.reject(err);
864
+ });
865
+ }
866
+ return new Promise((resolve, reject)=>{
867
+ stream.on('open', ()=>{
868
+ stream.pipe(res);
869
+ });
870
+ /* istanbul ignore next */ stream.on('error', (err)=>{
871
+ if (next) {
872
+ Promise.resolve().then(()=>next(err)).then(()=>resolve()).catch((e)=>reject(e));
873
+ return;
874
+ }
875
+ res.end();
876
+ reject(err);
877
+ });
878
+ stream.on('close', ()=>{
879
+ if (next) {
880
+ Promise.resolve().then(()=>next()).then(()=>resolve()).catch((e)=>reject(e));
881
+ return;
882
+ }
883
+ res.end();
884
+ resolve();
885
+ });
886
+ });
887
+ }
888
+
889
+ async function sendWebBlob(res, blob) {
890
+ setResponseHeaderContentType(res, blob.type);
891
+ await sendStream(res, blob.stream());
892
+ }
893
+
894
+ async function sendWebResponse(res, webResponse) {
895
+ if (webResponse.redirected) {
896
+ res.setHeader(exports.HeaderName.LOCATION, webResponse.url);
897
+ }
898
+ if (webResponse.status) {
899
+ res.statusCode = webResponse.status;
900
+ }
901
+ if (webResponse.statusText) {
902
+ res.statusMessage = webResponse.statusText;
903
+ }
904
+ webResponse.headers.forEach((value, key)=>{
905
+ if (key === exports.HeaderName.SET_COOKIE) {
906
+ res.appendHeader(key, splitCookiesString(value));
907
+ } else {
908
+ res.setHeader(key, value);
909
+ }
910
+ });
911
+ if (webResponse.body) {
912
+ await sendStream(res, webResponse.body);
913
+ return Promise.resolve();
914
+ }
915
+ res.end();
916
+ return Promise.resolve();
917
+ }
918
+
847
919
  async function send(res, chunk) {
848
920
  switch(typeof chunk){
849
921
  case 'string':
@@ -855,11 +927,28 @@ async function send(res, chunk) {
855
927
  case 'number':
856
928
  case 'object':
857
929
  {
858
- if (buffer.Buffer.isBuffer(chunk)) {
859
- setResponseHeaderContentType(res, 'bin', true);
860
- } else if (chunk !== null) {
861
- chunk = JSON.stringify(chunk);
862
- setResponseHeaderContentType(res, 'application/json', true);
930
+ if (chunk !== null) {
931
+ if (chunk instanceof Error) {
932
+ throw chunk;
933
+ }
934
+ if (isStream(chunk)) {
935
+ await sendStream(res, chunk);
936
+ return;
937
+ }
938
+ if (isWebBlob(chunk)) {
939
+ await sendWebBlob(res, chunk);
940
+ return;
941
+ }
942
+ if (isWebResponse(chunk)) {
943
+ await sendWebResponse(res, chunk);
944
+ return;
945
+ }
946
+ if (buffer.Buffer.isBuffer(chunk)) {
947
+ setResponseHeaderContentType(res, 'bin', true);
948
+ } else {
949
+ chunk = JSON.stringify(chunk);
950
+ setResponseHeaderContentType(res, 'application/json', true);
951
+ }
863
952
  }
864
953
  break;
865
954
  }
@@ -942,48 +1031,6 @@ function sendCreated(res, chunk) {
942
1031
  return send(res, chunk);
943
1032
  }
944
1033
 
945
- async function sendStream(res, stream, next) {
946
- if (isWebStream(stream)) {
947
- return stream.pipeTo(new WritableStream({
948
- write (chunk) {
949
- res.write(chunk);
950
- }
951
- })).then(()=>{
952
- if (next) {
953
- return next();
954
- }
955
- res.end();
956
- return Promise.resolve();
957
- }).catch((err)=>{
958
- if (next) {
959
- return next(err);
960
- }
961
- return Promise.reject(err);
962
- });
963
- }
964
- return new Promise((resolve, reject)=>{
965
- stream.on('open', ()=>{
966
- stream.pipe(res);
967
- });
968
- /* istanbul ignore next */ stream.on('error', (err)=>{
969
- if (next) {
970
- Promise.resolve().then(()=>next(err)).then(()=>resolve()).catch((e)=>reject(e));
971
- return;
972
- }
973
- res.end();
974
- reject(err);
975
- });
976
- stream.on('close', ()=>{
977
- if (next) {
978
- Promise.resolve().then(()=>next()).then(()=>resolve()).catch((e)=>reject(e));
979
- return;
980
- }
981
- res.end();
982
- resolve();
983
- });
984
- });
985
- }
986
-
987
1034
  async function sendFile(res, options, next) {
988
1035
  let stats;
989
1036
  try {
@@ -1073,36 +1120,6 @@ function sendRedirect(res, location, statusCode = 302) {
1073
1120
  return send(res, html);
1074
1121
  }
1075
1122
 
1076
- async function sendWebResponse(res, webResponse) {
1077
- if (webResponse.redirected) {
1078
- res.setHeader(exports.HeaderName.LOCATION, webResponse.url);
1079
- }
1080
- if (webResponse.status) {
1081
- res.statusCode = webResponse.status;
1082
- }
1083
- if (webResponse.statusText) {
1084
- res.statusMessage = webResponse.statusText;
1085
- }
1086
- webResponse.headers.forEach((value, key)=>{
1087
- if (key === exports.HeaderName.SET_COOKIE) {
1088
- res.appendHeader(key, splitCookiesString(value));
1089
- } else {
1090
- res.setHeader(key, value);
1091
- }
1092
- });
1093
- if (webResponse.body) {
1094
- await sendStream(res, webResponse.body);
1095
- return Promise.resolve();
1096
- }
1097
- res.end();
1098
- return Promise.resolve();
1099
- }
1100
-
1101
- async function sendWebBlob(res, blob) {
1102
- setResponseHeaderContentType(res, blob.type);
1103
- await sendStream(res, blob.stream());
1104
- }
1105
-
1106
1123
  function createResponse(request) {
1107
1124
  let output;
1108
1125
  let encoding;
@@ -1248,24 +1265,6 @@ function createResponse(request) {
1248
1265
  return writable;
1249
1266
  }
1250
1267
 
1251
- async function sendData(event, chunk) {
1252
- if (chunk instanceof Error) {
1253
- return Promise.reject(createError(chunk));
1254
- }
1255
- if (isStream(chunk)) {
1256
- await sendStream(event.response, chunk);
1257
- return Promise.resolve();
1258
- }
1259
- if (isWebBlob(chunk)) {
1260
- await sendWebBlob(event.response, chunk);
1261
- return Promise.resolve();
1262
- }
1263
- if (isWebResponse(chunk)) {
1264
- await sendWebResponse(event.response, chunk);
1265
- return Promise.resolve();
1266
- }
1267
- return send(event.response, chunk);
1268
- }
1269
1268
  function dispatch(event, target) {
1270
1269
  setRequestParams(event.request, event.params);
1271
1270
  setRequestMountPath(event.request, event.mountPath);
@@ -1299,7 +1298,7 @@ function dispatch(event, target) {
1299
1298
  handled = true;
1300
1299
  unsubscribe();
1301
1300
  if (!event.dispatched) {
1302
- await sendData(event, data);
1301
+ await send(event.response, data);
1303
1302
  }
1304
1303
  return true;
1305
1304
  };