@zukhruf/docker 0.3.33 → 0.3.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +26 -12
  2. package/dist/container-process.d.ts +35 -0
  3. package/dist/container-process.d.ts.map +1 -0
  4. package/dist/container-process.js +91 -0
  5. package/dist/container-process.js.map +1 -0
  6. package/dist/containers.d.ts +160 -0
  7. package/dist/containers.d.ts.map +1 -0
  8. package/dist/containers.js +700 -0
  9. package/dist/containers.js.map +1 -0
  10. package/dist/docker.d.ts +25 -2
  11. package/dist/docker.d.ts.map +1 -1
  12. package/dist/docker.js +43 -7
  13. package/dist/docker.js.map +1 -1
  14. package/dist/engine-api.d.ts +369 -0
  15. package/dist/engine-api.d.ts.map +1 -1
  16. package/dist/engine-client.d.ts +52 -4
  17. package/dist/engine-client.d.ts.map +1 -1
  18. package/dist/engine-client.js +167 -31
  19. package/dist/engine-client.js.map +1 -1
  20. package/dist/errors.d.ts +95 -5
  21. package/dist/errors.d.ts.map +1 -1
  22. package/dist/errors.js +156 -6
  23. package/dist/errors.js.map +1 -1
  24. package/dist/images.d.ts +40 -0
  25. package/dist/images.d.ts.map +1 -0
  26. package/dist/images.js +173 -0
  27. package/dist/images.js.map +1 -0
  28. package/dist/index.d.ts +8 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +4 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/multiplexed-stream.d.ts +11 -0
  33. package/dist/multiplexed-stream.d.ts.map +1 -0
  34. package/dist/multiplexed-stream.js +81 -0
  35. package/dist/multiplexed-stream.js.map +1 -0
  36. package/dist/ndjson.d.ts +7 -0
  37. package/dist/ndjson.d.ts.map +1 -0
  38. package/dist/ndjson.js +21 -0
  39. package/dist/ndjson.js.map +1 -0
  40. package/dist/networks.d.ts +46 -0
  41. package/dist/networks.d.ts.map +1 -0
  42. package/dist/networks.js +170 -0
  43. package/dist/networks.js.map +1 -0
  44. package/dist/output.d.ts +18 -0
  45. package/dist/output.d.ts.map +1 -0
  46. package/dist/output.js +21 -0
  47. package/dist/output.js.map +1 -0
  48. package/dist/progress.d.ts +9 -0
  49. package/dist/progress.d.ts.map +1 -0
  50. package/dist/progress.js +20 -0
  51. package/dist/progress.js.map +1 -0
  52. package/dist/ssh-connection.d.ts +3 -0
  53. package/dist/ssh-connection.d.ts.map +1 -1
  54. package/dist/ssh-connection.js +46 -10
  55. package/dist/ssh-connection.js.map +1 -1
  56. package/dist/tar-reader.d.ts +22 -0
  57. package/dist/tar-reader.d.ts.map +1 -0
  58. package/dist/tar-reader.js +163 -0
  59. package/dist/tar-reader.js.map +1 -0
  60. package/dist/tar-writer.d.ts +16 -0
  61. package/dist/tar-writer.d.ts.map +1 -0
  62. package/dist/tar-writer.js +114 -0
  63. package/dist/tar-writer.js.map +1 -0
  64. package/dist/transport.d.ts +11 -1
  65. package/dist/transport.d.ts.map +1 -1
  66. package/dist/transport.js +34 -2
  67. package/dist/transport.js.map +1 -1
  68. package/dist/volumes.d.ts +41 -0
  69. package/dist/volumes.d.ts.map +1 -0
  70. package/dist/volumes.js +119 -0
  71. package/dist/volumes.js.map +1 -0
  72. package/package.json +5 -2
@@ -0,0 +1,163 @@
1
+ import { DockerError } from "./errors.js";
2
+ const BLOCK = 512;
3
+ const decoder = new TextDecoder();
4
+ /** Reads blocks of a given length from a stream of chunks of each length. */
5
+ class ByteReader {
6
+ #chunks;
7
+ #pending = [];
8
+ #length = 0;
9
+ constructor(chunks) {
10
+ this.#chunks = chunks[Symbol.asyncIterator]();
11
+ }
12
+ /** The next `length` bytes, or undefined when the stream ends first. */
13
+ async read(length) {
14
+ while (this.#length < length) {
15
+ const next = await this.#chunks.next();
16
+ if (next.done === true)
17
+ return undefined;
18
+ this.#pending.push(next.value);
19
+ this.#length += next.value.byteLength;
20
+ }
21
+ const bytes = new Uint8Array(length);
22
+ let offset = 0;
23
+ while (offset < length) {
24
+ const [first, ...rest] = this.#pending;
25
+ if (first === undefined)
26
+ break;
27
+ const part = first.subarray(0, length - offset);
28
+ bytes.set(part, offset);
29
+ offset += part.byteLength;
30
+ this.#pending =
31
+ part.byteLength === first.byteLength
32
+ ? rest
33
+ : [first.subarray(part.byteLength), ...rest];
34
+ }
35
+ this.#length -= length;
36
+ return bytes;
37
+ }
38
+ /** Stops the stream of chunks. */
39
+ async close() {
40
+ await this.#chunks.return?.();
41
+ }
42
+ }
43
+ function text(block, offset, length) {
44
+ const field = block.subarray(offset, offset + length);
45
+ const end = field.indexOf(0);
46
+ return decoder.decode(end === -1 ? field : field.subarray(0, end));
47
+ }
48
+ /** An octal field, or a base-256 field (GNU) when its first byte has the high bit. */
49
+ function number(block, offset, length) {
50
+ const field = block.subarray(offset, offset + length);
51
+ if (((field[0] ?? 0) & 0x80) !== 0) {
52
+ return field
53
+ .subarray(1)
54
+ .reduce((value, byte) => value * 256 + byte, (field[0] ?? 0) & 0x7f);
55
+ }
56
+ const digits = text(block, offset, length).trim();
57
+ return digits === '' ? 0 : Number.parseInt(digits, 8);
58
+ }
59
+ function checksumHolds(block) {
60
+ let sum = 0;
61
+ for (let index = 0; index < BLOCK; index++) {
62
+ sum += index >= 148 && index < 156 ? 0x20 : (block[index] ?? 0);
63
+ }
64
+ return sum === number(block, 148, 8);
65
+ }
66
+ /** The records of a PAX header: "<length> <key>=<value>\n" each. */
67
+ function paxRecords(data) {
68
+ const records = new Map();
69
+ let offset = 0;
70
+ while (offset < data.byteLength) {
71
+ const space = data.indexOf(0x20, offset);
72
+ if (space === -1)
73
+ break;
74
+ const length = Number.parseInt(decoder.decode(data.subarray(offset, space)), 10);
75
+ if (!Number.isInteger(length) || length <= 0)
76
+ break;
77
+ const record = decoder.decode(data.subarray(space + 1, offset + length - 1));
78
+ const equals = record.indexOf('=');
79
+ if (equals !== -1) {
80
+ records.set(record.slice(0, equals), record.slice(equals + 1));
81
+ }
82
+ offset += length;
83
+ }
84
+ return records;
85
+ }
86
+ function typeOf(flag) {
87
+ if (flag === '0' || flag === '' || flag === '7')
88
+ return 'file';
89
+ if (flag === '5')
90
+ return 'directory';
91
+ if (flag === '2')
92
+ return 'symlink';
93
+ if (flag === '1')
94
+ return 'link';
95
+ return 'other';
96
+ }
97
+ /**
98
+ * The entries of a tar archive, as the chunks come. It takes ustar, PAX
99
+ * headers for one entry ('x'), and the GNU long name ('L') and long link
100
+ * ('K'). It skips a global PAX header ('g'). Each entry comes with its bytes.
101
+ */
102
+ export async function* tarEntries(chunks) {
103
+ const reader = new ByteReader(chunks);
104
+ try {
105
+ let pax = new Map();
106
+ let longName;
107
+ let longLink;
108
+ for (;;) {
109
+ const block = await reader.read(BLOCK);
110
+ if (block === undefined || block.every((byte) => byte === 0))
111
+ return;
112
+ if (!checksumHolds(block)) {
113
+ throw new DockerError('The tar archive has a header with a bad checksum.');
114
+ }
115
+ const flag = text(block, 156, 1);
116
+ const paxSize = pax.get('size');
117
+ const size = paxSize === undefined ? number(block, 124, 12) : Number(paxSize);
118
+ const data = await reader.read(size + ((BLOCK - (size % BLOCK)) % BLOCK));
119
+ if (data === undefined) {
120
+ throw new DockerError('The tar archive ends inside an entry.');
121
+ }
122
+ const body = data.subarray(0, size);
123
+ if (flag === 'x') {
124
+ pax = paxRecords(body);
125
+ continue;
126
+ }
127
+ if (flag === 'g')
128
+ continue;
129
+ if (flag === 'L' || flag === 'K') {
130
+ const value = text(body, 0, body.byteLength);
131
+ if (flag === 'L')
132
+ longName = value;
133
+ else
134
+ longLink = value;
135
+ continue;
136
+ }
137
+ const prefix = text(block, 257, 5) === 'ustar' ? text(block, 345, 155) : '';
138
+ const name = text(block, 0, 100);
139
+ const path = pax.get('path') ?? longName ?? (prefix ? `${prefix}/${name}` : name);
140
+ const paxNumber = (key, fallback) => {
141
+ const value = pax.get(key);
142
+ return value === undefined ? fallback : Number(value);
143
+ };
144
+ yield {
145
+ path: path.endsWith('/') ? path.slice(0, -1) : path,
146
+ type: typeOf(flag),
147
+ mode: number(block, 100, 8),
148
+ uid: paxNumber('uid', number(block, 108, 8)),
149
+ gid: paxNumber('gid', number(block, 116, 8)),
150
+ mtime: Math.floor(paxNumber('mtime', number(block, 136, 12))),
151
+ linkTarget: pax.get('linkpath') ?? longLink ?? text(block, 157, 100),
152
+ data: body,
153
+ };
154
+ pax = new Map();
155
+ longName = undefined;
156
+ longLink = undefined;
157
+ }
158
+ }
159
+ finally {
160
+ await reader.close();
161
+ }
162
+ }
163
+ //# sourceMappingURL=tar-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar-reader.js","sourceRoot":"","sources":["../src/tar-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** One entry for tarArchive(): a regular file or a directory. */
2
+ export interface TarWriterEntry {
3
+ /** The name in the archive, relative, with '/' between its parts. */
4
+ path: string;
5
+ type: 'file' | 'directory';
6
+ /** The bytes of a file; empty for a directory. */
7
+ data: Uint8Array;
8
+ mode: number;
9
+ uid: number;
10
+ gid: number;
11
+ /** Seconds since the Unix epoch. */
12
+ mtime: number;
13
+ }
14
+ /** A ustar archive of the entries, with a PAX header for a long path, a large size or a large owner, and two zero blocks at its end. */
15
+ export declare function tarArchive(entries: TarWriterEntry[]): Uint8Array;
16
+ //# sourceMappingURL=tar-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar-writer.d.ts","sourceRoot":"","sources":["../src/tar-writer.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,kDAAkD;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;CACf;AA6ID,wIAAwI;AACxI,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,UAAU,CAWhE"}
@@ -0,0 +1,114 @@
1
+ const BLOCK = 512;
2
+ const NAME_LENGTH = 100;
3
+ const PREFIX_LENGTH = 155;
4
+ /** The highest value of an octal field of 12 bytes: 11 digits. 8 GiB - 1 for a size. */
5
+ const MAX_SIZE = 0o77777777777;
6
+ /** The highest value of an octal field of 8 bytes: 7 digits. */
7
+ const MAX_ID = 0o7777777;
8
+ const encoder = new TextEncoder();
9
+ /** The ustar name and prefix of a path, or undefined when the path needs a PAX header. */
10
+ function ustarName(path) {
11
+ if (encoder.encode(path).byteLength <= NAME_LENGTH) {
12
+ return { name: path, prefix: '' };
13
+ }
14
+ for (let slash = path.indexOf('/'); slash !== -1;) {
15
+ const prefix = path.slice(0, slash);
16
+ const name = path.slice(slash + 1);
17
+ if (encoder.encode(prefix).byteLength > PREFIX_LENGTH)
18
+ return undefined;
19
+ if (name !== '' && encoder.encode(name).byteLength <= NAME_LENGTH) {
20
+ return { name, prefix };
21
+ }
22
+ slash = path.indexOf('/', slash + 1);
23
+ }
24
+ return undefined;
25
+ }
26
+ /** One PAX record: "<length> <key>=<value>\n", where the length counts itself. */
27
+ function paxRecord(key, value) {
28
+ const body = ` ${key}=${value}\n`;
29
+ const bodyLength = encoder.encode(body).byteLength;
30
+ let length = bodyLength + String(bodyLength).length;
31
+ if (String(length).length !== String(bodyLength).length) {
32
+ length = bodyLength + String(length).length;
33
+ }
34
+ return `${length}${body}`;
35
+ }
36
+ function writeText(header, offset, length, text) {
37
+ header.set(encoder.encode(text).subarray(0, length), offset);
38
+ }
39
+ /** An octal number with leading zeros and a NUL, in a field of `length` bytes. */
40
+ function writeOctal(header, offset, length, value) {
41
+ writeText(header, offset, length - 1, value.toString(8).padStart(length - 1, '0'));
42
+ }
43
+ function header(fields) {
44
+ const block = new Uint8Array(BLOCK);
45
+ writeText(block, 0, NAME_LENGTH, fields.name);
46
+ writeOctal(block, 100, 8, fields.mode & 0o7777);
47
+ writeOctal(block, 108, 8, fields.uid);
48
+ writeOctal(block, 116, 8, fields.gid);
49
+ writeOctal(block, 124, 12, fields.size);
50
+ writeOctal(block, 136, 12, fields.mtime);
51
+ writeText(block, 156, 1, fields.type);
52
+ writeText(block, 257, 6, 'ustar\0');
53
+ writeText(block, 263, 2, '00');
54
+ writeText(block, 345, PREFIX_LENGTH, fields.prefix);
55
+ // The checksum counts its own field as eight spaces.
56
+ block.fill(0x20, 148, 156);
57
+ const sum = block.reduce((total, byte) => total + byte, 0);
58
+ writeText(block, 148, 8, `${sum.toString(8).padStart(6, '0')}\0 `);
59
+ return block;
60
+ }
61
+ function padding(size) {
62
+ return new Uint8Array((BLOCK - (size % BLOCK)) % BLOCK);
63
+ }
64
+ /** The blocks of one entry: a PAX header when a field does not fit ustar, the header, the data and its padding. */
65
+ function entryBlocks(entry) {
66
+ const path = entry.type === 'directory' ? `${entry.path}/` : entry.path;
67
+ const size = entry.type === 'directory' ? 0 : entry.data.byteLength;
68
+ const fitted = ustarName(path);
69
+ const records = [
70
+ fitted === undefined ? paxRecord('path', path) : '',
71
+ size > MAX_SIZE ? paxRecord('size', String(size)) : '',
72
+ entry.uid > MAX_ID ? paxRecord('uid', String(entry.uid)) : '',
73
+ entry.gid > MAX_ID ? paxRecord('gid', String(entry.gid)) : '',
74
+ ].join('');
75
+ const blocks = [];
76
+ const fields = {
77
+ // A reader that knows no PAX gets the first bytes of the path.
78
+ name: fitted?.name ?? path.slice(0, NAME_LENGTH),
79
+ prefix: fitted?.prefix ?? '',
80
+ type: entry.type === 'directory' ? '5' : '0',
81
+ size: Math.min(size, MAX_SIZE),
82
+ mode: entry.mode,
83
+ uid: Math.min(entry.uid, MAX_ID),
84
+ gid: Math.min(entry.gid, MAX_ID),
85
+ mtime: entry.mtime,
86
+ };
87
+ if (records !== '') {
88
+ const data = encoder.encode(records);
89
+ blocks.push(header({
90
+ ...fields,
91
+ name: `PaxHeaders/${fields.name}`.slice(0, NAME_LENGTH),
92
+ prefix: '',
93
+ type: 'x',
94
+ size: data.byteLength,
95
+ mode: 0o644,
96
+ }), data, padding(data.byteLength));
97
+ }
98
+ blocks.push(header(fields));
99
+ if (size > 0)
100
+ blocks.push(entry.data, padding(size));
101
+ return blocks;
102
+ }
103
+ /** A ustar archive of the entries, with a PAX header for a long path, a large size or a large owner, and two zero blocks at its end. */
104
+ export function tarArchive(entries) {
105
+ const blocks = [...entries.flatMap(entryBlocks), new Uint8Array(BLOCK * 2)];
106
+ const archive = new Uint8Array(blocks.reduce((total, block) => total + block.byteLength, 0));
107
+ let offset = 0;
108
+ for (const block of blocks) {
109
+ archive.set(block, offset);
110
+ offset += block.byteLength;
111
+ }
112
+ return archive;
113
+ }
114
+ //# sourceMappingURL=tar-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar-writer.js","sourceRoot":"","sources":["../src/tar-writer.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
1
  import { type ClientRequest, type RequestOptions } from 'node:http';
2
+ import type { Duplex } from 'node:stream';
2
3
  /** The connections of a client to its engine. */
3
4
  export interface Transport {
4
5
  request(options: RequestOptions): ClientRequest;
6
+ /** Ends the input of a hijacked connection, and keeps its output open. */
7
+ endInput(socket: Duplex): void;
5
8
  /** Closes each connection, idle or in use, and resolves when each one is closed. */
6
9
  close(): Promise<void>;
7
10
  }
@@ -12,8 +15,15 @@ export interface Transport {
12
15
  */
13
16
  export declare class SocketTransport implements Transport {
14
17
  #private;
15
- constructor(socketPath: string);
18
+ constructor(kind: 'unix' | 'npipe', socketPath: string);
16
19
  request(options: RequestOptions): ClientRequest;
20
+ /**
21
+ * A Unix socket shuts down its write side. A named pipe has no shutdown of
22
+ * one side: the engine reads a message of zero bytes as the end, as
23
+ * CloseWrite of go-winio sends it.
24
+ */
25
+ endInput(socket: Duplex): void;
26
+ /** Closes each connection, idle, in use or upgraded, and resolves when each one is closed. */
17
27
  close(): Promise<void>;
18
28
  }
19
29
  //# sourceMappingURL=transport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EAEpB,MAAM,WAAW,CAAC;AAEnB,iDAAiD;AACjD,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAAC;IAChD,oFAAoF;IACpF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;;gBAInC,UAAU,EAAE,MAAM;IAI9B,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa;IAQzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EAEpB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,iDAAiD;AACjD,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAAC;IAChD,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oFAAoF;IACpF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;;gBAOnC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM;IAKtD,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa;IAgB/C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK9B,8FAA8F;IACxF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAY7B"}
package/dist/transport.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { once } from 'node:events';
1
2
  import { Agent, request, } from 'node:http';
2
3
  /**
3
4
  * The connections to one engine through a Unix socket or a Windows named pipe.
@@ -5,20 +6,51 @@ import { Agent, request, } from 'node:http';
5
6
  * not keep the process running: the agent unrefs each free socket.
6
7
  */
7
8
  export class SocketTransport {
9
+ #kind;
8
10
  #socketPath;
9
11
  #agent = new Agent({ keepAlive: true });
10
- constructor(socketPath) {
12
+ /** Each connection until it closes, also after an upgrade takes it from the agent. */
13
+ #sockets = new Set();
14
+ constructor(kind, socketPath) {
15
+ this.#kind = kind;
11
16
  this.#socketPath = socketPath;
12
17
  }
13
18
  request(options) {
14
- return request({
19
+ const sent = request({
15
20
  ...options,
16
21
  agent: this.#agent,
17
22
  socketPath: this.#socketPath,
18
23
  });
24
+ sent.once('socket', (socket) => this.#hold(socket));
25
+ return sent;
19
26
  }
27
+ #hold(socket) {
28
+ if (socket.destroyed)
29
+ return;
30
+ this.#sockets.add(socket);
31
+ socket.once('close', () => this.#sockets.delete(socket));
32
+ }
33
+ /**
34
+ * A Unix socket shuts down its write side. A named pipe has no shutdown of
35
+ * one side: the engine reads a message of zero bytes as the end, as
36
+ * CloseWrite of go-winio sends it.
37
+ */
38
+ endInput(socket) {
39
+ if (this.#kind === 'npipe')
40
+ socket.write(Buffer.alloc(0));
41
+ socket.end();
42
+ }
43
+ /** Closes each connection, idle, in use or upgraded, and resolves when each one is closed. */
20
44
  async close() {
45
+ const sockets = [...this.#sockets];
21
46
  this.#agent.destroy();
47
+ await Promise.all(sockets.map(async (socket) => {
48
+ if (socket.closed)
49
+ return;
50
+ const closed = once(socket, 'close');
51
+ socket.destroy();
52
+ await closed;
53
+ }));
22
54
  }
23
55
  }
24
56
  //# sourceMappingURL=transport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAGL,OAAO,GACR,MAAM,WAAW,CAAC;AASnB;;;;GAIG;AACH,MAAM,OAAO,eAAe;IACjB,WAAW,CAAS;IACpB,MAAM,GAAG,IAAI,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjD,YAAY,UAAkB;QAC5B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,OAAuB;QAC7B,OAAO,OAAO,CAAC;YACb,GAAG,OAAO;YACV,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,UAAU,EAAE,IAAI,CAAC,WAAW;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;CACF"}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EACL,KAAK,EAGL,OAAO,GACR,MAAM,WAAW,CAAC;AAYnB;;;;GAIG;AACH,MAAM,OAAO,eAAe;IACjB,KAAK,CAAmB;IACxB,WAAW,CAAS;IACpB,MAAM,GAAG,IAAI,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,sFAAsF;IAC7E,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,YAAY,IAAsB,EAAE,UAAkB;QACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,OAAuB;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC;YACnB,GAAG,OAAO;YACV,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,UAAU,EAAE,IAAI,CAAC,WAAW;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAc;QAClB,IAAI,MAAM,CAAC,SAAS;YAAE,OAAO;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,MAAc;QACrB,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO;YAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,EAAE,CAAC;IACf,CAAC;IAED,8FAA8F;IAC9F,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC3B,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,MAAM,CAAC;QACf,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,41 @@
1
+ import type { Created } from './containers.ts';
2
+ import type * as EngineApi from './engine-api.ts';
3
+ import { type EngineClient } from './engine-client.ts';
4
+ import type { CancelOptions, Filters } from './options.ts';
5
+ /** A volume, by its name: a volume has no ID. It has no disposal. */
6
+ export declare class Volume {
7
+ #private;
8
+ readonly name: string;
9
+ constructor(client: EngineClient, name: string);
10
+ inspect(options?: CancelOptions): Promise<EngineApi.Volume>;
11
+ /** Resolves for 404. Rejects with VolumeInUseError while a container uses the volume. */
12
+ remove(options?: CancelOptions & {
13
+ force?: boolean;
14
+ }): Promise<void>;
15
+ }
16
+ /** A volume that this handle created. Disposal removes it. */
17
+ export declare class OwnedVolume extends Volume implements AsyncDisposable {
18
+ /** remove() */
19
+ [Symbol.asyncDispose](): Promise<void>;
20
+ }
21
+ /** The volumes of one engine. */
22
+ export declare class Volumes {
23
+ #private;
24
+ constructor(client: EngineClient);
25
+ /**
26
+ * Rejects with NameConflictError when the name is taken. The engine answers
27
+ * that create with the existing volume and 201, so the error has the status
28
+ * 201.
29
+ */
30
+ create(body?: EngineApi.VolumeCreateRequest, options?: CancelOptions): Promise<OwnedVolume>;
31
+ /** Creates the volume, or gives the one that has the name. The volume that exists wins. */
32
+ createOrGet(body: EngineApi.VolumeCreateRequest & {
33
+ Name: string;
34
+ }, options?: CancelOptions): Promise<Created<'volume', OwnedVolume, Volume>>;
35
+ /** One inspect: a handle, or undefined for 404. */
36
+ find(name: string, options?: CancelOptions): Promise<Volume | undefined>;
37
+ list(options?: CancelOptions & {
38
+ filters?: Filters;
39
+ }): Promise<EngineApi.Volume[]>;
40
+ }
41
+ //# sourceMappingURL=volumes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volumes.d.ts","sourceRoot":"","sources":["../src/volumes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,KAAK,YAAY,EAAwB,MAAM,oBAAoB,CAAC;AAM7E,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAS3D,qEAAqE;AACrE,qBAAa,MAAM;;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAGV,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM;IASxC,OAAO,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;IAcrE,yFAAyF;IACnF,MAAM,CACV,OAAO,GAAE,aAAa,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAChD,OAAO,CAAC,IAAI,CAAC;CAgBjB;AAED,8DAA8D;AAC9D,qBAAa,WAAY,SAAQ,MAAO,YAAW,eAAe;IAChE,eAAe;IACT,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C;AAED,iCAAiC;AACjC,qBAAa,OAAO;;gBAGN,MAAM,EAAE,YAAY;IAIhC;;;;OAIG;IACG,MAAM,CACV,IAAI,GAAE,SAAS,CAAC,mBAAwB,EACxC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,WAAW,CAAC;IAWvB,2FAA2F;IACrF,WAAW,CACf,IAAI,EAAE,SAAS,CAAC,mBAAmB,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EACtD,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAOlD,mDAAmD;IAC7C,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IASxB,IAAI,CACR,OAAO,GAAE,aAAa,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAClD,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;CA6B/B"}
@@ -0,0 +1,119 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { isSuccess, parseBody } from "./engine-client.js";
3
+ import { NameConflictError, VolumeInUseError, VolumeNotFoundError, } from "./errors.js";
4
+ /**
5
+ * The creation label. The engine answers a create with a taken name with the
6
+ * existing volume, so a random value of this label tells a new volume from an
7
+ * existing one.
8
+ */
9
+ const CREATION_LABEL = 'dev.zukhruf.docker.creation';
10
+ /** A volume, by its name: a volume has no ID. It has no disposal. */
11
+ export class Volume {
12
+ name;
13
+ #client;
14
+ constructor(client, name) {
15
+ this.#client = client;
16
+ this.name = name;
17
+ }
18
+ get #path() {
19
+ return `/volumes/${encodeURIComponent(this.name)}`;
20
+ }
21
+ async inspect(options = {}) {
22
+ const method = 'GET';
23
+ const path = this.#path;
24
+ const response = await this.#client.exchange(method, path, options);
25
+ if (isSuccess(response))
26
+ return parseBody(response);
27
+ const error = this.#client.error(response, method, path);
28
+ if (response.status === 404) {
29
+ throw new VolumeNotFoundError(error.message, error, this.name, {
30
+ cause: error,
31
+ });
32
+ }
33
+ throw error;
34
+ }
35
+ /** Resolves for 404. Rejects with VolumeInUseError while a container uses the volume. */
36
+ async remove(options = {}) {
37
+ const method = 'DELETE';
38
+ const path = this.#path;
39
+ const response = await this.#client.exchange(method, path, {
40
+ query: { force: options.force },
41
+ signal: options.signal,
42
+ });
43
+ if (isSuccess(response) || response.status === 404)
44
+ return;
45
+ const error = this.#client.error(response, method, path);
46
+ if (response.status === 409) {
47
+ throw new VolumeInUseError(error.message, error, this.name, {
48
+ cause: error,
49
+ });
50
+ }
51
+ throw error;
52
+ }
53
+ }
54
+ /** A volume that this handle created. Disposal removes it. */
55
+ export class OwnedVolume extends Volume {
56
+ /** remove() */
57
+ async [Symbol.asyncDispose]() {
58
+ await this.remove();
59
+ }
60
+ }
61
+ /** The volumes of one engine. */
62
+ export class Volumes {
63
+ #client;
64
+ constructor(client) {
65
+ this.#client = client;
66
+ }
67
+ /**
68
+ * Rejects with NameConflictError when the name is taken. The engine answers
69
+ * that create with the existing volume and 201, so the error has the status
70
+ * 201.
71
+ */
72
+ async create(body = {}, options = {}) {
73
+ const { created, name, status } = await this.#create(body, options);
74
+ if (created)
75
+ return new OwnedVolume(this.#client, name);
76
+ throw new NameConflictError(`A volume with the name ${name} already exists.`, { status, request: { method: 'POST', path: '/volumes/create' } }, 'volume', name);
77
+ }
78
+ /** Creates the volume, or gives the one that has the name. The volume that exists wins. */
79
+ async createOrGet(body, options = {}) {
80
+ const { created, name } = await this.#create(body, options);
81
+ return created
82
+ ? { created: true, volume: new OwnedVolume(this.#client, name) }
83
+ : { created: false, volume: new Volume(this.#client, name) };
84
+ }
85
+ /** One inspect: a handle, or undefined for 404. */
86
+ async find(name, options = {}) {
87
+ const method = 'GET';
88
+ const path = `/volumes/${encodeURIComponent(name)}`;
89
+ const response = await this.#client.exchange(method, path, options);
90
+ if (response.status === 404)
91
+ return undefined;
92
+ if (!isSuccess(response))
93
+ throw this.#client.error(response, method, path);
94
+ return new Volume(this.#client, parseBody(response).Name);
95
+ }
96
+ async list(options = {}) {
97
+ const { Volumes } = await this.#client.json('GET', '/volumes', { query: { filters: options.filters }, signal: options.signal });
98
+ return Volumes ?? [];
99
+ }
100
+ /** Sends the create with a new creation label. The label of the answer tells whether this call created the volume. */
101
+ async #create(body, options) {
102
+ const creation = randomUUID();
103
+ const method = 'POST';
104
+ const path = '/volumes/create';
105
+ const response = await this.#client.exchange(method, path, {
106
+ body: { ...body, Labels: { ...body.Labels, [CREATION_LABEL]: creation } },
107
+ signal: options.signal,
108
+ });
109
+ if (!isSuccess(response))
110
+ throw this.#client.error(response, method, path);
111
+ const volume = parseBody(response);
112
+ return {
113
+ created: volume.Labels?.[CREATION_LABEL] === creation,
114
+ name: volume.Name,
115
+ status: response.status,
116
+ };
117
+ }
118
+ }
119
+ //# sourceMappingURL=volumes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volumes.js","sourceRoot":"","sources":["../src/volumes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zukhruf/docker",
3
- "version": "0.3.33",
4
- "description": "A client for the Docker Engine API on Node.js. It selects the engine that the Docker CLI selects, and it sends HTTP requests to that engine through a Unix socket, a Windows named pipe or SSH, with no Docker CLI and no dependencies.",
3
+ "version": "0.3.35",
4
+ "description": "A client for the Docker Engine API on Node.js. It selects the engine that the Docker CLI selects, and it sends HTTP requests to that engine through a Unix socket, a Windows named pipe or SSH, with no Docker CLI and no third-party dependencies.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -38,5 +38,8 @@
38
38
  ],
39
39
  "publishConfig": {
40
40
  "access": "public"
41
+ },
42
+ "dependencies": {
43
+ "@zukhruf/async": "^0.3.35"
41
44
  }
42
45
  }