-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrun.ts
73 lines (67 loc) · 1.84 KB
/
run.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*!
* Copyright © 2023 United States Government as represented by the
* Administrator of the National Aeronautics and Space Administration.
* All Rights Reserved.
*
* SPDX-License-Identifier: Apache-2.0
*/
import waitPort from 'wait-port'
import { UnexpectedResolveError } from './promises.js'
import { launchDocker, removeContainer } from './runDocker.js'
import { execSync } from 'node:child_process'
import {
DynamoDB,
DynamoDBClient,
ListTablesCommand,
} from '@aws-sdk/client-dynamodb'
export type LauncherFunction<T = object> = (
props: T & {
options: string[]
port: number
}
) => Promise<{
kill: () => Promise<string>
waitUntilStopped: () => Promise<void>
}>
export async function launch() {
const port = 8000
const url = `http://localhost:${port}`
const options = [`http.port=${port}`, 'discovery.type=single-node']
const props = {
options,
port,
}
console.log('Launching Docker...')
const { kill, waitUntilStopped } = await launchDocker(props)
console.log('Launched: ')
try {
await waitPort({ port })
let dynamodbReady = false
const ddbClient = new DynamoDBClient({ endpoint: url })
while (!dynamodbReady) {
try {
const ddbPing = await ddbClient.send(new ListTablesCommand({}))
if (ddbPing.TableNames) dynamodbReady = true
} catch (e) {
console.log('table connection not ready, trying again')
}
}
} catch (e) {
if (e instanceof UnexpectedResolveError) {
throw new Error('Local DynamoDB instance terminated unexpectedly')
} else {
throw e
}
}
return {
url,
port,
async stop() {
const containerId = await kill()
await waitUntilStopped()
console.log('Removing container: ', containerId)
await removeContainer(containerId)
console.log('Removing temporary directory')
},
}
}