Skip to content

Commit

Permalink
Showing 3 changed files with 27 additions and 9 deletions.
6 changes: 4 additions & 2 deletions archive/_common.ts
Original file line number Diff line number Diff line change
@@ -71,7 +71,7 @@ struct posix_header { // byte offset
};
*/

export const ustarStructure: Array<{ field: string; length: number }> = [
export const ustarStructure = [
{
field: "fileName",
length: 100,
@@ -136,7 +136,9 @@ export const ustarStructure: Array<{ field: string; length: number }> = [
field: "padding",
length: 12,
},
];
] as const;

export type UstarFields = (typeof ustarStructure)[number]["field"];

export async function readBlock(
reader: Reader,
13 changes: 7 additions & 6 deletions archive/untar.ts
Original file line number Diff line number Diff line change
@@ -34,6 +34,7 @@ import {
HEADER_LENGTH,
readBlock,
type TarMeta,
UstarFields,
ustarStructure,
} from "./_common.ts";
import { readAll } from "../streams/read_all.ts";
@@ -47,9 +48,9 @@ export interface TarMetaWithLinkName extends TarMeta {
linkName?: string;
}

export interface TarHeader {
[key: string]: Uint8Array;
}
export type TarHeader = {
[key in UstarFields]: Uint8Array;
};

// https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_06
// eight checksum bytes taken to be ascii spaces (decimal value 32)
@@ -69,8 +70,8 @@ function trim(buffer: Uint8Array): Uint8Array {
* Parse file header in a tar archive
* @param length
*/
function parseHeader(buffer: Uint8Array): { [key: string]: Uint8Array } {
const data: { [key: string]: Uint8Array } = {};
function parseHeader(buffer: Uint8Array): TarHeader {
const data = {} as TarHeader;
let offset = 0;
ustarStructure.forEach(function (value) {
const arr = buffer.subarray(offset, offset + value.length);
@@ -222,7 +223,7 @@ export class Untar {
// Ignore checksum header
continue;
}
sum += header[i];
sum += header[i]!;
}
return sum;
}
17 changes: 16 additions & 1 deletion archive/untar_test.ts
Original file line number Diff line number Diff line change
@@ -332,7 +332,22 @@ Deno.test({
// Test TarEntry type
const bufSizes = [1, 53, 256, 511];
const header: TarHeader = {
test: new Uint8Array(bufSizes),
fileName: new Uint8Array(bufSizes),
fileMode: new Uint8Array(bufSizes),
uid: new Uint8Array(bufSizes),
gid: new Uint8Array(bufSizes),
fileSize: new Uint8Array(bufSizes),
mtime: new Uint8Array(bufSizes),
checksum: new Uint8Array(bufSizes),
type: new Uint8Array(bufSizes),
linkName: new Uint8Array(bufSizes),
ustar: new Uint8Array(bufSizes),
owner: new Uint8Array(bufSizes),
group: new Uint8Array(bufSizes),
majorNumber: new Uint8Array(bufSizes),
minorNumber: new Uint8Array(bufSizes),
fileNamePrefix: new Uint8Array(bufSizes),
padding: new Uint8Array(bufSizes),
};
const content = new TextEncoder().encode("hello tar world!");
const reader = new Buffer(content);

0 comments on commit efb3866

Please sign in to comment.