close
The Wayback Machine - https://web.archive.org/web/20200705191952/https://github.com/nodejs/node/pull/20458
Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

brotli: add brotli support #20458

Closed
wants to merge 11 commits into from
Closed

brotli: add brotli support #20458

wants to merge 11 commits into from

Conversation

@Hackzzila
Copy link
Contributor

Hackzzila commented May 1, 2018

Fixes: #18964

Adds brotli support to core. The brotli module must be enabled with --expose-brotli. The api, and most of the source code, is almost identical to the zlib module.

There are a few things that need polishing but I thought I would open this up for discussion.

/cc @MylesBorins

Checklist
  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • tests and/or benchmarks are included
  • documentation is changed or added
  • commit message follows commit guidelines
@addaleax
Copy link
Member

addaleax commented May 1, 2018

The api, and most of the source code, is almost identical to the zlib module.

Do you think it would be possible to work on re-using as much code as possible? I think that would be a very good idea if we can make it work (because it’s going to happen eventually anyway).

@devsnek
Copy link
Member

devsnek commented May 1, 2018

without overstepping this pr too much, maybe we can take this opportunity to think of a new way to group our compression stuff, both in terms of source and namespace (require('compression/brotli') or something)

@vsemozhetbyt
Copy link
Contributor

vsemozhetbyt commented May 1, 2018

@devsnek
Copy link
Member

devsnek commented May 1, 2018

@Hackzzila
Copy link
Contributor Author

Hackzzila commented May 1, 2018

As per Introducing New Modules policy, beware:

I managed to miss that, I can talk to the author but maybe this could be moved under a scope as brought up in nodejs/TSC#389

@devongovett
Copy link
Contributor

devongovett commented May 1, 2018

hey guys, I'm the owner of brotli on npm. That package is a hand coded decoder + emscripten ported encoder which both work in the browser as well as node. I'd be happy to make the package's API compatible with whatever API node decides on and use it as a browserify-style port so it can be used in the browser. WDYT?

Copy link
Contributor

vsemozhetbyt left a comment

Doc part LGTM with some nits. Sorry for a big bunch of them)

And thank you!

@@ -81,6 +81,10 @@ added: v9.6.0

Enable experimental ES Module support in the `vm` module.

### `--expose-brotli`

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

Should we add metadata?

<!-- YAML
 added: REPLACEME
-->

This comment has been minimized.

Copy link
@Hackzzila

Hackzzila May 1, 2018

Author Contributor

I didn't know what I should put there so I just removed those. Should they just be set to like v10.x.x? Or I guess REPLACEME works too :)

This comment has been minimized.

Copy link
@devsnek

devsnek May 1, 2018

Member

also with our pattern i think it should be --experimental-brotli

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 2, 2018

Contributor

If I recall correctly, REPLACEME has some part in build automation as a do-not-forget-to-replace guard)

@@ -0,0 +1,404 @@
# Brotli

This comment was marked as resolved.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

Should we add <!--introduced_in=REPLACEME--> placeholder?


## Threadpool Usage

Note that all brotli APIs except those that are explicitly synchronous use

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

brotli APIs -> `brotli` APIs?

content-encoding mechanism defined by
[HTTP](https://tools.ietf.org/html/rfc7230#section-4.2).

The HTTP [`Accept-Encoding`][] header is used within an http request to identify

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

http request -> HTTP request or `http` request?


// Note: This is not a conformant accept-encoding parser.
// See https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
// Note: A quality of 4 is a good balace of speed and quality.

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

balace ->balance?

Error codes for decompression operations.

## brotli.constants

This comment was marked as resolved.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor
* {Object}
to supply options to the `brotli` classes and will call the supplied callback
with `callback(error, result)`.

Every method has a `*Sync` counterpart, which accept the same arguments, but

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

accept -> accepts?

Every method has a `*Sync` counterpart, which accept the same arguments, but
without a callback.

### brotli.compress(buffer[, options][, callback])

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

If it can be a string, then buffer -> data here and below?

- `buffer` {Buffer|TypedArray|DataView|ArrayBuffer|string}

Decompress a chunk of data with [Decompress][].
If callback is omitted a Promise will be returned.

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

Promise -> `Promise` or even {Promise} (will be linkified)?
Ditto below.


- `buffer` {Buffer|TypedArray|DataView|ArrayBuffer|string}

Decompress a chunk of data with [Decompress][].

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

Compress a chunk of data with [Compress][].

@Hackzzila
Copy link
Contributor Author

Hackzzila commented May 1, 2018

@vsemozhetbyt a few of the things you mentioned also apply to the zlib docs, those should probably be looked over sometime as well.


Compress a stream.

### new brotli.Compress(options)

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

[options]?


Decompress a stream.

### new brotli.Decompress(options)

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

[options]?

[`Accept-Encoding`]: https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
[`ArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
[`brotli/encode.h`]: https://github.com/google/brotli/blob/v1.0.4/c/include/brotli/encode.h
[`brotli/decode.h`]: https://github.com/google/brotli/blob/v1.0.4/c/include/brotli/decode.h

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

We usually sort bottom references in ASCII order, so this should go before the [`brotli/encode.h`]:.

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 1, 2018

Contributor

References below also need some resorting.

This comment has been minimized.

Copy link
@Hackzzila

Hackzzila May 2, 2018

Author Contributor

Don't know how I managed to mess up sorting 😆

@vsemozhetbyt
Copy link
Contributor

vsemozhetbyt commented May 2, 2018

@vsemozhetbyt a few of the things you mentioned also apply to the zlib docs, those should probably be looked over sometime as well.

Yeah, our docs are far from ideal, but we are working on them)

@vsemozhetbyt
Copy link
Contributor

vsemozhetbyt commented May 2, 2018

I will go ahead and create brotli label)

@vsemozhetbyt vsemozhetbyt added the brotli label May 2, 2018

// Note: This is not a conformant accept-encoding parser.
// See https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
// Note: A quality of 4 is a good balace of speed and quality.

This comment has been minimized.

Copy link
@devsnek

devsnek May 2, 2018

Member

Image

This comment has been minimized.

Copy link
@ChALkeR

ChALkeR May 2, 2018

Member

I believe «Note: » prefixes were removed from the docs earlier in #18592.
Are those needed here?

@Hackzzila
Copy link
Contributor Author

Hackzzila commented May 2, 2018

@vsemozhetbyt thanks for the docs review! Hopefully I have fixed everything now.

if (!acceptEncoding) {
acceptEncoding = '';
}
let acceptEncoding = request.headers['accept-encoding'] || '';

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 2, 2018

Contributor

May be const now)

This comment has been minimized.

Copy link
@Hackzzila

Hackzzila May 2, 2018

Author Contributor

If only eslint for vscode checked markdown too.

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 2, 2018

Contributor

Can eslint-plugin-markdown be of any help? We use it in CI and local linting.

Also, you can just run from the project root for linting code fragments in docs:

node tools/node_modules/eslint/bin/eslint.js --ext=.md doc
[`Accept-Encoding`]: https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
[`ArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
[`brotli/encode.h`]: https://github.com/google/brotli/blob/v1.0.4/c/include/brotli/encode.h
[`brotli.constants`]: #brotli_constants

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 2, 2018

Contributor

If this intended to refer brotli.constants property (and not just "Constants" section), then this should be #brotli_brotli_constants.

@Hackzzila
Copy link
Contributor Author

Hackzzila commented May 2, 2018

Do you think it would be possible to work on re-using as much code as possible? I think that would be a very good idea if we can make it work (because it’s going to happen eventually anyway).

I am unsure how this would be done for the C++ code, but it might be worth a shot for the JS.

Note that some options are only relevant when compressing, and are
ignored by the decompression classes.
Note that some options are only relevant when compressing or decompressing,
and are simply ignored.

This comment has been minimized.

Copy link
@vsemozhetbyt

vsemozhetbyt May 2, 2018

Contributor

I am not sure, but it seems a bit incomplete or confusing now. Maybe something like "and are simply ignored when inappropriate."?

This comment has been minimized.

Copy link
@Hackzzila

Hackzzila May 2, 2018

Author Contributor

Something like "and invalid options are simply ignored" should also work.

@addaleax addaleax self-assigned this Dec 7, 2018
@addaleax addaleax mentioned this pull request Dec 10, 2018
4 of 4 tasks complete
addaleax added a commit to addaleax/node that referenced this pull request Jan 3, 2019
Refs: nodejs#20458

Co-authored-by: Hackzzila <admin@hackzzila.com>
addaleax added a commit that referenced this pull request Jan 5, 2019
Refs: #20458

Co-authored-by: Hackzzila <admin@hackzzila.com>

PR-URL: #24938
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Jan Krems <jan.krems@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
addaleax added a commit that referenced this pull request Jan 5, 2019
Refs: #20458

Co-authored-by: Hackzzila <admin@hackzzila.com>

PR-URL: #24938
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Jan Krems <jan.krems@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
@addaleax
Copy link
Member

addaleax commented Jan 5, 2019

This has been done in #24938! 🎉

@addaleax addaleax closed this Jan 5, 2019
refack added a commit to refack/node that referenced this pull request Jan 14, 2019
Refs: nodejs#20458

Co-authored-by: Hackzzila <admin@hackzzila.com>

PR-URL: nodejs#24938
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Jan Krems <jan.krems@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
addaleax added a commit to addaleax/node that referenced this pull request May 13, 2019
Refs: nodejs#20458

Co-authored-by: Hackzzila <admin@hackzzila.com>

PR-URL: nodejs#24938
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Jan Krems <jan.krems@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
MylesBorins added a commit that referenced this pull request May 16, 2019
Refs: #20458

Co-authored-by: Hackzzila <admin@hackzzila.com>

Backport-PR-URL: #27681
PR-URL: #24938
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Jan Krems <jan.krems@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
MylesBorins added a commit that referenced this pull request May 16, 2019
Refs: #20458

Co-authored-by: Hackzzila <admin@hackzzila.com>

Backport-PR-URL: #27681
PR-URL: #24938
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Jan Krems <jan.krems@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
@mohammad-masud
Copy link

mohammad-masud commented Aug 23, 2019

very informative for my website called computer keyboards

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked issues

Successfully merging this pull request may close these issues.

You can’t perform that action at this time.