diff --git a/microscript/ILibDuktape_CompressedStream.c b/microscript/ILibDuktape_CompressedStream.c index da47dcf..b2b9741 100644 --- a/microscript/ILibDuktape_CompressedStream.c +++ b/microscript/ILibDuktape_CompressedStream.c @@ -310,9 +310,10 @@ duk_ret_t ILibDuktape_CompressedStream_decompressor(duk_context *ctx) cs->Z.opaque = Z_NULL; cs->Z.avail_in = 0; cs->Z.next_in = Z_NULL; - if (duk_is_number(ctx, 0) && duk_require_int(ctx, 0)==1) + if (duk_is_object(ctx, 0)) { - if (inflateInit2(&(cs->Z), -MAX_WBITS) != Z_OK) { return(ILibDuktape_Error(ctx, "zlib error")); } + int wbits = Duktape_GetIntPropertyValue(ctx, 0, "WBITS", -15); + if (inflateInit2(&(cs->Z), wbits) != Z_OK) { return(ILibDuktape_Error(ctx, "zlib error")); } } else { diff --git a/microscript/ILibDuktape_Helpers.h b/microscript/ILibDuktape_Helpers.h index 2051a45..5e8bf4e 100644 --- a/microscript/ILibDuktape_Helpers.h +++ b/microscript/ILibDuktape_Helpers.h @@ -67,6 +67,14 @@ typedef struct ILibDuktape_ContextData #define duk_ctx_shutting_down(ctx) ((duk_ctx_context_data(ctx)->flags & duk_destroy_heap_in_progress)==duk_destroy_heap_in_progress) #define duk_ctx_chain(ctx) (duk_ctx_is_alive(ctx)?duk_ctx_context_data(ctx)->chain:NULL) +#define duk_stream_flags_string 0x01 +#define duk_stream_flags_buffer 0x00 +#define duk_stream_flags_flush 0x04 + +#define duk_stream_flags_isString(flags) (((flags)&duk_stream_flags_string)==duk_stream_flags_string) +#define duk_stream_flags_isBuffer(flags) (((flags)&duk_stream_flags_string)==duk_stream_flags_buffer) +#define duk_stream_flags_isFlush(flags) (((flags)&duk_stream_flags_flush)==duk_stream_flags_flush) + typedef void(*Duktape_EventLoopDispatch)(void *chain, void *user); void Duktape_RunOnEventLoop(void *chain, uintptr_t nonce, duk_context *ctx, Duktape_EventLoopDispatch handler, Duktape_EventLoopDispatch abortHandler, void *user); #define Duktape_RunOnEventLoopEx(chain, nonce, ctx, handler, user, freeOnShutdown) Duktape_RunOnEventLoop(chain, nonce, ctx, handler, (freeOnShutdown==0?NULL:(Duktape_EventLoopDispatch)(uintptr_t)0x01), user) diff --git a/microscript/ILibDuktape_HttpStream.c b/microscript/ILibDuktape_HttpStream.c index 8b64d81..5478ca2 100644 --- a/microscript/ILibDuktape_HttpStream.c +++ b/microscript/ILibDuktape_HttpStream.c @@ -2827,27 +2827,12 @@ duk_ret_t ILibDuktape_HttpStream_IncomingMessage_finalizer(duk_context *ctx) { return(0); } -void ILibDuktape_HttpStream_IncomingMessage_PUSH(duk_context *ctx, ILibHTTPPacket *header, void *httpstream) +void ILibDuktape_HttpStream_AddHeaderDef(duk_context *ctx, struct packetheader *header) { - duk_push_object(ctx); // [message] - ILibDuktape_CreateFinalizer(ctx, ILibDuktape_HttpStream_IncomingMessage_finalizer); - duk_push_heapptr(ctx, httpstream); // [message][httpStream] - duk_dup(ctx, -1); // [message][httpStream][dup] - duk_put_prop_string(ctx, -3, ILibDuktape_IMSG2HttpStream); // [message][httpStream] - duk_get_prop_string(ctx, -1, ILibDuktape_HTTPStream2HTTP); // [message][httpStream][http] - duk_remove(ctx, -2); // [message][http] - duk_get_prop_string(ctx, -1, ILibDuktape_OBJID); // [message][http][id] - duk_get_prop_string(ctx, -1, "concat"); // [message][http][id][concat] - duk_swap_top(ctx, -2); // [message][http][concat][this] - duk_push_string(ctx, ".IncomingMessage"); // [message][http][concat][this][.IncomingMessage] - if (duk_pcall_method(ctx, 1) != 0) { duk_pop(ctx); duk_push_string(ctx, "http[s].IncomingMessage"); } - duk_remove(ctx, -2); // [message][http/s.IncomingMessage] - duk_put_prop_string(ctx, -2, ILibDuktape_OBJID); // [message] - duk_push_object(ctx); // [message][headers] packetheader_field_node *node = header->FirstField; while (node != NULL) - { + { duk_push_lstring(ctx, node->Field, node->FieldLength); // [message][headers][key] duk_push_lstring(ctx, node->FieldData, node->FieldDataLength); // [message][headers][key][value] duk_put_prop(ctx, -3); // [message][headers] @@ -2875,6 +2860,26 @@ void ILibDuktape_HttpStream_IncomingMessage_PUSH(duk_context *ctx, ILibHTTPPacke duk_push_lstring(ctx, header->StatusData, header->StatusDataLength); // [message][statusMessage] duk_put_prop_string(ctx, -2, "statusMessage"); // [message] } +} +void ILibDuktape_HttpStream_IncomingMessage_PUSH(duk_context *ctx, ILibHTTPPacket *header, void *httpstream) +{ + duk_push_object(ctx); // [message] + ILibDuktape_CreateFinalizer(ctx, ILibDuktape_HttpStream_IncomingMessage_finalizer); + duk_push_heapptr(ctx, httpstream); // [message][httpStream] + duk_dup(ctx, -1); // [message][httpStream][dup] + duk_put_prop_string(ctx, -3, ILibDuktape_IMSG2HttpStream); // [message][httpStream] + duk_get_prop_string(ctx, -1, ILibDuktape_HTTPStream2HTTP); // [message][httpStream][http] + duk_remove(ctx, -2); // [message][http] + duk_get_prop_string(ctx, -1, ILibDuktape_OBJID); // [message][http][id] + duk_get_prop_string(ctx, -1, "concat"); // [message][http][id][concat] + duk_swap_top(ctx, -2); // [message][http][concat][this] + duk_push_string(ctx, ".IncomingMessage"); // [message][http][concat][this][.IncomingMessage] + if (duk_pcall_method(ctx, 1) != 0) { duk_pop(ctx); duk_push_string(ctx, "http[s].IncomingMessage"); } + duk_remove(ctx, -2); // [message][http/s.IncomingMessage] + duk_put_prop_string(ctx, -2, ILibDuktape_OBJID); // [message] + + ILibDuktape_HttpStream_AddHeaderDef(ctx, header); + ILibDuktape_CreateInstanceMethod(ctx, "Digest_IsAuthenticated", ILibDuktape_HttpStream_IncomingMessage_Digest_IsAuthenticated, DUK_VARARGS); ILibDuktape_CreateInstanceMethod(ctx, "Digest_GetUsername", ILibDuktape_HttpStream_IncomingMessage_Digest_GetUsername, 0); ILibDuktape_CreateInstanceMethod(ctx, "Digest_ValidatePassword", ILibDuktape_HttpStream_IncomingMessage_Digest_ValidatePassword, 1); @@ -2940,6 +2945,8 @@ duk_ret_t ILibDuktape_HttpStream_OnReceive_bodyStreamFinalized(duk_context *ctx) } return(0); } + + void ILibDuktape_HttpStream_OnReceive(ILibWebClient_StateObject WebStateObject, int InterruptFlag, struct packetheader *header, char *bodyBuffer, int *beginPointer, int endPointer, ILibWebClient_ReceiveStatus recvStatus, void *user1, void *user2, int *PAUSE) { ILibDuktape_HttpStream_Data *data = (ILibDuktape_HttpStream_Data*)user1; @@ -3118,6 +3125,21 @@ void ILibDuktape_HttpStream_OnReceive(ILibWebClient_StateObject WebStateObject, duk_pop(ctx); // [emit][this][response][imsg] ILibDuktape_EventEmitter_AddOnEx(ctx, -1, "~", ILibDuktape_HttpStream_OnReceive_bodyStreamFinalized); + + int htmpLen; + char *htmp = ILibGetHeaderLineEx(header, "Content-Encoding", 16, &htmpLen); + if (htmpLen == 4 && strncmp(htmp, "gzip", 4) == 0) + { + duk_eval_string(ctx, "require('compressed-stream').createDecompressor({WBITS:31});"); // [emit][this][response][imsg][dec] + duk_prepare_method_call(ctx, -2, "pipe"); // [emit][this][response][imsg][dec][pipe][this] + duk_dup(ctx, -3); // [emit][this][response][imsg][dec][pipe][this][dec] + duk_pcall_method(ctx, 1); // [emit][this][response][imsg][dec][ret] + duk_pop(ctx); // [emit][this][response][imsg][dec] + duk_remove(ctx, -2); // [emit][this][response][dec] + ILibDuktape_HttpStream_AddHeaderDef(ctx, header); + } + + if (duk_pcall_method(ctx, 2) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "http.httpStream.onReceive->response(): "); } duk_pop(ctx); diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 2df9381..e13fb7f 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1588,7 +1588,7 @@ ILibTransport_DoneState ILibDuktape_Stream_Writable_WriteSink(struct ILibDuktape int bufmode = Duktape_GetIntPropertyValue(stream->ctx, -1, "bufferMode", 0); duk_get_prop_string(stream->ctx, -1, "_write"); // [writable][_write] duk_swap_top(stream->ctx, -2); // [_write][this] - if (stream->Reserved == 0) + if(duk_stream_flags_isBuffer(stream->Reserved)) { if (bufmode == 0) { @@ -2291,7 +2291,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('identifiers', Buffer.from('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', 'base64'));"); // zip-reader, refer to modules/zip-reader.js - duk_peval_string_noresult(ctx, "addCompressedModule('zip-reader', Buffer.from('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', 'base64'));"); + duk_peval_string_noresult(ctx, "addCompressedModule('zip-reader', Buffer.from('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', 'base64'));"); // zip-writer, refer to modules/zip-writer.js duk_peval_string_noresult(ctx, "addCompressedModule('zip-writer', Buffer.from('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', 'base64'));"); diff --git a/microscript/ILibDuktape_ReadableStream.c b/microscript/ILibDuktape_ReadableStream.c index 70b9cad..d6c13a7 100644 --- a/microscript/ILibDuktape_ReadableStream.c +++ b/microscript/ILibDuktape_ReadableStream.c @@ -155,14 +155,14 @@ void ILibDuktape_readableStream_WriteData_OnData_ChainThread(void *chain, void * } stream->paused = 0; - if (data->Reserved == 0) + if(duk_stream_flags_isBuffer(data->Reserved)) { duk_push_external_buffer(stream->ctx); // [ext] duk_config_buffer(stream->ctx, -1, data->buffer, data->bufferLen); } ILibDuktape_EventEmitter_SetupEmit(stream->ctx, stream->object, "data"); // [ext][emit][this][data] - if (data->Reserved == 0) + if (duk_stream_flags_isBuffer(data->Reserved)) { duk_push_buffer_object(stream->ctx, -4, 0, data->bufferLen, DUK_BUFOBJ_NODEJS_BUFFER); // [ext][emit][this][data][buffer] } @@ -174,8 +174,8 @@ void ILibDuktape_readableStream_WriteData_OnData_ChainThread(void *chain, void * { ILibDuktape_Process_UncaughtException(stream->ctx); } - if (data->Reserved == 0) - { + if (duk_stream_flags_isBuffer(data->Reserved)) + { duk_pop_2(stream->ctx); // ... } else diff --git a/microscript/ILibDuktape_WebRTC.c b/microscript/ILibDuktape_WebRTC.c index 7aaddb9..9eb0e62 100644 --- a/microscript/ILibDuktape_WebRTC.c +++ b/microscript/ILibDuktape_WebRTC.c @@ -120,7 +120,7 @@ ILibTransport_DoneState ILibDuktape_WebRTC_DataChannel_Stream_WriteSink(ILibDukt ILibDuktape_WebRTC_DataChannel *ptrs = (ILibDuktape_WebRTC_DataChannel*)user; if (ptrs->dataChannel != NULL) { - if (stream->writableStream->Reserved == 0 && ptrs->maxFragmentSize > 0 && bufferLen > ptrs->maxFragmentSize) + if (duk_stream_flags_isBuffer(stream->writableStream->Reserved) && ptrs->maxFragmentSize > 0 && bufferLen > ptrs->maxFragmentSize) { // We need to fragment the send ILibTransport_DoneState ret = ILibTransport_DoneState_ERROR; @@ -135,7 +135,7 @@ ILibTransport_DoneState ILibDuktape_WebRTC_DataChannel_Stream_WriteSink(ILibDukt else { // Normal Send - return(ILibWrapper_WebRTC_DataChannel_SendEx(ptrs->dataChannel, buffer, bufferLen, stream->writableStream->Reserved == 1 ? 51 : 53)); + return(ILibWrapper_WebRTC_DataChannel_SendEx(ptrs->dataChannel, buffer, bufferLen, duk_stream_flags_isString(stream->writableStream->Reserved) ? 51 : 53)); } } else diff --git a/modules/zip-reader.js b/modules/zip-reader.js index 2d647ce..e58b00e 100644 --- a/modules/zip-reader.js +++ b/modules/zip-reader.js @@ -169,7 +169,7 @@ function zippedObject(table) } else { - ret = require('compressed-stream').createDecompressor(1); + ret = require('compressed-stream').createDecompressor({ WBITS: -15 }); } ret._info = info; ret._readSink = function _readSink(err, bytesRead, buffer)