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