Zlib
[مستقر: 2 - مستقر]
مستقر: 2 استقرار: 2 - مستقر
رمز المصدر: lib/zlib.js
يوفر الوحدة النمطية node:zlib
وظائف الضغط التي يتم تنفيذها باستخدام Gzip و Deflate/Inflate و Brotli.
للوصول إليه:
import os from 'node:zlib'
const zlib = require('node:zlib')
تعتمد عملية الضغط وفك الضغط على واجهة برمجة التطبيقات Streams API في Node.js.
يمكن تحقيق ضغط أو فك ضغط تدفق (مثل ملف) عن طريق تمرير تدفق المصدر عبر تدفق zlib
Transform
إلى تدفق الوجهة:
import { createReadStream, createWriteStream } from 'node:fs'
import process from 'node:process'
import { createGzip } from 'node:zlib'
import { pipeline } from 'node:stream'
const gzip = createGzip()
const source = createReadStream('input.txt')
const destination = createWriteStream('input.txt.gz')
pipeline(source, gzip, destination, err => {
if (err) {
console.error('An error occurred:', err)
process.exitCode = 1
}
})
const { createReadStream, createWriteStream } = require('node:fs')
const process = require('node:process')
const { createGzip } = require('node:zlib')
const { pipeline } = require('node:stream')
const gzip = createGzip()
const source = createReadStream('input.txt')
const destination = createWriteStream('input.txt.gz')
pipeline(source, gzip, destination, err => {
if (err) {
console.error('An error occurred:', err)
process.exitCode = 1
}
})
أو، باستخدام واجهة برمجة تطبيقات pipeline
الوعد:
import { createReadStream, createWriteStream } from 'node:fs'
import process from 'node:process'
import { createGzip } from 'node:zlib'
import { pipeline } from 'node:stream/promises'
async function do_gzip(input, output) {
const gzip = createGzip()
const source = createReadStream(input)
const destination = createWriteStream(output)
await pipeline(source, gzip, destination)
}
await do_gzip('input.txt', 'input.txt.gz')
const { createReadStream, createWriteStream } = require('node:fs')
const process = require('node:process')
const { createGzip } = require('node:zlib')
const { pipeline } = require('node:stream/promises')
async function do_gzip(input, output) {
const gzip = createGzip()
const source = createReadStream(input)
const destination = createWriteStream(output)
await pipeline(source, gzip, destination)
}
do_gzip('input.txt', 'input.txt.gz').catch(err => {
console.error('An error occurred:', err)
process.exitCode = 1
})
من الممكن أيضًا ضغط أو فك ضغط البيانات في خطوة واحدة:
import process from 'node:process'
import { Buffer } from 'node:buffer'
import { deflate, unzip } from 'node:zlib'
const input = '.................................'
deflate(input, (err, buffer) => {
if (err) {
console.error('An error occurred:', err)
process.exitCode = 1
}
console.log(buffer.toString('base64'))
})
const buffer = Buffer.from('eJzT0yMAAGTvBe8=', 'base64')
unzip(buffer, (err, buffer) => {
if (err) {
console.error('An error occurred:', err)
process.exitCode = 1
}
console.log(buffer.toString())
})
// Or, Promisified
import { promisify } from 'node:util'
const do_unzip = promisify(unzip)
const unzippedBuffer = await do_unzip(buffer)
console.log(unzippedBuffer.toString())
const { deflate, unzip } = require('node:zlib')
const input = '.................................'
deflate(input, (err, buffer) => {
if (err) {
console.error('An error occurred:', err)
process.exitCode = 1
}
console.log(buffer.toString('base64'))
})
const buffer = Buffer.from('eJzT0yMAAGTvBe8=', 'base64')
unzip(buffer, (err, buffer) => {
if (err) {
console.error('An error occurred:', err)
process.exitCode = 1
}
console.log(buffer.toString())
})
// Or, Promisified
const { promisify } = require('node:util')
const do_unzip = promisify(unzip)
do_unzip(buffer)
.then(buf => console.log(buf.toString()))
.catch(err => {
console.error('An error occurred:', err)
process.exitCode = 1
})
استخدام تجمع الخيوط واعتبارات الأداء
تستخدم جميع واجهات برمجة التطبيقات zlib
، باستثناء تلك التي هي متزامنة بشكل صريح، تجمع الخيوط الداخلي في Node.js. قد يؤدي هذا إلى آثار مفاجئة وقيود في الأداء في بعض التطبيقات.
إنشاء واستخدام عدد كبير من كائنات zlib في وقت واحد يمكن أن يتسبب في تجزئة ذاكرة كبيرة.
import zlib from 'node:zlib'
import { Buffer } from 'node:buffer'
const payload = Buffer.from('This is some data')
// تحذير: لا تفعل هذا!
for (let i = 0; i < 30000; ++i) {
zlib.deflate(payload, (err, buffer) => {})
}
const zlib = require('node:zlib')
const payload = Buffer.from('This is some data')
// تحذير: لا تفعل هذا!
for (let i = 0; i < 30000; ++i) {
zlib.deflate(payload, (err, buffer) => {})
}
في المثال السابق، تم إنشاء 30000 مثيلًا لـ deflate بشكل متزامن. نظرًا لكيفية تعامل بعض أنظمة التشغيل مع تخصيص الذاكرة وإلغاء تخصيصها، فقد يؤدي هذا إلى تجزئة ذاكرة كبيرة.
يوصى بشدة بتخزين نتائج عمليات الضغط مؤقتًا لتجنب تكرار الجهد.
ضغط طلبات واستجابات HTTP
يمكن استخدام وحدة node:zlib
لتنفيذ دعم آليات ترميز المحتوى gzip
و deflate
و br
التي حددها HTTP.
يستخدم رأس HTTP Accept-Encoding
ضمن طلب HTTP لتحديد ترميزات الضغط التي يقبلها العميل. ويستخدم رأس Content-Encoding
لتحديد ترميزات الضغط التي تم تطبيقها بالفعل على رسالة.
أمثلة أدناه مبسطة بشكل كبير لإظهار المفهوم الأساسي. يمكن أن يكون استخدام ترميز zlib
مكلفًا، ويجب تخزين النتائج مؤقتًا. راجع ضبط استخدام الذاكرة لمزيد من المعلومات حول التوازن بين السرعة/الذاكرة/الضغط في استخدام zlib
.
// مثال طلب العميل
import fs from 'node:fs'
import zlib from 'node:zlib'
import http from 'node:http'
import process from 'node:process'
import { pipeline } from 'node:stream'
const request = http.get({
host: 'example.com',
path: '/',
port: 80,
headers: { 'Accept-Encoding': 'br,gzip,deflate' },
})
request.on('response', response => {
const output = fs.createWriteStream('example.com_index.html')
const onError = err => {
if (err) {
console.error('حدث خطأ:', err)
process.exitCode = 1
}
}
switch (response.headers['content-encoding']) {
case 'br':
pipeline(response, zlib.createBrotliDecompress(), output, onError)
break
// أو، فقط استخدم zlib.createUnzip () للتعامل مع كلتا الحالتين التاليتين:
case 'gzip':
pipeline(response, zlib.createGunzip(), output, onError)
break
case 'deflate':
pipeline(response, zlib.createInflate(), output, onError)
break
default:
pipeline(response, output, onError)
break
}
})
// مثال طلب العميل
const zlib = require('node:zlib')
const http = require('node:http')
const fs = require('node:fs')
const { pipeline } = require('node:stream')
const request = http.get({
host: 'example.com',
path: '/',
port: 80,
headers: { 'Accept-Encoding': 'br,gzip,deflate' },
})
request.on('response', response => {
const output = fs.createWriteStream('example.com_index.html')
const onError = err => {
if (err) {
console.error('حدث خطأ:', err)
process.exitCode = 1
}
}
switch (response.headers['content-encoding']) {
case 'br':
pipeline(response, zlib.createBrotliDecompress(), output, onError)
break
// أو، فقط استخدم zlib.createUnzip () للتعامل مع كلتا الحالتين التاليتين:
case 'gzip':
pipeline(response, zlib.createGunzip(), output, onError)
break
case 'deflate':
pipeline(response, zlib.createInflate(), output, onError)
break
default:
pipeline(response, output, onError)
break
}
})
// مثال الخادم
// إن تشغيل عملية gzip على كل طلب مكلف للغاية.
// سيكون من الأكثر كفاءة تخزين مؤقت للمخزن المؤقت المضغوط.
import zlib from 'node:zlib'
import http from 'node:http'
import fs from 'node:fs'
import { pipeline } from 'node:stream'
http
.createServer((request, response) => {
const raw = fs.createReadStream('index.html')
// قم بتخزين كل من الإصدار المضغوط والإصدار غير المضغوط من المورد.
response.setHeader('Vary', 'Accept-Encoding')
const acceptEncoding = request.headers['accept-encoding'] || ''
const onError = err => {
if (err) {
// إذا حدث خطأ، فلا يوجد الكثير مما يمكننا فعله لأن
// الخادم قد أرسل بالفعل رمز الاستجابة 200 و
// تم بالفعل إرسال كمية من البيانات إلى العميل.
// أفضل ما يمكننا فعله هو إنهاء الاستجابة على الفور
// وتسجيل الخطأ.
response.end()
console.error('حدث خطأ:', err)
}
}
// ملاحظة: هذا ليس محللًا متوافقًا لـ accept-encoding.
// راجع https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
if (/\bdeflate\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'deflate' })
pipeline(raw, zlib.createDeflate(), response, onError)
} else if (/\bgzip\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'gzip' })
pipeline(raw, zlib.createGzip(), response, onError)
} else if (/\bbr\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'br' })
pipeline(raw, zlib.createBrotliCompress(), response, onError)
} else {
response.writeHead(200, {})
pipeline(raw, response, onError)
}
})
.listen(1337)
// مثال الخادم
// إن تشغيل عملية gzip على كل طلب مكلف للغاية.
// سيكون من الأكثر كفاءة تخزين مؤقت للمخزن المؤقت المضغوط.
const zlib = require('node:zlib')
const http = require('node:http')
const fs = require('node:fs')
const { pipeline } = require('node:stream')
http
.createServer((request, response) => {
const raw = fs.createReadStream('index.html')
// قم بتخزين كل من الإصدار المضغوط والإصدار غير المضغوط من المورد.
response.setHeader('Vary', 'Accept-Encoding')
const acceptEncoding = request.headers['accept-encoding'] || ''
const onError = err => {
if (err) {
// إذا حدث خطأ، فلا يوجد الكثير مما يمكننا فعله لأن
// الخادم قد أرسل بالفعل رمز الاستجابة 200 و
// تم بالفعل إرسال كمية من البيانات إلى العميل.
// أفضل ما يمكننا فعله هو إنهاء الاستجابة على الفور
// وتسجيل الخطأ.
response.end()
console.error('حدث خطأ:', err)
}
}
// ملاحظة: هذا ليس محللًا متوافقًا لـ accept-encoding.
// راجع https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
if (/\bdeflate\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'deflate' })
pipeline(raw, zlib.createDeflate(), response, onError)
} else if (/\bgzip\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'gzip' })
pipeline(raw, zlib.createGzip(), response, onError)
} else if (/\bbr\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'br' })
pipeline(raw, zlib.createBrotliCompress(), response, onError)
} else {
response.writeHead(200, {})
pipeline(raw, response, onError)
}
})
.listen(1337)
بشكل افتراضي، ستقوم طرق zlib
بإرجاع خطأ عند فك ضغط البيانات المقطوعة. ومع ذلك، إذا كان من المعروف أن البيانات غير كاملة، أو الرغبة في فحص بداية الملف المضغوط فقط، فمن الممكن كتم معالجة الخطأ الافتراضية عن طريق تغيير طريقة التخزين المؤقت المستخدمة لفك ضغط آخر جزء من بيانات الإدخال:
// هذا إصدار مقطوع من المخزن المؤقت من الأمثلة أعلاه
const buffer = Buffer.from('eJzT0yMA', 'base64')
zlib.unzip(
buffer,
// بالنسبة إلى Brotli، المكافئ هو zlib.constants.BROTLI_OPERATION_FLUSH.
{ finishFlush: zlib.constants.Z_SYNC_FLUSH },
(err, buffer) => {
if (err) {
console.error('حدث خطأ:', err)
process.exitCode = 1
}
console.log(buffer.toString())
}
)
لن يغير هذا السلوك في حالات إرجاع الخطأ الأخرى، على سبيل المثال، عندما يكون لبيانات الإدخال تنسيق غير صالح. باستخدام هذه الطريقة، لن يكون من الممكن تحديد ما إذا كان الإدخال قد انتهى قبل الأوان أو يفتقر إلى عمليات التحقق من السلامة، مما يجعل من الضروري التحقق يدويًا من أن النتيجة المفكوكة صالحة.
ضبط استخدام الذاكرة
للتيارات القائمة على zlib
من zlib/zconf.h
، تم تعديله للاستخدام في Node.js:
متطلبات الذاكرة لـ deflate هي (بالبايت):
;(1 << (windowBits + 2)) + (1 << (memLevel + 9))
وهذا يعني: 128 كيلوبايت لـ windowBits
= 15 + 128 كيلوبايت لـ memLevel
= 8 (القيم الافتراضية) بالإضافة إلى بضعة كيلوبايت لكائنات صغيرة.
على سبيل المثال، لتقليل متطلبات الذاكرة الافتراضية من 256 كيلوبايت إلى 128 كيلوبايت، يجب تعيين الخيارات على:
const options = { windowBits: 14, memLevel: 7 }
ومع ذلك، سيؤدي هذا بشكل عام إلى تدهور الضغط.
متطلبات الذاكرة لـ inflate هي (بالبايت) 1 \<\< windowBits
. وهذا يعني، 32 كيلوبايت لـ windowBits
= 15 (القيمة الافتراضية) بالإضافة إلى بضعة كيلوبايت لكائنات صغيرة.
هذا بالإضافة إلى مخزن مؤقت داخلي واحد لإخراج حجمه chunkSize
، والذي يكون افتراضياً 16 كيلوبايت.
يتأثر سرعة ضغط zlib
بشكل كبير بضبط level
. ستؤدي المستويات الأعلى إلى ضغط أفضل، ولكنها ستستغرق وقتًا أطول لإكمالها. ستؤدي المستويات المنخفضة إلى ضغط أقل، ولكنها ستكون أسرع بكثير.
بشكل عام، ستعني خيارات استخدام الذاكرة الأكبر أن Node.js يجب أن يقوم بمزيد من المكالمات إلى zlib
لأنه سيتمكن من معالجة المزيد من البيانات في كل عملية write
. لذلك، هذا عامل آخر يؤثر على السرعة، على حساب استخدام الذاكرة.
للتيارات القائمة على Brotli
هناك ما يعادل خيارات zlib للتيارات القائمة على Brotli، على الرغم من أن هذه الخيارات لها نطاقات مختلفة عن خيارات zlib:
- خيار
level
في zlib يطابق خيارBROTLI_PARAM_QUALITY
في Brotli. - خيار
windowBits
في zlib يطابق خيارBROTLI_PARAM_LGWIN
في Brotli.
راجع أدناه لمزيد من التفاصيل حول خيارات Brotli المحددة.
الفلاش
ستؤدي مكالمة .flush()
على تيار ضغط إلى جعل zlib
يُرجع أكبر قدر ممكن من الإخراج حاليًا. قد يكون هذا على حساب جودة الضغط المتدهورة، ولكن يمكن أن يكون مفيدًا عندما تكون البيانات مطلوبة في أقرب وقت ممكن.
في المثال التالي، يتم استخدام flush()
لكتابة استجابة HTTP جزئية مضغوطة إلى العميل:
import zlib from 'node:zlib'
import http from 'node:http'
import { pipeline } from 'node:stream'
http
.createServer((request, response) => {
// For the sake of simplicity, the Accept-Encoding checks are omitted.
response.writeHead(200, { 'content-encoding': 'gzip' })
const output = zlib.createGzip()
let i
pipeline(output, response, err => {
if (err) {
// If an error occurs, there's not much we can do because
// the server has already sent the 200 response code and
// some amount of data has already been sent to the client.
// The best we can do is terminate the response immediately
// and log the error.
clearInterval(i)
response.end()
console.error('An error occurred:', err)
}
})
i = setInterval(() => {
output.write(`The current time is ${Date()}\n`, () => {
// The data has been passed to zlib, but the compression algorithm may
// have decided to buffer the data for more efficient compression.
// Calling .flush() will make the data available as soon as the client
// is ready to receive it.
output.flush()
})
}, 1000)
})
.listen(1337)
const zlib = require('node:zlib')
const http = require('node:http')
const { pipeline } = require('node:stream')
http
.createServer((request, response) => {
// For the sake of simplicity, the Accept-Encoding checks are omitted.
response.writeHead(200, { 'content-encoding': 'gzip' })
const output = zlib.createGzip()
let i
pipeline(output, response, err => {
if (err) {
// If an error occurs, there's not much we can do because
// the server has already sent the 200 response code and
// some amount of data has already been sent to the client.
// The best we can do is terminate the response immediately
// and log the error.
clearInterval(i)
response.end()
console.error('An error occurred:', err)
}
})
i = setInterval(() => {
output.write(`The current time is ${Date()}\n`, () => {
// The data has been passed to zlib, but the compression algorithm may
// have decided to buffer the data for more efficient compression.
// Calling .flush() will make the data available as soon as the client
// is ready to receive it.
output.flush()
})
}, 1000)
})
.listen(1337)
الثوابت
مضاف في: v0.5.8
ثوابت zlib
جميع الثوابت المُعرّفة في zlib.h
مُعرّفة أيضًا في require('node:zlib').constants
. في المسار الطبيعي للعمليات، لن يكون من الضروري استخدام هذه الثوابت. تم توثيقها حتى لا يكون وجودها مفاجئًا. هذا القسم مأخوذ تقريبًا بشكل مباشر من وثائق zlib.
سابقا، كانت الثوابت متاحة مباشرة من require('node:zlib')
، على سبيل المثال zlib.Z_NO_FLUSH
. الوصول إلى الثوابت مباشرة من الوحدة النمطية لا يزال ممكنًا حاليًا ولكنه مُهمل.
قيم التخزين المؤقت المسموح بها.
zlib.constants.Z_NO_FLUSH
zlib.constants.Z_PARTIAL_FLUSH
zlib.constants.Z_SYNC_FLUSH
zlib.constants.Z_FULL_FLUSH
zlib.constants.Z_FINISH
zlib.constants.Z_BLOCK
zlib.constants.Z_TREES
رموز الإرجاع لوظائف الضغط/فك الضغط. القيم السالبة هي أخطاء، والقيم الموجبة تُستخدم للأحداث الخاصة ولكن الطبيعية.
zlib.constants.Z_OK
zlib.constants.Z_STREAM_END
zlib.constants.Z_NEED_DICT
zlib.constants.Z_ERRNO
zlib.constants.Z_STREAM_ERROR
zlib.constants.Z_DATA_ERROR
zlib.constants.Z_MEM_ERROR
zlib.constants.Z_BUF_ERROR
zlib.constants.Z_VERSION_ERROR
مستويات الضغط.
zlib.constants.Z_NO_COMPRESSION
zlib.constants.Z_BEST_SPEED
zlib.constants.Z_BEST_COMPRESSION
zlib.constants.Z_DEFAULT_COMPRESSION
إستراتيجية الضغط.
zlib.constants.Z_FILTERED
zlib.constants.Z_HUFFMAN_ONLY
zlib.constants.Z_RLE
zlib.constants.Z_FIXED
zlib.constants.Z_DEFAULT_STRATEGY
ثوابت Brotli
مضاف في: v11.7.0, v10.16.0
هناك العديد من الخيارات والثوابت الأخرى المتاحة للتيارات القائمة على Brotli:
عمليات التخزين المؤقت
القيم التالية هي عمليات تخزين مؤقت صالحة للتيارات القائمة على Brotli:
zlib.constants.BROTLI_OPERATION_PROCESS
(افتراضي لجميع العمليات)zlib.constants.BROTLI_OPERATION_FLUSH
(افتراضي عند استدعاء.flush()
)zlib.constants.BROTLI_OPERATION_FINISH
(افتراضي للجزء الأخير)zlib.constants.BROTLI_OPERATION_EMIT_METADATA
- قد يكون من الصعب استخدام هذه العملية في سياق Node.js، حيث تجعل طبقة البث من الصعب معرفة البيانات التي ستنتهي في هذا الإطار. أيضًا، لا توجد حاليًا طريقة لاستهلاك هذه البيانات من خلال واجهة برمجة التطبيقات Node.js.
خيارات المُضغَط
توجد العديد من الخيارات التي يمكن تعيينها على مُشفِّرات Brotli، مما يؤثر على كفاءة الضغط والسرعة. يمكن الوصول إلى كل من المفاتيح والقيم كخصائص لكائن zlib.constants
.
أهم الخيارات هي:
BROTLI_PARAM_MODE
BROTLI_MODE_GENERIC
(افتراضي)BROTLI_MODE_TEXT
، مُعدّل لنص UTF-8BROTLI_MODE_FONT
، مُعدّل لخطوط WOFF 2.0
BROTLI_PARAM_QUALITY
- تتراوح من
BROTLI_MIN_QUALITY
إلىBROTLI_MAX_QUALITY
، مع افتراضيةBROTLI_DEFAULT_QUALITY
.
- تتراوح من
BROTLI_PARAM_SIZE_HINT
- قيمة عدد صحيح تمثل حجم الإدخال المتوقع؛ الافتراضي هو
0
لحجم إدخال غير معروف.
- قيمة عدد صحيح تمثل حجم الإدخال المتوقع؛ الافتراضي هو
يمكن تعيين الأعلام التالية للتحكم المتقدم في خوارزمية الضغط وضبط استخدام الذاكرة:
BROTLI_PARAM_LGWIN
- تتراوح من
BROTLI_MIN_WINDOW_BITS
إلىBROTLI_MAX_WINDOW_BITS
، مع افتراضيةBROTLI_DEFAULT_WINDOW
، أو حتىBROTLI_LARGE_MAX_WINDOW_BITS
إذا تم تعيين علمBROTLI_PARAM_LARGE_WINDOW
.
- تتراوح من
BROTLI_PARAM_LGBLOCK
- تتراوح من
BROTLI_MIN_INPUT_BLOCK_BITS
إلىBROTLI_MAX_INPUT_BLOCK_BITS
.
- تتراوح من
BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING
- علم منطقي يُقلل من نسبة الضغط لصالح سرعة فك الضغط.
BROTLI_PARAM_LARGE_WINDOW
- علم منطقي يُمكّن وضع "نافذة Brotli الكبيرة" (غير متوافق مع تنسيق Brotli كما هو مُعيار في RFC 7932).
BROTLI_PARAM_NPOSTFIX
- تتراوح من
0
إلىBROTLI_MAX_NPOSTFIX
.
- تتراوح من
BROTLI_PARAM_NDIRECT
- تتراوح من
0
إلى15 \<\< NPOSTFIX
على خطوات1 \<\< NPOSTFIX
.
- تتراوح من
خيارات مُفكّك الضغط
تتوفر خيارات متقدمة للتحكم في فك الضغط:
BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION
- علم منطقي يؤثر على أنماط تخصيص الذاكرة الداخلية.
BROTLI_DECODER_PARAM_LARGE_WINDOW
- علم منطقي يُمكّن وضع "نافذة Brotli الكبيرة" (غير متوافق مع تنسيق Brotli كما هو مُعيار في RFC 7932).
الصنف: Options
[السجل]
الإصدار | التغييرات |
---|---|
v14.5.0, v12.19.0 | أصبح خيار maxOutputLength مدعومًا الآن. |
v9.4.0 | يمكن أن يكون خيار dictionary عبارة عن ArrayBuffer . |
v8.0.0 | يمكن أن يكون خيار dictionary عبارة عن Uint8Array الآن. |
v5.11.0 | أصبح خيار finishFlush مدعومًا الآن. |
v0.11.1 | تمت الإضافة في: v0.11.1 |
يأخذ كل فصل قائم على zlib كائن options
. لا توجد خيارات مطلوبة.
بعض الخيارات ذات صلة فقط عند الضغط ويتم تجاهلها بواسطة فئات إلغاء الضغط.
flush
<عدد صحيح> افتراضيًا:zlib.constants.Z_NO_FLUSH
finishFlush
<عدد صحيح> افتراضيًا:zlib.constants.Z_FINISH
chunkSize
<عدد صحيح> افتراضيًا:16 * 1024
windowBits
<عدد صحيح>level
<عدد صحيح> (الضغط فقط)memLevel
<عدد صحيح> (الضغط فقط)strategy
<عدد صحيح> (الضغط فقط)dictionary
<عازلة> | <مصفوفة من النوع> | <عرض بيانات> | <عازلة مصفوفة> (deflate/inflate فقط، قاموس فارغ افتراضيًا)info
<قيمة منطقية> (إذا كانtrue
، يُرجع كائنًا يحتوي علىbuffer
وengine
.)maxOutputLength
<عدد صحيح> يحد من حجم الإخراج عند استخدام طرق سهلة. افتراضيًا:buffer.kMaxLength
راجع وثائق deflateInit2
و inflateInit2
لمزيد من المعلومات.
الصف: BrotliOptions
[السجل]
الإصدار | التغييرات |
---|---|
v14.5.0، v12.19.0 | أصبح خيار maxOutputLength مدعومًا الآن. |
v11.7.0 | تمت الإضافة في: v11.7.0 |
يأخذ كل صف قائم على Brotli كائن options
. جميع الخيارات اختيارية.
flush
<عدد صحيح> الافتراضي:zlib.constants.BROTLI_OPERATION_PROCESS
finishFlush
<عدد صحيح> الافتراضي:zlib.constants.BROTLI_OPERATION_FINISH
chunkSize
<عدد صحيح> الافتراضي:16 * 1024
params
<كائن> كائن مفتاح-قيمة يحتوي على معلمات Brotli المفهرسة.maxOutputLength
<عدد صحيح> يحد من حجم الإخراج عند استخدام طرق الراحة. الافتراضي:buffer.kMaxLength
مثال:
const stream = zlib.createBrotliCompress({
chunkSize: 32 * 1024,
params: {
[zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT,
[zlib.constants.BROTLI_PARAM_QUALITY]: 4,
[zlib.constants.BROTLI_PARAM_SIZE_HINT]: fs.statSync(inputFile).size,
},
})
الصف: zlib.BrotliCompress
تمت الإضافة في: v11.7.0، v10.16.0
ضغط البيانات باستخدام خوارزمية Brotli.
الصف: zlib.BrotliDecompress
تمت الإضافة في: v11.7.0، v10.16.0
فك ضغط البيانات باستخدام خوارزمية Brotli.
الصف: zlib.Deflate
تمت الإضافة في: v0.5.8
ضغط البيانات باستخدام deflate.
الصف: zlib.DeflateRaw
تمت الإضافة في: v0.5.8
ضغط البيانات باستخدام deflate، وعدم إضافة رأس zlib
.
الصف: zlib.Gunzip
[السجل]
الإصدار | التغييرات |
---|---|
v6.0.0 | ستؤدي القمامة المتبقية في نهاية دفق الإدخال الآن إلى حدث 'error' . |
v5.9.0 | يتم دعم أعضاء ملف gzip المتسلسلة المتعددة الآن. |
v5.0.0 | سيؤدي دفق الإدخال المقتطع الآن إلى حدث 'error' . |
v0.5.8 | تمت الإضافة في: v0.5.8 |
فك ضغط دفق gzip.
الصف: zlib.Gzip
مضاف في: v0.5.8
ضغط البيانات باستخدام gzip.
الصف: zlib.Inflate
[السجل]
الإصدار | التغييرات |
---|---|
v5.0.0 | ستؤدي دفق الإدخال المقطوع الآن إلى حدث 'error' . |
v0.5.8 | مضاف في: v0.5.8 |
فك ضغط دفق deflate.
الصف: zlib.InflateRaw
[السجل]
الإصدار | التغييرات |
---|---|
v6.8.0 | يتم الآن دعم القواميس المخصصة بواسطة InflateRaw . |
v5.0.0 | ستؤدي دفق الإدخال المقطوع الآن إلى حدث 'error' . |
v0.5.8 | مضاف في: v0.5.8 |
فك ضغط دفق deflate الخام.
الصف: zlib.Unzip
مضاف في: v0.5.8
فك ضغط دفق مضغوط إما Gzip أو Deflate عن طريق الكشف التلقائي عن الرأس.
الصف: zlib.ZlibBase
[السجل]
الإصدار | التغييرات |
---|---|
v11.7.0, v10.16.0 | تم تغيير اسم هذا الصف من Zlib إلى ZlibBase . |
v0.5.8 | مضاف في: v0.5.8 |
لا يتم تصديرها بواسطة وحدة node:zlib
. تم توثيقها هنا لأنها الصف الأساسي لصفوف الضاغط/فاك الضغط.
يُورث هذا الصف من stream.Transform
، مما يسمح باستخدام كائنات node:zlib
في الأنابيب وعمليات الدفق المماثلة.
zlib.bytesWritten
مضاف في: v10.0.0
تحدد خاصية zlib.bytesWritten
عدد البايتات المكتوبة في المحرك، قبل معالجة البايتات (ضغطها أو فك ضغطها، حسب الاقتضاء للصف المشتق).
zlib.crc32(data[, value])
مضاف في: v22.2.0, v20.15.0
data
<string> | <Buffer> | <TypedArray> | <DataView> عندما يكونdata
سلسلة، سيتم ترميزها بتنسيق UTF-8 قبل استخدامها للحساب.value
<integer> قيمة بداية اختيارية. يجب أن تكون عددًا صحيحًا بدون إشارة من 32 بت. الافتراضي:0
- الإرجاع: <integer> عدد صحيح بدون إشارة من 32 بت يحتوي على مجموع التحقق.
يحسب مجموع تحقق التحقق الدوري الزائد من 32 بت لـ data
. إذا تم تحديد value
، فسيتم استخدامه كقيمة بداية لمجموع التحقق، وإلا، يتم استخدام 0 كقيمة البداية.
تم تصميم خوارزمية CRC لحساب مجاميع التحقق والكشف عن الخطأ في نقل البيانات. إنها ليست مناسبة للمصادقة المشفرة.
لتكون متسقة مع واجهات برمجة التطبيقات الأخرى، إذا كانت data
سلسلة، فسيتم ترميزها باستخدام UTF-8 قبل استخدامها للحساب. إذا كان المستخدمون يستخدمون Node.js فقط لحساب ومطابقة مجاميع التحقق، فإن هذا يعمل بشكل جيد مع واجهات برمجة التطبيقات الأخرى التي تستخدم ترميز UTF-8 افتراضيًا.
تحسب بعض مكتبات JavaScript الخارجية مجموع التحقق على سلسلة بناءً على str.charCodeAt()
بحيث يمكن تشغيلها في المتصفحات. إذا أراد المستخدمون مطابقة مجموع التحقق المحسوب باستخدام هذا النوع من المكتبة في المتصفح، فمن الأفضل استخدام نفس المكتبة في Node.js إذا كانت تعمل أيضًا في Node.js. إذا كان على المستخدمين استخدام zlib.crc32()
لمطابقة مجموع التحقق الذي تنتجه هذه المكتبة الخارجية:
import zlib from 'node:zlib'
import { Buffer } from 'node:buffer'
let crc = zlib.crc32('hello') // 907060870
crc = zlib.crc32('world', crc) // 4192936109
crc = zlib.crc32(Buffer.from('hello', 'utf16le')) // 1427272415
crc = zlib.crc32(Buffer.from('world', 'utf16le'), crc) // 4150509955
const zlib = require('node:zlib')
const { Buffer } = require('node:buffer')
let crc = zlib.crc32('hello') // 907060870
crc = zlib.crc32('world', crc) // 4192936109
crc = zlib.crc32(Buffer.from('hello', 'utf16le')) // 1427272415
crc = zlib.crc32(Buffer.from('world', 'utf16le'), crc) // 4150509955
zlib.close([callback])
أضيف في: v0.9.4
callback
<Function>
إغلاق المقبض الأساسي.
zlib.flush([kind, ]callback)
أضيف في: v0.5.8
kind
افتراضي:zlib.constants.Z_FULL_FLUSH
للتيارات القائمة على zlib،zlib.constants.BROTLI_OPERATION_FLUSH
للتيارات القائمة على Brotli.callback
<Function>
مسح البيانات المعلقة. لا تستدعِ هذه الدالة بشكل غير ضروري، حيث أن عمليات المسح المبكرة تؤثر سلبًا على فعالية خوارزمية الضغط.
إن استدعاء هذه الدالة يُمسح البيانات فقط من حالة zlib
الداخلية، ولا يُجري أي نوع من عمليات المسح على مستوى التيارات. بدلاً من ذلك، تعمل مثل استدعاء عادي لـ .write()
، أي أنها ستُضاف في قائمة الانتظار خلف عمليات الكتابة الأخرى المعلقة ولن تُنتج مخرجات إلا عند قراءة البيانات من التيار.
zlib.params(level, strategy, callback)
أضيف في: v0.11.4
level
<integer>strategy
<integer>callback
<Function>
تتوفر هذه الدالة فقط للتيارات القائمة على zlib، أي ليس Brotli.
تحديث مستوى الضغط واستراتيجية الضغط ديناميكيًا. ينطبق فقط على خوارزمية deflate.
zlib.reset()
أضيف في: v0.7.0
إعادة ضبط ضاغط/فاكك الضغط إلى الإعدادات الافتراضية. ينطبق فقط على خوارزميات inflate و deflate.
zlib.constants
أضيف في: v7.0.0
يوفر كائنًا يُعدد الثوابت ذات الصلة بـ Zlib.
zlib.createBrotliCompress([options])
أضيف في: v11.7.0، v10.16.0
options
<brotli options>
يُنشئ ويرجع كائنًا جديدًا من نوع BrotliCompress
.
zlib.createBrotliDecompress([options])
تم الإضافة في: v11.7.0، v10.16.0
options
<خيارات بروتلي>
يقوم بإنشاء وإرجاع كائن جديد من نوع BrotliDecompress
.
zlib.createDeflate([options])
تم الإضافة في: v0.5.8
options
<خيارات zlib>
يقوم بإنشاء وإرجاع كائن جديد من نوع Deflate
.
zlib.createDeflateRaw([options])
تم الإضافة في: v0.5.8
options
<خيارات zlib>
يقوم بإنشاء وإرجاع كائن جديد من نوع DeflateRaw
.
أدى ترقية zlib من 1.2.8 إلى 1.2.11 إلى تغيير السلوك عند تعيين windowBits
إلى 8 لتيارات deflate الخام. كانت zlib تقوم تلقائيًا بتعيين windowBits
إلى 9 إذا تم تعيينها في البداية إلى 8. ستقوم الإصدارات الأحدث من zlib بإلقاء استثناء، لذلك قامت Node.js باستعادة السلوك الأصلي المتمثل في ترقية قيمة 8 إلى 9، نظرًا لأن تمرير windowBits = 9
إلى zlib يؤدي في الواقع إلى دفق مضغوط يستخدم نافذة 8 بت فقط بشكل فعال.
zlib.createGunzip([options])
تم الإضافة في: v0.5.8
options
<خيارات zlib>
يقوم بإنشاء وإرجاع كائن جديد من نوع Gunzip
.
zlib.createGzip([options])
تم الإضافة في: v0.5.8
options
<خيارات zlib>
يقوم بإنشاء وإرجاع كائن جديد من نوع Gzip
. انظر مثال.
zlib.createInflate([options])
تم الإضافة في: v0.5.8
options
<خيارات zlib>
يقوم بإنشاء وإرجاع كائن جديد من نوع Inflate
.
zlib.createInflateRaw([options])
تم الإضافة في: v0.5.8
options
<خيارات zlib>
يقوم بإنشاء وإرجاع كائن جديد من نوع InflateRaw
.
zlib.createUnzip([options])
تم الإضافة في: v0.5.8
options
<خيارات zlib>
يقوم بإنشاء وإرجاع كائن جديد من نوع Unzip
.
طرق الراحة
تستقبل جميع هذه الطرق مُدخلاً من نوع Buffer
أو TypedArray
أو DataView
أو ArrayBuffer
أو سلسلة نصية كأول وسيطة، ووسيطاً اختيارياً ثانياً لتزويد الخيارات إلى فئات zlib
، وستستدعي دالة المُعالجة المُعطاة مع callback(error, result)
.
كل طريقة لها نظير *Sync
، والذي يقبل نفس الوسائط، ولكن بدون دالة مُعالجة.
zlib.brotliCompress(buffer[, options], callback)
مُضاف في: v11.7.0, v10.16.0
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<خيارات brotli>callback
<Function>
zlib.brotliCompressSync(buffer[, options])
مُضاف في: v11.7.0, v10.16.0
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<خيارات brotli>
ضغط جزء من البيانات باستخدام BrotliCompress
.
zlib.brotliDecompress(buffer[, options], callback)
مضاف في: v11.7.0، v10.16.0
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<brotli options>callback
<Function>
zlib.brotliDecompressSync(buffer[, options])
مضاف في: v11.7.0، v10.16.0
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<brotli options>
فك ضغط جزء من البيانات باستخدام BrotliDecompress
.
zlib.deflate(buffer[, options], callback)
[السجل]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer أي TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer Uint8Array الآن. |
v0.6.0 | مضاف في: v0.6.0 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>callback
<Function>
zlib.deflateSync(buffer[, options])
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer من نوع ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن. |
v0.11.12 | تمت الإضافة في: v0.11.12 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>
ضغط جزء من البيانات باستخدام Deflate
.
zlib.deflateRaw(buffer[, options], callback)
[History]
الإصدار | التغييرات |
---|---|
v8.0.0 | يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن. |
v0.6.0 | تمت الإضافة في: v0.6.0 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>callback
<Function>
zlib.deflateRawSync(buffer[, options])
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer من نوع ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن. |
v0.11.12 | تمت الإضافة في: v0.11.12 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>
ضغط جزء من البيانات باستخدام DeflateRaw
.
zlib.gunzip(buffer[, options], callback)
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer أي TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer Uint8Array الآن. |
v0.6.0 | تمت الإضافة في: v0.6.0 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>callback
<Function>
zlib.gunzipSync(buffer[, options])
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer أي TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer Uint8Array الآن. |
v0.11.12 | تمت الإضافة في: v0.11.12 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>
فك ضغط جزء من البيانات باستخدام Gunzip
.
zlib.gzip(buffer[, options], callback)
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer أي TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer Uint8Array الآن. |
v0.6.0 | تمت الإضافة في: v0.6.0 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>callback
<Function>
zlib.gzipSync(buffer[, options])
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer من نوع ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن. |
v0.11.12 | تمت الإضافة في: v0.11.12 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>
ضغط جزء من البيانات باستخدام Gzip
.
zlib.inflate(buffer[, options], callback)
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer من نوع ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن. |
v0.6.0 | تمت الإضافة في: v0.6.0 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>callback
<Function>
zlib.inflateSync(buffer[, options])
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer من نوع ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن. |
v0.11.12 | تمت الإضافة في: v0.11.12 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>
فك ضغط جزء من البيانات باستخدام Inflate
.
zlib.inflateRaw(buffer[, options], callback)
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer من نوع ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن. |
v0.6.0 | تمت الإضافة في: v0.6.0 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>callback
<Function>
zlib.inflateRawSync(buffer[, options])
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer من نوع ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن. |
v0.11.12 | تمت الإضافة في: v0.11.12 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>
فك ضغط جزء من البيانات باستخدام InflateRaw
.
zlib.unzip(buffer[, options], callback)
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer من نوع ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن. |
v0.6.0 | تمت الإضافة في: v0.6.0 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>callback
<Function>
zlib.unzipSync(buffer[, options])
[History]
الإصدار | التغييرات |
---|---|
v9.4.0 | يمكن أن يكون مُعامل buffer من نوع ArrayBuffer . |
v8.0.0 | يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView . |
v8.0.0 | يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن. |
v0.11.12 | تمت الإضافة في: v0.11.12 |
buffer
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options
<zlib options>
فك ضغط جزء من البيانات باستخدام Unzip
.