Giải nén tar gz nodejs

Câu chuyện của chúng tôi bắt đầu với sự tích hợp giữa một số AWS Lambda và bộ chứa S3. Bộ chứa này sẽ nhận các tệp JSON và sự kiện đó sẽ kích hoạt lambda để xử lý đầu vào đó. Vấn đề?

Show

Vì vậy, thỏa thuận này là gì?

Xử lý tarball luôn tệ, tôi ghét phải tạo luồng, tôi ghét thêm nhiều phụ thuộc bên ngoài để thực hiện một tác vụ đơn giản và vì chúng tôi đang ở trong Lambda với IO được kiểm soát, một tác vụ đơn giản không thể gọi tar và ủy thác công việc cho HĐH. Bạn gần như chắc chắn sẽ sử dụng một trong hàng trăm thư viện npm cuối cùng sẽ hoàn thành công việc, nhưng cũng sẽ thêm 10k dòng mã vào dấu chân lambda của bạn. Hay là bạn?

Nếu bạn giống tôi và đã làm việc nhiều với AWS Lambdas, bạn sẽ biết việc có một mã nguồn nhỏ để triển khai tốt như thế nào, không chỉ giúp quá trình triển khai diễn ra nhanh chóng mà còn giúp tải giao diện người dùng web dễ dàng hơn rất nhiều

Nói một cách dễ hiểu, lib nhỏ gọn nhất cho các tệp untar sẽ thêm 5k dòng mã vào lambda của tôi, trong khi mã thực tế của tôi chỉ khoảng 50. Đó là một sự khác biệt rất lớn

Với suy nghĩ đó, tôi đã thúc đẩy bản thân thực hiện giải pháp siêu nhỏ gọn, bản địa của riêng mình, nó khó đến mức nào?

Trước tiên, tôi đã dành chút thời gian để hiểu tệp tarball (_______5) là gì. Và nó thực sự rất đơn giản. Một loạt các tệp được nhóm lại với nhau trong một tệp lớn, sau đó được nén thành gzip. Sau khi phát hiện ra điều đó, tôi đã có thể theo dõi nhiệm vụ của mình

  1. Giải nén các tập tin
  2. Tách chúng ra
  3. Phân tích cú pháp chúng dưới dạng JSON
1. Giải nén tập tin

Phần đó thực sự rất dễ, đúng nghĩa là một dòng mã

Đó là bởi vì nút đã được đóng gói với zlib có chức năng nén/giải nén, thổi phồng/xả hơi, v.v. công cụ dễ dàng

2. Tách chúng ra

Bây giờ thử thách bắt đầu. Một tarball có nội dung của các tệp gốc được nhóm lại với nhau trong cùng một tệp, chỉ được phân tách bằng một số ký tự điều khiển và thông tin meta của các tệp gốc

Chúng trông như thế này (sau khi giải nén thành chuỗi)

Như bạn có thể thấy, giữa mỗi nội dung tệp có rất nhiều ký tự điều khiển và một số thông tin meta, như tên người dùng, quyền, tên tệp gốc, v.v. Sau khi nhận ra điều này, tôi chỉ cần tìm một chuỗi char chỉ lặp lại một lần giữa mỗi nội dung tệp để có thể tách các tệp này ra

Với một số quan sát cẩn thận, tôi đã tìm thấy chuỗi \0ustar, luôn đứng trước thông tin meta tên người dùng. Chơi lô tô

Chúng ta chỉ cần đảm bảo bỏ qua vị trí đầu tiên (vì không có nội dung nào trước \0ustar đầu tiên) sau khi chia nội dung thành một mảng

3. Phân tích cú pháp chúng dưới dạng JSON

Ngay bây giờ, chúng tôi có nội dung của các tệp trong một mảng, nhưng bản thân nội dung vẫn được đặt trước và thành công với các ký tự điều khiển và thông tin meta và chúng tôi phải cắt bớt chúng trước khi chuyển đổi thành JSON

Đây là giải pháp này bắt đầu được điều chỉnh để chỉ hoạt động với các tệp JSON. Thay vì cố gắng tạo các mẫu về cách các ký tự xuất hiện trước và sau nội dung và tạo một số RegExp độc ác để cắt chúng, chúng ta có thể đi theo cách khác và chỉ cần kiểm tra lần xuất hiện đầu tiên và cuối cùng của {} hoặc

var targz = require('tar.gz');
var compress = new targz().extract('/path/to/stored.tar.gz', '/path/to/extract', function(err){
    if(err)
        console.log(err);

    console.log('The extraction has ended!');
});
0, mà mỗi

Mã tách + cắt trông giống như thế này

chú ý. bộ lọc để bỏ qua nếu bạn. indexOf trả về -1

Ghi chú. Tại sao lại sử dụng

var targz = require('tar.gz');
var compress = new targz().extract('/path/to/stored.tar.gz', '/path/to/extract', function(err){
    if(err)
        console.log(err);

    console.log('The extraction has ended!');
});
1,
var targz = require('tar.gz');
var compress = new targz().extract('/path/to/stored.tar.gz', '/path/to/extract', function(err){
    if(err)
        console.log(err);

    console.log('The extraction has ended!');
});
2 và phải kiểm tra cả {}.tar.gz0 khi một RegExp đơn giản sẽ làm như vậy? . Phiên bản đầu tiên của mã này đang sử dụng RegExps và nó không hoạt động tốt, khối này mất rất nhiều thời gian để thực thi và trong một số trường hợp gây nguy hiểm cho toàn bộ quá trình. Khi tôi chuyển sang các phương thức chuỗi thông thường, nó bắt đầu hoạt động tốt

Từ những gì còn lại sau khi cắt, chúng ta chỉ cần gọi .tar.gz1 và thế là xong

Mã đầy đủ trông như thế này

Một số lưu ý

Đây là một mã dấu chân nhỏ để nhận nội dung nén (gzip) tarball, giải nén và phân tích cú pháp dưới dạng JSON. Tuy nhiên, đây không phải là một giải pháp tốt để sử dụng trong mọi tình huống, như tôi muốn chỉ ra

Hiện tại gói này chỉ có thể nén một thư mục và mọi thứ bên trong nó. Để nén một cái gì đó là dễ dàng

var targz = require('tar.gz');
var compress = new targz().compress('/path/to/compress', '/path/to/store.tar.gz', function(err){
    if(err)
        console.log(err);

    console.log('The compression has ended!');
});

Với cùng một cách dễ dàng, bạn có thể giải nén một tệp được nén

var targz = require('tar.gz');
var compress = new targz().extract('/path/to/stored.tar.gz', '/path/to/extract', function(err){
    if(err)
        console.log(err);

    console.log('The extraction has ended!');
});

Bạn có thể chuyển một số tham số cấu hình cho hàm tạo trước khi nén

var targz = require('tar.gz');

var level = 6 //the compression level from 0-9, default: 6
var memLevel = 6 //the memory allocation level from 1-9, default: 6
var proprietary = true //to include or not proprietary headers, default: true

var compress = new targz(level, memLevel, proprietary).compress(...)

Dòng lệnh

$ targz -h

  Usage: targz [options]

  Options:

    -h, --help           output usage information
    -V, --version        output the version number
    -c, --compress       Compress folder to archive
    -x, --extract        Extract archive to folder
    -l, --level [n]      Compression level from 0-9. Default 6.
    -m, --memory [n]     Memory allocation level from 1-9. Default 6.
    -n, --noproprietary  Remove proprietary headers.

  Examples:

    Default compression
    $ targz -c /folder/to/compres /path/to/archive.tar.gz

    Extracting some archive
    $ targz -x /path/to/archive.tar.gz /destination/folder

    Maximum compression
    $ targz -l 9 -m 9 -c /folder/to/compres /path/to/archive.tar.gz

LÀM

  • lời thề. kiểm tra js
  • Nén tập tin duy nhất
  • Thêm nhiều việc cần làm

Giấy phép (MIT)

Bản quyền (C) 2012 Cranic Tecnologia e Informática LTDA

Theo đây, quyền được cấp miễn phí cho bất kỳ người nào có được bản sao của phần mềm này và các tệp tài liệu liên quan ("Phần mềm"), để xử lý Phần mềm mà không bị hạn chế, bao gồm nhưng không giới hạn các quyền sử dụng, sao chép, sửa đổi, hợp nhất

Thông báo bản quyền ở trên và thông báo cấp phép này sẽ được bao gồm trong tất cả các bản sao hoặc phần quan trọng của Phần mềm

PHẦN MỀM ĐƯỢC CUNG CẤP "NGUYÊN TRẠNG", KHÔNG CÓ BẢO ĐẢM DƯỚI BẤT KỲ HÌNH THỨC NÀO, RÕ RÀNG HAY NGỤ Ý, BAO GỒM NHƯNG KHÔNG GIỚI HẠN CÁC BẢO ĐẢM VỀ KHẢ NĂNG BÁN ĐƯỢC, TÍNH PHÙ HỢP CHO MỘT MỤC ĐÍCH CỤ THỂ VÀ KHÔNG VI PHẠM. TRONG BẤT KỲ TRƯỜNG HỢP NÀO TÁC GIẢ HOẶC NGƯỜI GIỮ BẢN QUYỀN SẼ KHÔNG CHỊU TRÁCH NHIỆM PHÁP LÝ VỀ BẤT KỲ KHIẾU NẠI, THIỆT HẠI HOẶC TRÁCH NHIỆM PHÁP LÝ KHÁC NÀO, DÙ TRONG MỘT HÀNH ĐỘNG HỢP ĐỒNG, NGOẠI TỆ HOẶC CÁCH NÀO KHÁC, PHÁT SINH TỪ, NGOÀI HOẶC LIÊN QUAN ĐẾN PHẦN MỀM HOẶC VIỆC SỬ DỤNG HOẶC CÁC GIAO DỊCH KHÁC TRONG