Skip to content

Zlib

[مستقر: 2 - مستقر]

مستقر: 2 استقرار: 2 - مستقر

رمز المصدر: lib/zlib.js

يوفر الوحدة النمطية node:zlib وظائف الضغط التي يتم تنفيذها باستخدام Gzip و Deflate/Inflate و Brotli.

للوصول إليه:

js
import os from 'node:zlib'
js
const zlib = require('node:zlib')

تعتمد عملية الضغط وفك الضغط على واجهة برمجة التطبيقات Streams API في Node.js.

يمكن تحقيق ضغط أو فك ضغط تدفق (مثل ملف) عن طريق تمرير تدفق المصدر عبر تدفق zlib Transform إلى تدفق الوجهة:

js
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
  }
})
js
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 الوعد:

js
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')
js
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
})

من الممكن أيضًا ضغط أو فك ضغط البيانات في خطوة واحدة:

js
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())
js
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 في وقت واحد يمكن أن يتسبب في تجزئة ذاكرة كبيرة.

js
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) => {})
}
js
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.

js
// مثال طلب العميل
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
  }
})
js
// مثال طلب العميل
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
  }
})
js
// مثال الخادم
// إن تشغيل عملية 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)
js
// مثال الخادم
// إن تشغيل عملية 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 بإرجاع خطأ عند فك ضغط البيانات المقطوعة. ومع ذلك، إذا كان من المعروف أن البيانات غير كاملة، أو الرغبة في فحص بداية الملف المضغوط فقط، فمن الممكن كتم معالجة الخطأ الافتراضية عن طريق تغيير طريقة التخزين المؤقت المستخدمة لفك ضغط آخر جزء من بيانات الإدخال:

js
// هذا إصدار مقطوع من المخزن المؤقت من الأمثلة أعلاه
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 هي (بالبايت):

js
;(1 << (windowBits + 2)) + (1 << (memLevel + 9))

وهذا يعني: 128 كيلوبايت لـ windowBits = 15 + 128 كيلوبايت لـ memLevel = 8 (القيم الافتراضية) بالإضافة إلى بضعة كيلوبايت لكائنات صغيرة.

على سبيل المثال، لتقليل متطلبات الذاكرة الافتراضية من 256 كيلوبايت إلى 128 كيلوبايت، يجب تعيين الخيارات على:

js
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 جزئية مضغوطة إلى العميل:

js
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)
js
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-8
    • BROTLI_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. لا توجد خيارات مطلوبة.

بعض الخيارات ذات صلة فقط عند الضغط ويتم تجاهلها بواسطة فئات إلغاء الضغط.

راجع وثائق deflateInit2 و inflateInit2 لمزيد من المعلومات.

الصف: BrotliOptions

[السجل]

الإصدارالتغييرات
v14.5.0، v12.19.0أصبح خيار maxOutputLength مدعومًا الآن.
v11.7.0تمت الإضافة في: v11.7.0

يأخذ كل صف قائم على Brotli كائن options. جميع الخيارات اختيارية.

مثال:

js
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() لمطابقة مجموع التحقق الذي تنتجه هذه المكتبة الخارجية:

js
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
js
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

إغلاق المقبض الأساسي.

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

تتوفر هذه الدالة فقط للتيارات القائمة على 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

يُنشئ ويرجع كائنًا جديدًا من نوع BrotliCompress.

zlib.createBrotliDecompress([options])

تم الإضافة في: v11.7.0، v10.16.0

يقوم بإنشاء وإرجاع كائن جديد من نوع BrotliDecompress.

zlib.createDeflate([options])

تم الإضافة في: v0.5.8

يقوم بإنشاء وإرجاع كائن جديد من نوع Deflate.

zlib.createDeflateRaw([options])

تم الإضافة في: v0.5.8

يقوم بإنشاء وإرجاع كائن جديد من نوع 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

يقوم بإنشاء وإرجاع كائن جديد من نوع Gunzip.

zlib.createGzip([options])

تم الإضافة في: v0.5.8

يقوم بإنشاء وإرجاع كائن جديد من نوع Gzip. انظر مثال.

zlib.createInflate([options])

تم الإضافة في: v0.5.8

يقوم بإنشاء وإرجاع كائن جديد من نوع Inflate.

zlib.createInflateRaw([options])

تم الإضافة في: v0.5.8

يقوم بإنشاء وإرجاع كائن جديد من نوع InflateRaw.

zlib.createUnzip([options])

تم الإضافة في: v0.5.8

يقوم بإنشاء وإرجاع كائن جديد من نوع Unzip.

طرق الراحة

تستقبل جميع هذه الطرق مُدخلاً من نوع Buffer أو TypedArray أو DataView أو ArrayBuffer أو سلسلة نصية كأول وسيطة، ووسيطاً اختيارياً ثانياً لتزويد الخيارات إلى فئات zlib، وستستدعي دالة المُعالجة المُعطاة مع callback(error, result).

كل طريقة لها نظير *Sync، والذي يقبل نفس الوسائط، ولكن بدون دالة مُعالجة.

zlib.brotliCompress(buffer[, options], callback)

مُضاف في: v11.7.0, v10.16.0

zlib.brotliCompressSync(buffer[, options])

مُضاف في: v11.7.0, v10.16.0

ضغط جزء من البيانات باستخدام BrotliCompress.

zlib.brotliDecompress(buffer[, options], callback)

مضاف في: v11.7.0، v10.16.0

zlib.brotliDecompressSync(buffer[, options])

مضاف في: v11.7.0، v10.16.0

فك ضغط جزء من البيانات باستخدام 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

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

ضغط جزء من البيانات باستخدام Deflate.

zlib.deflateRaw(buffer[, options], callback)

[History]

الإصدارالتغييرات
v8.0.0يمكن أن يكون مُعامل buffer من أي نوع TypedArray أو DataView.
v8.0.0يمكن أن يكون مُعامل buffer من نوع Uint8Array الآن.
v0.6.0تمت الإضافة في: v0.6.0

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

ضغط جزء من البيانات باستخدام 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

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

فك ضغط جزء من البيانات باستخدام 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

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

ضغط جزء من البيانات باستخدام 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

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

فك ضغط جزء من البيانات باستخدام 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

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

فك ضغط جزء من البيانات باستخدام 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

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

فك ضغط جزء من البيانات باستخدام Unzip.