testcontainers 9.2.0 → 9.3.0

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 (182) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/bound-ports.d.ts +12 -0
  3. package/dist/src/bound-ports.js +50 -0
  4. package/dist/src/clock.d.ts +7 -0
  5. package/dist/src/clock.js +9 -0
  6. package/dist/src/docker/docker-client-config.d.ts +10 -0
  7. package/dist/src/docker/docker-client-config.js +66 -0
  8. package/dist/src/docker/docker-client.d.ts +24 -0
  9. package/dist/src/docker/docker-client.js +198 -0
  10. package/dist/src/docker/functions/container/attach-container.d.ts +3 -0
  11. package/dist/src/docker/functions/container/attach-container.js +25 -0
  12. package/dist/src/docker/functions/container/container-logs.d.ts +6 -0
  13. package/dist/src/docker/functions/container/container-logs.js +32 -0
  14. package/dist/src/docker/functions/container/create-container.d.ts +30 -0
  15. package/dist/src/docker/functions/container/create-container.js +114 -0
  16. package/dist/src/docker/functions/container/exec-container.d.ts +9 -0
  17. package/dist/src/docker/functions/container/exec-container.js +59 -0
  18. package/dist/src/docker/functions/container/get-container.d.ts +3 -0
  19. package/dist/src/docker/functions/container/get-container.js +49 -0
  20. package/dist/src/docker/functions/container/inspect-container.d.ts +19 -0
  21. package/dist/src/docker/functions/container/inspect-container.js +67 -0
  22. package/dist/src/docker/functions/container/list-containers.d.ts +2 -0
  23. package/dist/src/docker/functions/container/list-containers.js +25 -0
  24. package/dist/src/docker/functions/container/put-container-archive.d.ts +9 -0
  25. package/dist/src/docker/functions/container/put-container-archive.js +23 -0
  26. package/dist/src/docker/functions/container/remove-container.d.ts +5 -0
  27. package/dist/src/docker/functions/container/remove-container.js +23 -0
  28. package/dist/src/docker/functions/container/restart-container.d.ts +5 -0
  29. package/dist/src/docker/functions/container/restart-container.js +23 -0
  30. package/dist/src/docker/functions/container/start-container.d.ts +2 -0
  31. package/dist/src/docker/functions/container/start-container.js +23 -0
  32. package/dist/src/docker/functions/container/stop-container.d.ts +5 -0
  33. package/dist/src/docker/functions/container/stop-container.js +29 -0
  34. package/dist/src/docker/functions/create-labels.d.ts +3 -0
  35. package/dist/src/docker/functions/create-labels.js +17 -0
  36. package/dist/src/docker/functions/demux-stream.d.ts +3 -0
  37. package/dist/src/docker/functions/demux-stream.js +32 -0
  38. package/dist/src/docker/functions/get-info.d.ts +11 -0
  39. package/dist/src/docker/functions/get-info.js +38 -0
  40. package/dist/src/docker/functions/image/build-image.d.ts +13 -0
  41. package/dist/src/docker/functions/image/build-image.js +76 -0
  42. package/dist/src/docker/functions/image/image-exists.d.ts +3 -0
  43. package/dist/src/docker/functions/image/image-exists.js +34 -0
  44. package/dist/src/docker/functions/image/list-images.d.ts +3 -0
  45. package/dist/src/docker/functions/image/list-images.js +34 -0
  46. package/dist/src/docker/functions/image/pull-image.d.ts +7 -0
  47. package/dist/src/docker/functions/image/pull-image.js +41 -0
  48. package/dist/src/docker/functions/network/connect-network.d.ts +6 -0
  49. package/dist/src/docker/functions/network/connect-network.js +27 -0
  50. package/dist/src/docker/functions/network/create-network.d.ts +16 -0
  51. package/dist/src/docker/functions/network/create-network.js +38 -0
  52. package/dist/src/docker/functions/network/remove-network.d.ts +1 -0
  53. package/dist/src/docker/functions/network/remove-network.js +30 -0
  54. package/dist/src/docker/functions/run-in-container.d.ts +2 -0
  55. package/dist/src/docker/functions/run-in-container.js +39 -0
  56. package/dist/src/docker/get-remote-docker-unix-socket-path.d.ts +5 -0
  57. package/dist/src/docker/get-remote-docker-unix-socket-path.js +17 -0
  58. package/dist/src/docker/lookup-host-ips.d.ts +5 -0
  59. package/dist/src/docker/lookup-host-ips.js +26 -0
  60. package/dist/src/docker/pull-stream-parser.d.ts +11 -0
  61. package/dist/src/docker/pull-stream-parser.js +63 -0
  62. package/dist/src/docker/rootless-unix-socket-strategy.d.ts +16 -0
  63. package/dist/src/docker/rootless-unix-socket-strategy.js +69 -0
  64. package/dist/src/docker/session-id.d.ts +1 -0
  65. package/dist/src/docker/session-id.js +5 -0
  66. package/dist/src/docker/types.d.ts +79 -0
  67. package/dist/src/docker/types.js +2 -0
  68. package/dist/src/docker-compose/default-docker-compose-options.d.ts +3 -0
  69. package/dist/src/docker-compose/default-docker-compose-options.js +37 -0
  70. package/dist/src/docker-compose/docker-compose-options.d.ts +9 -0
  71. package/dist/src/docker-compose/docker-compose-options.js +2 -0
  72. package/dist/src/docker-compose/functions/container-name-resolver.d.ts +1 -0
  73. package/dist/src/docker-compose/functions/container-name-resolver.js +15 -0
  74. package/dist/src/docker-compose/functions/docker-compose-down.d.ts +3 -0
  75. package/dist/src/docker-compose/functions/docker-compose-down.js +39 -0
  76. package/dist/src/docker-compose/functions/docker-compose-stop.d.ts +2 -0
  77. package/dist/src/docker-compose/functions/docker-compose-stop.js +29 -0
  78. package/dist/src/docker-compose/functions/docker-compose-up.d.ts +2 -0
  79. package/dist/src/docker-compose/functions/docker-compose-up.js +41 -0
  80. package/dist/src/docker-compose-environment/docker-compose-environment.d.ts +25 -0
  81. package/dist/src/docker-compose-environment/docker-compose-environment.js +134 -0
  82. package/dist/src/docker-compose-environment/downed-docker-compose-environment.d.ts +2 -0
  83. package/dist/src/docker-compose-environment/downed-docker-compose-environment.js +6 -0
  84. package/dist/src/docker-compose-environment/started-docker-compose-environment.d.ts +15 -0
  85. package/dist/src/docker-compose-environment/started-docker-compose-environment.js +46 -0
  86. package/dist/src/docker-compose-environment/stopped-docker-compose-environment.d.ts +8 -0
  87. package/dist/src/docker-compose-environment/stopped-docker-compose-environment.js +27 -0
  88. package/dist/src/docker-image-name.d.ts +15 -0
  89. package/dist/src/docker-image-name.js +63 -0
  90. package/dist/src/dockerfile-parser.d.ts +3 -0
  91. package/dist/src/dockerfile-parser.js +39 -0
  92. package/dist/src/generic-container/generic-container-builder.d.ts +18 -0
  93. package/dist/src/generic-container/generic-container-builder.js +98 -0
  94. package/dist/src/generic-container/generic-container.d.ts +77 -0
  95. package/dist/src/generic-container/generic-container.js +312 -0
  96. package/dist/src/generic-container/started-generic-container.d.ts +31 -0
  97. package/dist/src/generic-container/started-generic-container.js +97 -0
  98. package/dist/src/generic-container/stopped-generic-container.d.ts +3 -0
  99. package/dist/src/generic-container/stopped-generic-container.js +6 -0
  100. package/dist/src/hash.d.ts +1 -0
  101. package/dist/src/hash.js +11 -0
  102. package/dist/src/http-wait-strategy.d.ts +27 -0
  103. package/dist/src/http-wait-strategy.js +113 -0
  104. package/dist/src/images.d.ts +2 -0
  105. package/dist/src/images.js +6 -0
  106. package/dist/src/index.d.ts +21 -0
  107. package/dist/src/index.js +54 -0
  108. package/dist/src/labels.d.ts +5 -0
  109. package/dist/src/labels.js +8 -0
  110. package/dist/src/logger.d.ts +36 -0
  111. package/dist/src/logger.js +61 -0
  112. package/dist/src/modules/abstract-started-container.d.ts +21 -0
  113. package/dist/src/modules/abstract-started-container.js +59 -0
  114. package/dist/src/modules/arangodb/arangodb-container.d.ts +19 -0
  115. package/dist/src/modules/arangodb/arangodb-container.js +60 -0
  116. package/dist/src/modules/elasticsearch/elasticsearch-container.d.ts +12 -0
  117. package/dist/src/modules/elasticsearch/elasticsearch-container.js +43 -0
  118. package/dist/src/modules/kafka/kafka-container.d.ts +46 -0
  119. package/dist/src/modules/kafka/kafka-container.js +172 -0
  120. package/dist/src/modules/mongodb/mongodb-container.d.ts +19 -0
  121. package/dist/src/modules/mongodb/mongodb-container.js +85 -0
  122. package/dist/src/modules/mysql/mysql-container.d.ts +29 -0
  123. package/dist/src/modules/mysql/mysql-container.js +102 -0
  124. package/dist/src/modules/nats/nats-container.d.ts +55 -0
  125. package/dist/src/modules/nats/nats-container.js +97 -0
  126. package/dist/src/modules/neo4j/neo4j-container.d.ts +23 -0
  127. package/dist/src/modules/neo4j/neo4j-container.js +82 -0
  128. package/dist/src/modules/postgresql/postgresql-container.d.ts +28 -0
  129. package/dist/src/modules/postgresql/postgresql-container.js +87 -0
  130. package/dist/src/network.d.ts +17 -0
  131. package/dist/src/network.js +54 -0
  132. package/dist/src/port-check.d.ts +17 -0
  133. package/dist/src/port-check.js +84 -0
  134. package/dist/src/port-forwarder.d.ts +17 -0
  135. package/dist/src/port-forwarder.js +81 -0
  136. package/dist/src/port-generator.d.ts +15 -0
  137. package/dist/src/port-generator.js +51 -0
  138. package/dist/src/port.d.ts +10 -0
  139. package/dist/src/port.js +47 -0
  140. package/dist/src/pull-policy.d.ts +9 -0
  141. package/dist/src/pull-policy.js +15 -0
  142. package/dist/src/reaper.d.ts +14 -0
  143. package/dist/src/reaper.js +141 -0
  144. package/dist/src/registry-auth-locator/auths.d.ts +8 -0
  145. package/dist/src/registry-auth-locator/auths.js +56 -0
  146. package/dist/src/registry-auth-locator/cred-helpers.d.ts +6 -0
  147. package/dist/src/registry-auth-locator/cred-helpers.js +15 -0
  148. package/dist/src/registry-auth-locator/credential-provider.d.ts +10 -0
  149. package/dist/src/registry-auth-locator/credential-provider.js +83 -0
  150. package/dist/src/registry-auth-locator/creds-store.d.ts +6 -0
  151. package/dist/src/registry-auth-locator/creds-store.js +15 -0
  152. package/dist/src/registry-auth-locator/get-auth-config.d.ts +2 -0
  153. package/dist/src/registry-auth-locator/get-auth-config.js +65 -0
  154. package/dist/src/registry-auth-locator/registry-auth-locator.d.ts +6 -0
  155. package/dist/src/registry-auth-locator/registry-auth-locator.js +2 -0
  156. package/dist/src/registry-auth-locator/registry-matches.d.ts +1 -0
  157. package/dist/src/registry-auth-locator/registry-matches.js +5 -0
  158. package/dist/src/registry-auth-locator/types.d.ts +23 -0
  159. package/dist/src/registry-auth-locator/types.js +2 -0
  160. package/dist/src/retry-strategy.d.ts +17 -0
  161. package/dist/src/retry-strategy.js +46 -0
  162. package/dist/src/startup-check-strategy.d.ts +7 -0
  163. package/dist/src/startup-check-strategy.js +30 -0
  164. package/dist/src/stream-utils.d.ts +6 -0
  165. package/dist/src/stream-utils.js +46 -0
  166. package/dist/src/system-info.d.ts +17 -0
  167. package/dist/src/system-info.js +51 -0
  168. package/dist/src/test-container.d.ts +66 -0
  169. package/dist/src/test-container.js +2 -0
  170. package/dist/src/test-containers.d.ts +3 -0
  171. package/dist/src/test-containers.js +22 -0
  172. package/dist/src/type-guards.d.ts +1 -0
  173. package/dist/src/type-guards.js +7 -0
  174. package/dist/src/uuid.d.ts +6 -0
  175. package/dist/src/uuid.js +13 -0
  176. package/dist/src/wait-for-container.d.ts +4 -0
  177. package/dist/src/wait-for-container.js +34 -0
  178. package/dist/src/wait-strategy.d.ts +32 -0
  179. package/dist/src/wait-strategy.js +137 -0
  180. package/dist/src/wait.d.ts +7 -0
  181. package/dist/src/wait.js +17 -0
  182. package/package.json +1 -1
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getSystemInfo = void 0;
13
+ const logger_1 = require("./logger");
14
+ const docker_compose_1 = require("docker-compose");
15
+ const get_info_1 = require("./docker/functions/get-info");
16
+ let systemInfo;
17
+ const getSystemInfo = (dockerode) => __awaiter(void 0, void 0, void 0, function* () {
18
+ var _a;
19
+ if (systemInfo !== undefined) {
20
+ return systemInfo;
21
+ }
22
+ logger_1.log.debug("Fetching system info");
23
+ const nodeInfo = getNodeInfo();
24
+ const dockerInfo = yield (0, get_info_1.getDockerInfo)(dockerode);
25
+ const dockerComposeInfo = yield getDockerComposeInfo();
26
+ systemInfo = { nodeInfo, dockerInfo, dockerComposeInfo };
27
+ logger_1.log.debug(`System info:
28
+ System: Node version: ${nodeInfo.version}, Platform: ${nodeInfo.platform}, Arch: ${nodeInfo.architecture}
29
+ Container runtime: OS: ${dockerInfo.operatingSystem}, Version: ${dockerInfo.serverVersion}, Arch: ${dockerInfo.architecture}, CPUs: ${dockerInfo.cpus}, Memory: ${dockerInfo.memory}
30
+ Compose: Installed: ${dockerComposeInfo !== undefined}, Version: ${(_a = dockerComposeInfo === null || dockerComposeInfo === void 0 ? void 0 : dockerComposeInfo.version) !== null && _a !== void 0 ? _a : "N/A"}`);
31
+ return systemInfo;
32
+ });
33
+ exports.getSystemInfo = getSystemInfo;
34
+ const getNodeInfo = () => {
35
+ return {
36
+ version: process.version,
37
+ architecture: process.arch,
38
+ platform: process.platform,
39
+ };
40
+ };
41
+ const getDockerComposeInfo = () => __awaiter(void 0, void 0, void 0, function* () {
42
+ try {
43
+ return {
44
+ version: (yield (0, docker_compose_1.version)()).data.version,
45
+ };
46
+ }
47
+ catch (err) {
48
+ logger_1.log.info(`Unable to detect docker-compose version, is it installed? ${err}`);
49
+ return undefined;
50
+ }
51
+ });
@@ -0,0 +1,66 @@
1
+ /// <reference types="node" />
2
+ import { PortWithOptionalBinding } from "./port";
3
+ import { PullPolicy } from "./pull-policy";
4
+ import { WaitStrategy } from "./wait-strategy";
5
+ import { Readable } from "stream";
6
+ import { ExecResult, ExtraHost, TmpFs, Labels, Ulimits, BindMount, FileToCopy, ContentToCopy, Environment, ResourcesQuota } from "./docker/types";
7
+ import { StartedNetwork } from "./network";
8
+ export interface TestContainer {
9
+ start(): Promise<StartedTestContainer>;
10
+ withEnvironment(environment: Environment): this;
11
+ withCommand(command: string[]): this;
12
+ withEntrypoint(entrypoint: string[]): this;
13
+ withTmpFs(tmpFs: TmpFs): this;
14
+ withUlimits(ulimits: Ulimits): this;
15
+ withAddedCapabilities(...capabilities: string[]): this;
16
+ withDroppedCapabilities(...capabilities: string[]): this;
17
+ withExposedPorts(...ports: PortWithOptionalBinding[]): this;
18
+ withBindMounts(bindMounts: BindMount[]): this;
19
+ withWaitStrategy(waitStrategy: WaitStrategy): this;
20
+ withStartupTimeout(startupTimeoutMs: number): this;
21
+ withNetwork(network: StartedNetwork): this;
22
+ withNetworkMode(networkMode: string): this;
23
+ withExtraHosts(extraHosts: ExtraHost[]): this;
24
+ withDefaultLogDriver(): this;
25
+ withPrivilegedMode(): this;
26
+ withUser(user: string): this;
27
+ withPullPolicy(pullPolicy: PullPolicy): this;
28
+ withReuse(): this;
29
+ withCopyFilesToContainer(filesToCopy: FileToCopy[]): this;
30
+ withCopyContentToContainer(contentsToCopy: ContentToCopy[]): this;
31
+ withWorkingDir(workingDir: string): this;
32
+ withResourcesQuota(resourcesQuota: ResourcesQuota): this;
33
+ }
34
+ export interface RestartOptions {
35
+ timeout: number;
36
+ }
37
+ export interface StopOptions {
38
+ timeout: number;
39
+ removeVolumes: boolean;
40
+ }
41
+ export interface DockerComposeDownOptions {
42
+ timeout: number;
43
+ removeVolumes: boolean;
44
+ }
45
+ export interface ExecOptions {
46
+ tty: boolean;
47
+ detach: boolean;
48
+ stdin: boolean;
49
+ }
50
+ export interface StartedTestContainer {
51
+ stop(options?: Partial<StopOptions>): Promise<StoppedTestContainer>;
52
+ restart(options?: Partial<RestartOptions>): Promise<void>;
53
+ getHost(): string;
54
+ getFirstMappedPort(): number;
55
+ getMappedPort(port: number): number;
56
+ getName(): string;
57
+ getLabels(): Labels;
58
+ getId(): string;
59
+ getNetworkNames(): string[];
60
+ getNetworkId(networkName: string): string;
61
+ getIpAddress(networkName: string): string;
62
+ exec(command: string[], options?: Partial<ExecOptions>): Promise<ExecResult>;
63
+ logs(): Promise<Readable>;
64
+ }
65
+ export interface StoppedTestContainer {
66
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ export declare class TestContainers {
2
+ static exposeHostPorts(...ports: number[]): Promise<void>;
3
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TestContainers = void 0;
13
+ const port_forwarder_1 = require("./port-forwarder");
14
+ class TestContainers {
15
+ static exposeHostPorts(...ports) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const portForwarder = yield port_forwarder_1.PortForwarderInstance.getInstance();
18
+ yield Promise.all(ports.map((port) => portForwarder.exposeHostPort(port)));
19
+ });
20
+ }
21
+ }
22
+ exports.TestContainers = TestContainers;
@@ -0,0 +1 @@
1
+ export declare const isDefined: <T>(value: T | undefined) => value is T;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isDefined = void 0;
4
+ const isDefined = (value) => {
5
+ return value !== undefined;
6
+ };
7
+ exports.isDefined = isDefined;
@@ -0,0 +1,6 @@
1
+ export interface Uuid {
2
+ nextUuid(): string;
3
+ }
4
+ export declare class RandomUuid implements Uuid {
5
+ nextUuid(): string;
6
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RandomUuid = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ class RandomUuid {
9
+ nextUuid() {
10
+ return crypto_1.default.randomUUID();
11
+ }
12
+ }
13
+ exports.RandomUuid = RandomUuid;
@@ -0,0 +1,4 @@
1
+ import Dockerode from "dockerode";
2
+ import { BoundPorts } from "./bound-ports";
3
+ import { WaitStrategy } from "./wait-strategy";
4
+ export declare const waitForContainer: (container: Dockerode.Container, waitStrategy: WaitStrategy, host: string, boundPorts: BoundPorts, startTime?: Date) => Promise<void>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.waitForContainer = void 0;
13
+ const logger_1 = require("./logger");
14
+ const stop_container_1 = require("./docker/functions/container/stop-container");
15
+ const remove_container_1 = require("./docker/functions/container/remove-container");
16
+ const waitForContainer = (container, waitStrategy, host, boundPorts, startTime) => __awaiter(void 0, void 0, void 0, function* () {
17
+ logger_1.log.debug(`Waiting for container to be ready: ${container.id}`);
18
+ try {
19
+ yield waitStrategy.waitUntilReady(container, host, boundPorts, startTime);
20
+ logger_1.log.info(`Container is ready: ${container.id}`);
21
+ }
22
+ catch (err) {
23
+ logger_1.log.error(`Container failed to be ready: ${container.id}: ${err}`);
24
+ try {
25
+ yield (0, stop_container_1.stopContainer)(container, { timeout: 0 });
26
+ yield (0, remove_container_1.removeContainer)(container, { removeVolumes: true });
27
+ }
28
+ catch (stopErr) {
29
+ logger_1.log.error(`Failed to stop container after it failed to be ready: ${container.id}: ${stopErr}`);
30
+ }
31
+ throw err;
32
+ }
33
+ });
34
+ exports.waitForContainer = waitForContainer;
@@ -0,0 +1,32 @@
1
+ import { BoundPorts } from "./bound-ports";
2
+ import { PortCheck } from "./port-check";
3
+ import Dockerode from "dockerode";
4
+ export interface WaitStrategy {
5
+ waitUntilReady(container: Dockerode.Container, host: string, boundPorts: BoundPorts, startTime?: Date): Promise<void>;
6
+ withStartupTimeout(startupTimeout: number): WaitStrategy;
7
+ }
8
+ export declare abstract class AbstractWaitStrategy implements WaitStrategy {
9
+ protected startupTimeout: number;
10
+ abstract waitUntilReady(container: Dockerode.Container, host: string, boundPorts: BoundPorts, startTime?: Date): Promise<void>;
11
+ withStartupTimeout(startupTimeout: number): WaitStrategy;
12
+ }
13
+ export declare class HostPortWaitStrategy extends AbstractWaitStrategy {
14
+ private readonly hostPortCheck;
15
+ private readonly internalPortCheck;
16
+ constructor(hostPortCheck: PortCheck, internalPortCheck: PortCheck);
17
+ waitUntilReady(container: Dockerode.Container, host: string, boundPorts: BoundPorts): Promise<void>;
18
+ private waitForHostPorts;
19
+ private waitForInternalPorts;
20
+ private waitForPort;
21
+ }
22
+ export type Log = string;
23
+ export declare class LogWaitStrategy extends AbstractWaitStrategy {
24
+ private readonly message;
25
+ private readonly times;
26
+ constructor(message: Log | RegExp, times: number);
27
+ waitUntilReady(container: Dockerode.Container, host: string, boundPorts: BoundPorts, startTime?: Date): Promise<void>;
28
+ }
29
+ export declare class HealthCheckWaitStrategy extends AbstractWaitStrategy {
30
+ waitUntilReady(container: Dockerode.Container): Promise<void>;
31
+ }
32
+ export declare const defaultWaitStrategy: (host: string, container: Dockerode.Container) => HostPortWaitStrategy;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.defaultWaitStrategy = exports.HealthCheckWaitStrategy = exports.LogWaitStrategy = exports.HostPortWaitStrategy = exports.AbstractWaitStrategy = void 0;
16
+ const byline_1 = __importDefault(require("byline"));
17
+ const logger_1 = require("./logger");
18
+ const port_check_1 = require("./port-check");
19
+ const retry_strategy_1 = require("./retry-strategy");
20
+ const container_logs_1 = require("./docker/functions/container/container-logs");
21
+ const inspect_container_1 = require("./docker/functions/container/inspect-container");
22
+ class AbstractWaitStrategy {
23
+ constructor() {
24
+ this.startupTimeout = 60000;
25
+ }
26
+ withStartupTimeout(startupTimeout) {
27
+ this.startupTimeout = startupTimeout;
28
+ return this;
29
+ }
30
+ }
31
+ exports.AbstractWaitStrategy = AbstractWaitStrategy;
32
+ class HostPortWaitStrategy extends AbstractWaitStrategy {
33
+ constructor(hostPortCheck, internalPortCheck) {
34
+ super();
35
+ this.hostPortCheck = hostPortCheck;
36
+ this.internalPortCheck = internalPortCheck;
37
+ }
38
+ waitUntilReady(container, host, boundPorts) {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ yield Promise.all([this.waitForHostPorts(container, boundPorts), this.waitForInternalPorts(container, boundPorts)]);
41
+ });
42
+ }
43
+ waitForHostPorts(container, boundPorts) {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ for (const [, hostPort] of boundPorts.iterator()) {
46
+ logger_1.log.debug(`Waiting for host port ${hostPort} for ${container.id}`);
47
+ yield this.waitForPort(container, hostPort, this.hostPortCheck);
48
+ logger_1.log.debug(`Host port ${hostPort} ready for ${container.id}`);
49
+ }
50
+ });
51
+ }
52
+ waitForInternalPorts(container, boundPorts) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ for (const [internalPort] of boundPorts.iterator()) {
55
+ logger_1.log.debug(`Waiting for internal port ${internalPort} for ${container.id}`);
56
+ yield this.waitForPort(container, internalPort, this.internalPortCheck);
57
+ logger_1.log.debug(`Internal port ${internalPort} ready for ${container.id}`);
58
+ }
59
+ });
60
+ }
61
+ waitForPort(container, port, portCheck) {
62
+ return __awaiter(this, void 0, void 0, function* () {
63
+ const retryStrategy = new retry_strategy_1.IntervalRetryStrategy(100);
64
+ yield retryStrategy.retryUntil(() => portCheck.isBound(port), (isBound) => isBound, () => {
65
+ const timeout = this.startupTimeout;
66
+ throw new Error(`Port ${port} not bound after ${timeout}ms for ${container.id}`);
67
+ }, this.startupTimeout);
68
+ });
69
+ }
70
+ }
71
+ exports.HostPortWaitStrategy = HostPortWaitStrategy;
72
+ class LogWaitStrategy extends AbstractWaitStrategy {
73
+ constructor(message, times) {
74
+ super();
75
+ this.message = message;
76
+ this.times = times;
77
+ }
78
+ waitUntilReady(container, host, boundPorts, startTime) {
79
+ return __awaiter(this, void 0, void 0, function* () {
80
+ logger_1.log.debug(`Waiting for log message "${this.message}" for ${container.id}`);
81
+ const stream = yield (0, container_logs_1.containerLogs)(container, { since: startTime });
82
+ return new Promise((resolve, reject) => {
83
+ const startupTimeout = this.startupTimeout;
84
+ const timeout = setTimeout(() => {
85
+ const message = `Log message "${this.message}" not received after ${startupTimeout}ms for ${container.id}`;
86
+ logger_1.log.error(message);
87
+ reject(new Error(message));
88
+ }, startupTimeout);
89
+ const comparisonFn = (line) => {
90
+ if (this.message instanceof RegExp) {
91
+ return this.message.test(line);
92
+ }
93
+ else {
94
+ return line.includes(this.message);
95
+ }
96
+ };
97
+ let count = 0;
98
+ const lineProcessor = (line) => {
99
+ if (comparisonFn(line)) {
100
+ if (++count === this.times) {
101
+ stream.destroy();
102
+ clearTimeout(timeout);
103
+ resolve();
104
+ }
105
+ }
106
+ };
107
+ (0, byline_1.default)(stream)
108
+ .on("data", lineProcessor)
109
+ .on("err", lineProcessor)
110
+ .on("end", () => {
111
+ stream.destroy();
112
+ clearTimeout(timeout);
113
+ reject(new Error(`Log stream ended and message "${this.message}" was not received for ${container.id}`));
114
+ });
115
+ });
116
+ });
117
+ }
118
+ }
119
+ exports.LogWaitStrategy = LogWaitStrategy;
120
+ class HealthCheckWaitStrategy extends AbstractWaitStrategy {
121
+ waitUntilReady(container) {
122
+ return __awaiter(this, void 0, void 0, function* () {
123
+ logger_1.log.debug(`Waiting for health check for ${container.id}`);
124
+ const retryStrategy = new retry_strategy_1.IntervalRetryStrategy(100);
125
+ const status = yield retryStrategy.retryUntil(() => __awaiter(this, void 0, void 0, function* () { return (yield (0, inspect_container_1.inspectContainer)(container)).healthCheckStatus; }), (healthCheckStatus) => healthCheckStatus === "healthy" || healthCheckStatus === "unhealthy", () => {
126
+ const timeout = this.startupTimeout;
127
+ throw new Error(`Health check not healthy after ${timeout}ms for ${container.id}`);
128
+ }, this.startupTimeout);
129
+ if (status !== "healthy") {
130
+ throw new Error(`Health check failed: ${status} for ${container.id}`);
131
+ }
132
+ });
133
+ }
134
+ }
135
+ exports.HealthCheckWaitStrategy = HealthCheckWaitStrategy;
136
+ const defaultWaitStrategy = (host, container) => new HostPortWaitStrategy(new port_check_1.HostPortCheck(host), new port_check_1.InternalPortCheck(container));
137
+ exports.defaultWaitStrategy = defaultWaitStrategy;
@@ -0,0 +1,7 @@
1
+ import { Log, WaitStrategy } from "./wait-strategy";
2
+ import { HttpWaitStrategy } from "./http-wait-strategy";
3
+ export declare class Wait {
4
+ static forLogMessage(message: Log | RegExp, times?: number): WaitStrategy;
5
+ static forHealthCheck(): WaitStrategy;
6
+ static forHttp(path: string, port: number): HttpWaitStrategy;
7
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Wait = void 0;
4
+ const wait_strategy_1 = require("./wait-strategy");
5
+ const http_wait_strategy_1 = require("./http-wait-strategy");
6
+ class Wait {
7
+ static forLogMessage(message, times = 1) {
8
+ return new wait_strategy_1.LogWaitStrategy(message, times);
9
+ }
10
+ static forHealthCheck() {
11
+ return new wait_strategy_1.HealthCheckWaitStrategy();
12
+ }
13
+ static forHttp(path, port) {
14
+ return new http_wait_strategy_1.HttpWaitStrategy(path, port);
15
+ }
16
+ }
17
+ exports.Wait = Wait;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "testcontainers",
3
3
  "author": "Cristian Greco",
4
- "version": "9.2.0",
4
+ "version": "9.3.0",
5
5
  "main": "dist/src/index",
6
6
  "types": "dist/src/index",
7
7
  "keywords": [