mirror of
https://github.com/morten-olsen/mini-loader.git
synced 2026-02-08 01:36:26 +01:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e7461c10b |
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"image": "mcr.microsoft.com/devcontainers/universal:2",
|
|
||||||
"features": {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
60
.github/workflows/release.yml
vendored
60
.github/workflows/release.yml
vendored
@@ -91,33 +91,33 @@ jobs:
|
|||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
|
||||||
release-npm:
|
# release-npm:
|
||||||
if: github.ref == 'refs/heads/main'
|
# if: github.ref == 'refs/heads/main'
|
||||||
runs-on: ubuntu-latest
|
# runs-on: ubuntu-latest
|
||||||
needs: [build, update-release-draft]
|
# needs: [build, update-release-draft]
|
||||||
permissions:
|
# permissions:
|
||||||
contents: read
|
# contents: read
|
||||||
packages: write
|
# packages: write
|
||||||
steps:
|
# steps:
|
||||||
- uses: actions/checkout@v3
|
# - uses: actions/checkout@v3
|
||||||
with:
|
# with:
|
||||||
fetch-depth: 0
|
# fetch-depth: 0
|
||||||
- run: corepack enable
|
# - run: corepack enable
|
||||||
- uses: actions/setup-node@v3
|
# - uses: actions/setup-node@v3
|
||||||
with:
|
# with:
|
||||||
cache: '${{ env.NODE_CACHE }}'
|
# cache: '${{ env.NODE_CACHE }}'
|
||||||
node-version: '${{ env.NODE_VERSION }}'
|
# node-version: '${{ env.NODE_VERSION }}'
|
||||||
scope: '${{ env.NODE_SCOPE }}'
|
# scope: '${{ env.NODE_SCOPE }}'
|
||||||
- uses: actions/download-artifact@v3
|
# - uses: actions/download-artifact@v3
|
||||||
with:
|
# with:
|
||||||
name: lib
|
# name: lib
|
||||||
path: ./
|
# path: ./
|
||||||
- run: |
|
# - run: |
|
||||||
pnpm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}
|
# pnpm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}
|
||||||
pnpm install
|
# pnpm install
|
||||||
git config user.name "Github Actions Bot"
|
# git config user.name "Github Actions Bot"
|
||||||
git config user.email "<>"
|
# git config user.email "<>"
|
||||||
node scripts/set-version.mjs $(git describe --tag --abbrev=0)
|
# node scripts/set-version.ts $(git describe --tag --abbrev=0)
|
||||||
pnpm publish -r --publish-branch main --access public --no-git-checks
|
# pnpm publish -r --publish-branch main --access public --no-git-checks
|
||||||
env:
|
# env:
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
# NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
|
|
||||||
|
|
||||||

|
<p>
|
||||||
|
<center>
|
||||||
|
<img src="./assets/logo.png" width="300" height="300" />
|
||||||
|
</center>
|
||||||
|
</p>
|
||||||
|
|
||||||
# Welcome to Mini Loader! 🌐
|
# Welcome to Mini Loader! 🌐
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 418 KiB |
@@ -15,19 +15,14 @@ npm install -g @morten-olsen/mini-loader-cli
|
|||||||
Now, let's write a basic script that outputs a single artifact named “hello”. Create a new file with the following JavaScript code:
|
Now, let's write a basic script that outputs a single artifact named “hello”. Create a new file with the following JavaScript code:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
import { artifacts } from '@morten-olsen/mini-loader';
|
import { artifacts } from "@morten-olsen/mini-loader";
|
||||||
|
|
||||||
const run = async () => {
|
artifacts.create('hello', 'world');
|
||||||
artifacts.create('hello', 'world');
|
|
||||||
};
|
|
||||||
|
|
||||||
run();
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Save this file as `script.js`.
|
Save this file as `script.mjs`.
|
||||||
|
|
||||||
#### A Note on Dependencies
|
#### A Note on Dependencies
|
||||||
|
|
||||||
In this script, we're using the `@morten-olsen/mini-loader` package, which might not be installed in your local environment. No worries though, as mini loader can automatically download necessary packages when preparing the script. Alternatively, for a more structured approach (especially if you're using TypeScript), you can initialize a Node.js project and install the dependencies for complete access to typings.
|
In this script, we're using the `@morten-olsen/mini-loader` package, which might not be installed in your local environment. No worries though, as mini loader can automatically download necessary packages when preparing the script. Alternatively, for a more structured approach (especially if you're using TypeScript), you can initialize a Node.js project and install the dependencies for complete access to typings.
|
||||||
|
|
||||||
### Step 3: Run the Script Locally
|
### Step 3: Run the Script Locally
|
||||||
@@ -35,7 +30,7 @@ In this script, we're using the `@morten-olsen/mini-loader` package, which might
|
|||||||
To validate that your script is functioning correctly, execute it locally using the following command:
|
To validate that your script is functioning correctly, execute it locally using the following command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mini-loader local run script.js -ai
|
mini-loader local run script.mjs -ai
|
||||||
```
|
```
|
||||||
|
|
||||||
The `-ai` flag instructs the CLI to automatically download any referenced packages when bundling the script.
|
The `-ai` flag instructs the CLI to automatically download any referenced packages when bundling the script.
|
||||||
@@ -46,4 +41,4 @@ After running the command, you should see an output confirming that a new artifa
|
|||||||
|
|
||||||
Congratulations on setting up and running your first script with mini loader! You're now ready to take the next step.
|
Congratulations on setting up and running your first script with mini loader! You're now ready to take the next step.
|
||||||
|
|
||||||
[Next: Setting Up the Server](./setup-server.md)
|
[Next: Setting Up the Server](./setup-server.md)
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@morten-olsen/mini-loader-repo",
|
"name": "@morten-olsen/mini-loader-repo",
|
||||||
"private": "true",
|
"private": "true",
|
||||||
"license": "GPL-3.0",
|
|
||||||
"packageManager": "pnpm@8.10.4",
|
"packageManager": "pnpm@8.10.4",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -12,6 +11,7 @@
|
|||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@react-native-community/eslint-config": "^3.2.0",
|
"@react-native-community/eslint-config": "^3.2.0",
|
||||||
"eslint": "^8.53.0",
|
"eslint": "^8.53.0",
|
||||||
@@ -23,10 +23,5 @@
|
|||||||
"@pnpm/find-workspace-packages": "^6.0.9",
|
"@pnpm/find-workspace-packages": "^6.0.9",
|
||||||
"@types/node": "^20.10.8",
|
"@types/node": "^20.10.8",
|
||||||
"ts-node": "^10.9.2"
|
"ts-node": "^10.9.2"
|
||||||
},
|
|
||||||
"homepage": "https://github.com/morten-olsen/mini-loader",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/morten-olsen/mini-loader"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1 +0,0 @@
|
|||||||
[Go to documentation](https://github.com/morten-olsen/mini-loader)
|
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"main": "./dist/esm/index.js",
|
"main": "./dist/esm/index.js",
|
||||||
"types": "./dist/esm/index.d.ts",
|
"types": "./dist/esm/index.d.ts",
|
||||||
"license": "GPL-3.0",
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"mini-loader": "./bin/index.mjs"
|
"mini-loader": "./bin/index.mjs"
|
||||||
},
|
},
|
||||||
@@ -42,10 +41,5 @@
|
|||||||
"@morten-olsen/mini-loader-server": "workspace:^",
|
"@morten-olsen/mini-loader-server": "workspace:^",
|
||||||
"@types/inquirer": "^9.0.7",
|
"@types/inquirer": "^9.0.7",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
},
|
|
||||||
"homepage": "https://github.com/morten-olsen/mini-loader",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/morten-olsen/mini-loader"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,12 +17,12 @@ const bundle = async ({ entry, autoInstall }: BundleOptions) => {
|
|||||||
const entryFile = resolve(entry);
|
const entryFile = resolve(entry);
|
||||||
const codeBundler = await rollup({
|
const codeBundler = await rollup({
|
||||||
plugins: [
|
plugins: [
|
||||||
fix(json)(),
|
|
||||||
fix(sucrase)({
|
fix(sucrase)({
|
||||||
transforms: ['typescript', 'jsx'],
|
transforms: ['typescript', 'jsx'],
|
||||||
}),
|
}),
|
||||||
...[autoInstall ? fix(auto) : []],
|
...[autoInstall ? fix(auto) : []],
|
||||||
nodeResolve({ preferBuiltins: true, extensions: ['.js', '.jsx', '.ts', '.tsx'] }),
|
nodeResolve({ extensions: ['.js', '.jsx', '.ts', '.tsx'] }),
|
||||||
|
fix(json)(),
|
||||||
fix(commonjs)({ include: /node_modules/ }),
|
fix(commonjs)({ include: /node_modules/ }),
|
||||||
],
|
],
|
||||||
input: entryFile,
|
input: entryFile,
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const list = new Command('list');
|
const list = new Command('list');
|
||||||
|
|
||||||
@@ -22,8 +21,7 @@ list
|
|||||||
.option('-a, --limit <limit>', 'Limit', '1000')
|
.option('-a, --limit <limit>', 'Limit', '1000')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const { runId, loadId, offset, limit } = list.opts();
|
const { runId, loadId, offset, limit } = list.opts();
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { step } from '../../utils/step.js';
|
|||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { dirname, resolve } from 'path';
|
import { dirname, resolve } from 'path';
|
||||||
import { mkdir, writeFile } from 'fs/promises';
|
import { mkdir, writeFile } from 'fs/promises';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const pull = new Command('pull');
|
const pull = new Command('pull');
|
||||||
|
|
||||||
@@ -13,8 +12,7 @@ pull
|
|||||||
.argument('<artifact-id>', 'Artifact ID')
|
.argument('<artifact-id>', 'Artifact ID')
|
||||||
.argument('<file>', 'File to save')
|
.argument('<file>', 'File to save')
|
||||||
.action(async (id, file) => {
|
.action(async (id, file) => {
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const target = resolve(file);
|
const target = resolve(file);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { createClient } from '../../client/client.js';
|
|||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import inquirer from 'inquirer';
|
import inquirer from 'inquirer';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const remove = new Command('remove');
|
const remove = new Command('remove');
|
||||||
|
|
||||||
@@ -23,8 +22,7 @@ remove
|
|||||||
.option('-a, --limit <limit>', 'Limit', '1000')
|
.option('-a, --limit <limit>', 'Limit', '1000')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const { runId, loadId, offset, limit } = remove.opts();
|
const { runId, loadId, offset, limit } = remove.opts();
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,14 +2,12 @@ import { Command } from 'commander';
|
|||||||
import inquerer from 'inquirer';
|
import inquerer from 'inquirer';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const login = new Command('login');
|
const login = new Command('login');
|
||||||
|
|
||||||
login.description('Login to your account');
|
login.description('Login to your account');
|
||||||
login.action(async () => {
|
login.action(async () => {
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const { host, token } = await inquerer.prompt([
|
const { host, token } = await inquerer.prompt([
|
||||||
{
|
{
|
||||||
type: 'input',
|
type: 'input',
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
import { Command } from 'commander';
|
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const current = new Command('current');
|
|
||||||
current.action(async () => {
|
|
||||||
const config = new Config();
|
|
||||||
console.log(config.context);
|
|
||||||
});
|
|
||||||
|
|
||||||
export { current };
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import { Command } from 'commander';
|
|
||||||
import { Context } from '../../context/context.js';
|
|
||||||
|
|
||||||
const list = new Command('list');
|
|
||||||
list.alias('ls').description('List contexts');
|
|
||||||
list.action(async () => {
|
|
||||||
const contexts = await Context.list();
|
|
||||||
console.table(contexts);
|
|
||||||
});
|
|
||||||
|
|
||||||
export { list };
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import { Command } from 'commander';
|
|
||||||
import { list } from './contexts.list.js';
|
|
||||||
import { use } from './contexts.use.js';
|
|
||||||
import { current } from './contexts.current.js';
|
|
||||||
|
|
||||||
const contexts = new Command('contexts');
|
|
||||||
contexts.description('Manage contexts');
|
|
||||||
contexts.addCommand(list);
|
|
||||||
contexts.addCommand(use);
|
|
||||||
contexts.addCommand(current);
|
|
||||||
|
|
||||||
export { contexts };
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import { Command } from 'commander';
|
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const use = new Command('use');
|
|
||||||
|
|
||||||
use.argument('<name>').action(async (name) => {
|
|
||||||
const config = new Config();
|
|
||||||
await config.setContext(name);
|
|
||||||
});
|
|
||||||
|
|
||||||
export { use };
|
|
||||||
@@ -2,7 +2,6 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const list = new Command('list');
|
const list = new Command('list');
|
||||||
|
|
||||||
@@ -10,8 +9,7 @@ list
|
|||||||
.alias('ls')
|
.alias('ls')
|
||||||
.description('List loads')
|
.description('List loads')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { createClient } from '../../client/client.js';
|
|||||||
import { bundle } from '../../bundler/bundler.js';
|
import { bundle } from '../../bundler/bundler.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const push = new Command('push');
|
const push = new Command('push');
|
||||||
|
|
||||||
@@ -16,8 +15,7 @@ push
|
|||||||
.option('-ai, --auto-install', 'Auto install dependencies', false)
|
.option('-ai, --auto-install', 'Auto install dependencies', false)
|
||||||
.action(async (script) => {
|
.action(async (script) => {
|
||||||
const opts = push.opts();
|
const opts = push.opts();
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const location = resolve(script);
|
const location = resolve(script);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
@@ -25,7 +23,7 @@ push
|
|||||||
const code = await step('Bundling', async () => {
|
const code = await step('Bundling', async () => {
|
||||||
return await bundle({ entry: location, autoInstall: opts.autoInstall });
|
return await bundle({ entry: location, autoInstall: opts.autoInstall });
|
||||||
});
|
});
|
||||||
const id = await step(`Creating load ${(code.length / 1024).toFixed(0)}`, async () => {
|
const id = await step('Creating load', async () => {
|
||||||
return await client.loads.set.mutate({
|
return await client.loads.set.mutate({
|
||||||
id: opts.id,
|
id: opts.id,
|
||||||
name: opts.name,
|
name: opts.name,
|
||||||
@@ -34,10 +32,9 @@ push
|
|||||||
});
|
});
|
||||||
console.log('created load with id', id);
|
console.log('created load with id', id);
|
||||||
if (opts.run) {
|
if (opts.run) {
|
||||||
const runId = await step('Creating run', async () => {
|
await step('Creating run', async () => {
|
||||||
return await client.runs.create.mutate({ loadId: id });
|
await client.runs.create.mutate({ loadId: id });
|
||||||
});
|
});
|
||||||
console.log('created run with id', runId);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const list = new Command('list');
|
const list = new Command('list');
|
||||||
|
|
||||||
@@ -24,8 +23,7 @@ list
|
|||||||
.option('-s, --sort <order>', 'Sort', 'desc')
|
.option('-s, --sort <order>', 'Sort', 'desc')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const { runId, loadId, severities, offset, limit, order } = list.opts();
|
const { runId, loadId, severities, offset, limit, order } = list.opts();
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
@@ -39,7 +37,7 @@ list
|
|||||||
order,
|
order,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
console.table(logs);
|
console.table(logs.reverse());
|
||||||
});
|
});
|
||||||
|
|
||||||
export { list };
|
export { list };
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { createClient } from '../../client/client.js';
|
|||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import inquirer from 'inquirer';
|
import inquirer from 'inquirer';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const remove = new Command('remove');
|
const remove = new Command('remove');
|
||||||
|
|
||||||
@@ -25,8 +24,7 @@ remove
|
|||||||
.option('-s, --sort <order>', 'Sort', 'desc')
|
.option('-s, --sort <order>', 'Sort', 'desc')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const { runId, loadId, severities, offset, limit, order } = remove.opts();
|
const { runId, loadId, severities, offset, limit, order } = remove.opts();
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const create = new Command('create');
|
const create = new Command('create');
|
||||||
|
|
||||||
@@ -10,8 +9,7 @@ create
|
|||||||
.description('Create a new run')
|
.description('Create a new run')
|
||||||
.argument('load-id', 'Load ID')
|
.argument('load-id', 'Load ID')
|
||||||
.action(async (loadId) => {
|
.action(async (loadId) => {
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const list = new Command('list');
|
const list = new Command('list');
|
||||||
|
|
||||||
@@ -11,8 +10,7 @@ list
|
|||||||
.description('Find a run')
|
.description('Find a run')
|
||||||
.argument('[load-id]', 'Load ID')
|
.argument('[load-id]', 'Load ID')
|
||||||
.action(async (loadId) => {
|
.action(async (loadId) => {
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
import { Command } from 'commander';
|
|
||||||
import { createClient } from '../../client/client.js';
|
|
||||||
import { step } from '../../utils/step.js';
|
|
||||||
import { Context } from '../../context/context.js';
|
|
||||||
import inquirer from 'inquirer';
|
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const remove = new Command('remove');
|
|
||||||
|
|
||||||
const toInt = (value?: string) => {
|
|
||||||
if (!value) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
return parseInt(value, 10);
|
|
||||||
};
|
|
||||||
|
|
||||||
remove
|
|
||||||
.alias('ls')
|
|
||||||
.description('List logs')
|
|
||||||
.option('-l, --load-id <loadId>', 'Load ID')
|
|
||||||
.option('-o, --offset <offset>', 'Offset')
|
|
||||||
.option('-a, --limit <limit>', 'Limit', '1000')
|
|
||||||
.action(async () => {
|
|
||||||
const { loadId, offset, limit } = remove.opts();
|
|
||||||
const config = new Config();
|
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
|
||||||
return createClient(context);
|
|
||||||
});
|
|
||||||
const response = await step('Preparing to delete', async () => {
|
|
||||||
return await client.runs.prepareRemove.query({
|
|
||||||
loadId,
|
|
||||||
offset: toInt(offset),
|
|
||||||
limit: toInt(limit),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!response.ids.length) {
|
|
||||||
console.log('No logs to delete');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const { confirm } = await inquirer.prompt([
|
|
||||||
{
|
|
||||||
type: 'confirm',
|
|
||||||
name: 'confirm',
|
|
||||||
message: `Are you sure you want to delete ${response.ids.length} logs?`,
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (!confirm) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await step('Deleting artifacts', async () => {
|
|
||||||
await client.runs.remove.mutate(response);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
export { remove };
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
import { Command } from 'commander';
|
|
||||||
import { createClient } from '../../client/client.js';
|
|
||||||
import { step } from '../../utils/step.js';
|
|
||||||
import { Context } from '../../context/context.js';
|
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const terminate = new Command('terminate');
|
|
||||||
|
|
||||||
terminate
|
|
||||||
.description('Terminate an in progress run')
|
|
||||||
.argument('run-id', 'Run ID')
|
|
||||||
.action(async (runId) => {
|
|
||||||
const config = new Config();
|
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
|
||||||
return createClient(context);
|
|
||||||
});
|
|
||||||
await step('Terminating run', async () => {
|
|
||||||
await client.runs.terminate.mutate(runId);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
export { terminate };
|
|
||||||
@@ -1,14 +1,8 @@
|
|||||||
import { Command } from 'commander';
|
import { Command } from 'commander';
|
||||||
import { create } from './runs.create.js';
|
import { create } from './runs.create.js';
|
||||||
import { list } from './runs.list.js';
|
import { list } from './runs.list.js';
|
||||||
import { remove } from './runs.remove.js';
|
|
||||||
import { terminate } from './runs.terminate.js';
|
|
||||||
|
|
||||||
const runs = new Command('runs');
|
const runs = new Command('runs');
|
||||||
runs.description('Manage runs');
|
runs.description('Manage runs').addCommand(create).addCommand(list);
|
||||||
runs.addCommand(create);
|
|
||||||
runs.addCommand(list);
|
|
||||||
runs.addCommand(remove);
|
|
||||||
runs.addCommand(terminate);
|
|
||||||
|
|
||||||
export { runs };
|
export { runs };
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const list = new Command('list');
|
const list = new Command('list');
|
||||||
|
|
||||||
@@ -20,8 +19,7 @@ list
|
|||||||
.option('-a, --limit <limit>', 'Limit', '1000')
|
.option('-a, --limit <limit>', 'Limit', '1000')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const { offset, limit } = list.opts();
|
const { offset, limit } = list.opts();
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const remove = new Command('remove');
|
const remove = new Command('remove');
|
||||||
|
|
||||||
@@ -10,8 +9,7 @@ remove
|
|||||||
.alias('rm')
|
.alias('rm')
|
||||||
.argument('<id>')
|
.argument('<id>')
|
||||||
.action(async (id) => {
|
.action(async (id) => {
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { Config } from '../../config/config.js';
|
|
||||||
|
|
||||||
const set = new Command('set');
|
const set = new Command('set');
|
||||||
|
|
||||||
@@ -10,8 +9,7 @@ set
|
|||||||
.argument('<id>')
|
.argument('<id>')
|
||||||
.argument('[value]')
|
.argument('[value]')
|
||||||
.action(async (id, value) => {
|
.action(async (id, value) => {
|
||||||
const config = new Config();
|
const context = new Context();
|
||||||
const context = new Context(config.context);
|
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
import envPaths from 'env-paths';
|
|
||||||
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
||||||
import { mkdir } from 'fs/promises';
|
|
||||||
import { join, dirname } from 'path';
|
|
||||||
|
|
||||||
type ConfigValues = {
|
|
||||||
context?: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Config {
|
|
||||||
#location: string;
|
|
||||||
#config?: ConfigValues;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
const paths = envPaths('mini-loader');
|
|
||||||
this.#location = join(paths.config, 'config.json');
|
|
||||||
if (existsSync(this.#location)) {
|
|
||||||
this.#config = JSON.parse(readFileSync(this.#location, 'utf-8'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public get context() {
|
|
||||||
return this.#config?.context || 'default';
|
|
||||||
}
|
|
||||||
|
|
||||||
public setContext = (context: string) => {
|
|
||||||
this.#config = {
|
|
||||||
...(this.#config || {}),
|
|
||||||
context,
|
|
||||||
};
|
|
||||||
this.save();
|
|
||||||
};
|
|
||||||
|
|
||||||
public save = async () => {
|
|
||||||
if (!this.#config) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const json = JSON.stringify(this.#config);
|
|
||||||
mkdir(dirname(this.#location), { recursive: true });
|
|
||||||
writeFileSync(this.#location, json);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export { Config };
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import envPaths from 'env-paths';
|
import envPaths from 'env-paths';
|
||||||
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
||||||
import { mkdir, readdir } from 'fs/promises';
|
import { mkdir } from 'fs/promises';
|
||||||
import { dirname, join } from 'path';
|
import { dirname } from 'path';
|
||||||
|
|
||||||
type ContextValues = {
|
type ContextValues = {
|
||||||
host: string;
|
host: string;
|
||||||
@@ -12,9 +12,9 @@ class Context {
|
|||||||
#location: string;
|
#location: string;
|
||||||
#config?: ContextValues;
|
#config?: ContextValues;
|
||||||
|
|
||||||
constructor(name: string) {
|
constructor() {
|
||||||
const paths = envPaths('mini-loader');
|
const paths = envPaths('dws');
|
||||||
this.#location = join(paths.config, 'contexts', name);
|
this.#location = paths.config;
|
||||||
if (existsSync(this.#location)) {
|
if (existsSync(this.#location)) {
|
||||||
this.#config = JSON.parse(readFileSync(this.#location, 'utf-8'));
|
this.#config = JSON.parse(readFileSync(this.#location, 'utf-8'));
|
||||||
}
|
}
|
||||||
@@ -45,15 +45,6 @@ class Context {
|
|||||||
mkdir(dirname(this.#location), { recursive: true });
|
mkdir(dirname(this.#location), { recursive: true });
|
||||||
writeFileSync(this.#location, json);
|
writeFileSync(this.#location, json);
|
||||||
};
|
};
|
||||||
|
|
||||||
public static list = async () => {
|
|
||||||
const paths = envPaths('mini-loader');
|
|
||||||
const location = join(paths.config, 'contexts');
|
|
||||||
if (!existsSync(location)) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
return await readdir(location);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Context };
|
export { Context };
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import { artifacts } from './commands/artifacts/artifacts.js';
|
|||||||
import { secrets } from './commands/secrets/secrets.js';
|
import { secrets } from './commands/secrets/secrets.js';
|
||||||
import { local } from './commands/local/local.js';
|
import { local } from './commands/local/local.js';
|
||||||
import { auth } from './commands/auth/auth.js';
|
import { auth } from './commands/auth/auth.js';
|
||||||
import { contexts } from './commands/contexts/contexts.js';
|
|
||||||
|
|
||||||
program.addCommand(loads);
|
program.addCommand(loads);
|
||||||
program.addCommand(runs);
|
program.addCommand(runs);
|
||||||
@@ -15,6 +14,5 @@ program.addCommand(artifacts);
|
|||||||
program.addCommand(secrets);
|
program.addCommand(secrets);
|
||||||
program.addCommand(local);
|
program.addCommand(local);
|
||||||
program.addCommand(auth);
|
program.addCommand(auth);
|
||||||
program.addCommand(contexts);
|
|
||||||
|
|
||||||
await program.parseAsync();
|
await program.parseAsync();
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@morten-olsen/mini-loader-configs",
|
"name": "@morten-olsen/mini-loader-configs",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"private": true,
|
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -9,10 +8,5 @@
|
|||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "GPL-3.0",
|
"license": "ISC"
|
||||||
"homepage": "https://github.com/morten-olsen/mini-loader",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/morten-olsen/mini-loader"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@morten-olsen/mini-loader-examples",
|
"name": "@morten-olsen/mini-loader-examples",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"license": "GPL-3.0",
|
|
||||||
"private": true,
|
|
||||||
"main": "./dist/esm/index.js",
|
"main": "./dist/esm/index.js",
|
||||||
"types": "./dist/esm/index.d.ts",
|
"types": "./dist/esm/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -18,18 +16,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@morten-olsen/mini-loader": "workspace:^",
|
|
||||||
"@morten-olsen/mini-loader-cli": "workspace:^",
|
|
||||||
"@morten-olsen/mini-loader-configs": "workspace:^",
|
"@morten-olsen/mini-loader-configs": "workspace:^",
|
||||||
|
"@morten-olsen/mini-loader-cli": "workspace:^",
|
||||||
|
"@morten-olsen/mini-loader": "workspace:^",
|
||||||
"@types/node": "^20.10.8",
|
"@types/node": "^20.10.8",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
},
|
|
||||||
"homepage": "https://github.com/morten-olsen/mini-loader",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/morten-olsen/mini-loader"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"fastify": "^4.25.2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import { http } from '@morten-olsen/mini-loader';
|
|
||||||
import fastify from 'fastify';
|
|
||||||
|
|
||||||
const server = fastify();
|
|
||||||
|
|
||||||
server.all('*', async (req) => {
|
|
||||||
return req.url;
|
|
||||||
});
|
|
||||||
|
|
||||||
server.listen({
|
|
||||||
path: http.getPath(),
|
|
||||||
});
|
|
||||||
@@ -1,9 +1,5 @@
|
|||||||
import { artifacts, logger } from '@morten-olsen/mini-loader';
|
import { artifacts, logger } from '@morten-olsen/mini-loader';
|
||||||
|
|
||||||
const run = async () => {
|
await logger.info('Hello world');
|
||||||
await logger.info('Hello world');
|
|
||||||
await artifacts.create('foo', 'bar');
|
|
||||||
process.exit(0);
|
|
||||||
};
|
|
||||||
|
|
||||||
run();
|
await artifacts.create('foo', 'bar');
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
[Go to documentation](https://github.com/morten-olsen/mini-loader)
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@morten-olsen/mini-loader",
|
"name": "@morten-olsen/mini-loader",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"license": "GPL-3.0",
|
|
||||||
"main": "./dist/esm/index.js",
|
"main": "./dist/esm/index.js",
|
||||||
"types": "./dist/esm/index.d.ts",
|
"types": "./dist/esm/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -20,10 +19,5 @@
|
|||||||
"@morten-olsen/mini-loader-configs": "workspace:^",
|
"@morten-olsen/mini-loader-configs": "workspace:^",
|
||||||
"@types/node": "^20.10.8",
|
"@types/node": "^20.10.8",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
},
|
|
||||||
"homepage": "https://github.com/morten-olsen/mini-loader",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/morten-olsen/mini-loader"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
const getPath = () => process.env.HTTP_GATEWAY_PATH!;
|
|
||||||
|
|
||||||
const http = {
|
|
||||||
getPath,
|
|
||||||
};
|
|
||||||
|
|
||||||
export { http };
|
|
||||||
@@ -8,4 +8,3 @@ export { logger } from './logger/logger.js';
|
|||||||
export { artifacts } from './artifacts/artifacts.js';
|
export { artifacts } from './artifacts/artifacts.js';
|
||||||
export { input } from './input/input.js';
|
export { input } from './input/input.js';
|
||||||
export { secrets } from './secrets/secrets.js';
|
export { secrets } from './secrets/secrets.js';
|
||||||
export { http } from './http/http.js';
|
|
||||||
|
|||||||
@@ -12,9 +12,11 @@ const connect = () =>
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const connectionRequest = connect();
|
||||||
|
|
||||||
const send = async (data: any) =>
|
const send = async (data: any) =>
|
||||||
new Promise<void>(async (resolve, reject) => {
|
new Promise<void>(async (resolve, reject) => {
|
||||||
const connection = await connect();
|
const connection = await connectionRequest;
|
||||||
const cleaned = JSON.parse(JSON.stringify(data));
|
const cleaned = JSON.parse(JSON.stringify(data));
|
||||||
connection.write(JSON.stringify(cleaned), 'utf-8', (err) => {
|
connection.write(JSON.stringify(cleaned), 'utf-8', (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
[Go to documentation](https://github.com/morten-olsen/mini-loader)
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@morten-olsen/mini-loader-runner",
|
"name": "@morten-olsen/mini-loader-runner",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"license": "GPL-3.0",
|
|
||||||
"main": "./dist/esm/index.js",
|
"main": "./dist/esm/index.js",
|
||||||
"types": "./dist/esm/index.d.ts",
|
"types": "./dist/esm/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -17,18 +16,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@morten-olsen/mini-loader": "workspace:^",
|
||||||
"@morten-olsen/mini-loader-configs": "workspace:^",
|
"@morten-olsen/mini-loader-configs": "workspace:^",
|
||||||
"@types/node": "^20.10.8",
|
"@types/node": "^20.10.8",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@morten-olsen/mini-loader": "workspace:^",
|
|
||||||
"eventemitter3": "^5.0.1",
|
"eventemitter3": "^5.0.1",
|
||||||
"nanoid": "^5.0.4"
|
"nanoid": "^5.0.4"
|
||||||
},
|
|
||||||
"homepage": "https://github.com/morten-olsen/mini-loader",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/morten-olsen/mini-loader"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,17 @@
|
|||||||
import { Worker } from 'worker_threads';
|
import { Worker } from 'worker_threads';
|
||||||
import { setup } from './setup/setup.js';
|
import os from 'os';
|
||||||
|
import { EventEmitter } from 'eventemitter3';
|
||||||
|
import { Event } from '@morten-olsen/mini-loader';
|
||||||
|
import { join } from 'path';
|
||||||
|
import { createServer } from 'http';
|
||||||
|
import { nanoid } from 'nanoid';
|
||||||
|
import { chmod, mkdir, unlink, writeFile } from 'fs/promises';
|
||||||
|
|
||||||
|
type RunEvents = {
|
||||||
|
message: (event: Event) => void;
|
||||||
|
error: (error: Error) => void;
|
||||||
|
exit: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
type RunOptions = {
|
type RunOptions = {
|
||||||
script: string;
|
script: string;
|
||||||
@@ -8,55 +20,58 @@ type RunOptions = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const run = async ({ script, input, secrets }: RunOptions) => {
|
const run = async ({ script, input, secrets }: RunOptions) => {
|
||||||
const info = await setup({ script, input, secrets });
|
const dataDir = join(os.tmpdir(), 'mini-loader', nanoid());
|
||||||
|
await mkdir(dataDir, { recursive: true });
|
||||||
|
await chmod(dataDir, 0o700);
|
||||||
|
const hostSocket = join(dataDir, 'host');
|
||||||
|
const server = createServer();
|
||||||
|
const inputLocation = join(dataDir, 'input');
|
||||||
|
|
||||||
const worker = new Worker(info.scriptLocation, {
|
if (input) {
|
||||||
stdin: false,
|
await writeFile(inputLocation, input);
|
||||||
stdout: false,
|
}
|
||||||
stderr: false,
|
|
||||||
env: info.env,
|
|
||||||
});
|
|
||||||
|
|
||||||
worker.stdout?.on('data', (data) => {
|
const emitter = new EventEmitter<RunEvents>();
|
||||||
info.emitter.emit('message', {
|
|
||||||
type: 'log',
|
server.on('connection', (socket) => {
|
||||||
payload: {
|
socket.on('data', (data) => {
|
||||||
severity: 'info',
|
const message = JSON.parse(data.toString());
|
||||||
message: data.toString(),
|
emitter.emit('message', message);
|
||||||
},
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
worker.stderr?.on('data', (data) => {
|
const worker = new Worker(script, {
|
||||||
info.emitter.emit('message', {
|
eval: true,
|
||||||
type: 'log',
|
env: {
|
||||||
payload: {
|
HOST_SOCKET: hostSocket,
|
||||||
severity: 'error',
|
SECRETS: JSON.stringify(secrets),
|
||||||
message: data.toString(),
|
INPUT_PATH: inputLocation,
|
||||||
},
|
},
|
||||||
});
|
workerData: {
|
||||||
|
input,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const promise = new Promise<void>((resolve, reject) => {
|
const promise = new Promise<void>((resolve, reject) => {
|
||||||
|
worker.on('message', (message: Event) => {
|
||||||
|
emitter.emit('message', message);
|
||||||
|
});
|
||||||
worker.on('exit', async () => {
|
worker.on('exit', async () => {
|
||||||
await info.teardown();
|
server.close();
|
||||||
|
await unlink(hostSocket);
|
||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
worker.on('error', async (error) => {
|
worker.on('error', async (error) => {
|
||||||
|
server.close();
|
||||||
|
await unlink(hostSocket);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...info,
|
emitter,
|
||||||
teardown: async () => {
|
|
||||||
worker.terminate();
|
|
||||||
},
|
|
||||||
promise,
|
promise,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
type RunInfo = Awaited<ReturnType<typeof run>>;
|
|
||||||
|
|
||||||
export type { RunInfo };
|
|
||||||
export { run };
|
export { run };
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
import { join } from 'path';
|
|
||||||
import os from 'os';
|
|
||||||
import { nanoid } from 'nanoid';
|
|
||||||
import { chmod, mkdir, rm, writeFile } from 'fs/promises';
|
|
||||||
import { createServer } from 'net';
|
|
||||||
import { EventEmitter } from 'eventemitter3';
|
|
||||||
|
|
||||||
type SetupOptions = {
|
|
||||||
input?: Buffer | string;
|
|
||||||
script: string;
|
|
||||||
secrets?: Record<string, string>;
|
|
||||||
};
|
|
||||||
|
|
||||||
type RunEvents = {
|
|
||||||
message: (event: any) => void;
|
|
||||||
error: (error: Error) => void;
|
|
||||||
exit: () => void;
|
|
||||||
};
|
|
||||||
|
|
||||||
const setup = async (options: SetupOptions) => {
|
|
||||||
const { input, script, secrets } = options;
|
|
||||||
const emitter = new EventEmitter<RunEvents>();
|
|
||||||
const dataDir = join(os.tmpdir(), 'mini-loader', nanoid());
|
|
||||||
|
|
||||||
await mkdir(dataDir, { recursive: true });
|
|
||||||
await chmod(dataDir, 0o700);
|
|
||||||
const hostSocket = join(dataDir, 'host');
|
|
||||||
const httpGatewaySocket = join(dataDir, 'socket');
|
|
||||||
const server = createServer();
|
|
||||||
const inputLocation = join(dataDir, 'input');
|
|
||||||
const scriptLocation = join(dataDir, 'script.js');
|
|
||||||
|
|
||||||
if (input) {
|
|
||||||
await writeFile(inputLocation, input);
|
|
||||||
}
|
|
||||||
await writeFile(scriptLocation, script);
|
|
||||||
const env = {
|
|
||||||
HOST_SOCKET: hostSocket,
|
|
||||||
SECRETS: JSON.stringify(secrets || {}),
|
|
||||||
INPUT_PATH: inputLocation,
|
|
||||||
HTTP_GATEWAY_PATH: httpGatewaySocket,
|
|
||||||
};
|
|
||||||
|
|
||||||
const teardown = async () => {
|
|
||||||
server.close();
|
|
||||||
await rm(dataDir, { recursive: true, force: true });
|
|
||||||
};
|
|
||||||
|
|
||||||
server.on('connection', (socket) => {
|
|
||||||
socket.on('data', (data) => {
|
|
||||||
const message = JSON.parse(data.toString());
|
|
||||||
emitter.emit('message', message);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
server.listen(hostSocket);
|
|
||||||
|
|
||||||
return {
|
|
||||||
env,
|
|
||||||
emitter,
|
|
||||||
teardown,
|
|
||||||
httpGatewaySocket,
|
|
||||||
scriptLocation,
|
|
||||||
hostSocket,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
type Setup = Awaited<ReturnType<typeof setup>>;
|
|
||||||
|
|
||||||
export type { Setup };
|
|
||||||
export { setup };
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
[Go to documentation](https://github.com/morten-olsen/mini-loader)
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@morten-olsen/mini-loader-server",
|
"name": "@morten-olsen/mini-loader-server",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"license": "GPL-3.0",
|
|
||||||
"main": "./dist/esm/index.js",
|
"main": "./dist/esm/index.js",
|
||||||
"types": "./dist/esm/index.d.ts",
|
"types": "./dist/esm/index.d.ts",
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -27,7 +26,6 @@
|
|||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fastify/reply-from": "^9.7.0",
|
|
||||||
"@trpc/client": "^10.45.0",
|
"@trpc/client": "^10.45.0",
|
||||||
"@trpc/server": "^10.45.0",
|
"@trpc/server": "^10.45.0",
|
||||||
"commander": "^11.1.0",
|
"commander": "^11.1.0",
|
||||||
@@ -40,10 +38,5 @@
|
|||||||
"sqlite3": "^5.1.7",
|
"sqlite3": "^5.1.7",
|
||||||
"superjson": "^2.2.1",
|
"superjson": "^2.2.1",
|
||||||
"zod": "^3.22.4"
|
"zod": "^3.22.4"
|
||||||
},
|
|
||||||
"homepage": "https://github.com/morten-olsen/mini-loader",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/morten-olsen/mini-loader"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
import { FastifyPluginAsync } from 'fastify';
|
|
||||||
import FastifyReplyFrom from '@fastify/reply-from';
|
|
||||||
import { escape } from 'querystring';
|
|
||||||
import { Runtime } from '../runtime/runtime.js';
|
|
||||||
|
|
||||||
type Options = {
|
|
||||||
runtime: Runtime;
|
|
||||||
};
|
|
||||||
|
|
||||||
const gateway: FastifyPluginAsync<Options> = async (fastify, { runtime }) => {
|
|
||||||
await fastify.register(FastifyReplyFrom, {
|
|
||||||
http: {},
|
|
||||||
});
|
|
||||||
|
|
||||||
fastify.all('/gateway/*', (req, res) => {
|
|
||||||
const [runId, ...pathSegments] = (req.params as any)['*'].split('/').filter(Boolean);
|
|
||||||
const run = runtime.runner.getInstance(runId);
|
|
||||||
if (!run) {
|
|
||||||
res.statusCode = 404;
|
|
||||||
res.send({ error: 'Run not found' });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const socketPath = run.run?.httpGatewaySocket;
|
|
||||||
if (!socketPath) {
|
|
||||||
res.statusCode = 404;
|
|
||||||
res.send({ error: 'No socket path to run' });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const path = pathSegments.join('/');
|
|
||||||
res.from(`unix+http://${escape(socketPath)}/${path}`);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export { gateway };
|
|
||||||
@@ -27,9 +27,5 @@ program.addCommand(createToken);
|
|||||||
|
|
||||||
await program.parseAsync(process.argv);
|
await program.parseAsync(process.argv);
|
||||||
|
|
||||||
process.on('unhandledRejection', (reason, p) => {
|
|
||||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
|
||||||
});
|
|
||||||
|
|
||||||
export type { Runtime } from './runtime/runtime.js';
|
export type { Runtime } from './runtime/runtime.js';
|
||||||
export type { RootRouter } from './router/router.js';
|
export type { RootRouter } from './router/router.js';
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { EventEmitter } from 'eventemitter3';
|
|||||||
import { Database } from '../../database/database.js';
|
import { Database } from '../../database/database.js';
|
||||||
import { CreateRunOptions, FindRunsOptions, UpdateRunOptions } from './runs.schemas.js';
|
import { CreateRunOptions, FindRunsOptions, UpdateRunOptions } from './runs.schemas.js';
|
||||||
import { LoadRepo } from '../loads/loads.js';
|
import { LoadRepo } from '../loads/loads.js';
|
||||||
import { createHash } from 'crypto';
|
|
||||||
|
|
||||||
type RunRepoEvents = {
|
type RunRepoEvents = {
|
||||||
created: (args: { id: string; loadId: string }) => void;
|
created: (args: { id: string; loadId: string }) => void;
|
||||||
@@ -19,22 +18,13 @@ type RunRepoOptions = {
|
|||||||
|
|
||||||
class RunRepo extends EventEmitter<RunRepoEvents> {
|
class RunRepo extends EventEmitter<RunRepoEvents> {
|
||||||
#options: RunRepoOptions;
|
#options: RunRepoOptions;
|
||||||
#isReady: Promise<void>;
|
|
||||||
|
|
||||||
constructor(options: RunRepoOptions) {
|
constructor(options: RunRepoOptions) {
|
||||||
super();
|
super();
|
||||||
this.#options = options;
|
this.#options = options;
|
||||||
this.#isReady = this.#setup();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#setup = async () => {
|
|
||||||
const { database } = this.#options;
|
|
||||||
const db = await database.instance;
|
|
||||||
await db('runs').update({ status: 'failed', error: 'server was shut down' }).where({ status: 'running' });
|
|
||||||
};
|
|
||||||
|
|
||||||
public getById = async (id: string) => {
|
public getById = async (id: string) => {
|
||||||
await this.#isReady;
|
|
||||||
const { database } = this.#options;
|
const { database } = this.#options;
|
||||||
const db = await database.instance;
|
const db = await database.instance;
|
||||||
|
|
||||||
@@ -46,7 +36,6 @@ class RunRepo extends EventEmitter<RunRepoEvents> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
public getByLoadId = async (loadId: string) => {
|
public getByLoadId = async (loadId: string) => {
|
||||||
await this.#isReady;
|
|
||||||
const { database } = this.#options;
|
const { database } = this.#options;
|
||||||
const db = await database.instance;
|
const db = await database.instance;
|
||||||
|
|
||||||
@@ -55,7 +44,6 @@ class RunRepo extends EventEmitter<RunRepoEvents> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
public find = async (options: FindRunsOptions) => {
|
public find = async (options: FindRunsOptions) => {
|
||||||
await this.#isReady;
|
|
||||||
const { database } = this.#options;
|
const { database } = this.#options;
|
||||||
const db = await database.instance;
|
const db = await database.instance;
|
||||||
const query = db('runs').select(['id', 'status', 'startedAt', 'status', 'error', 'endedAt']);
|
const query = db('runs').select(['id', 'status', 'startedAt', 'status', 'error', 'endedAt']);
|
||||||
@@ -74,41 +62,19 @@ class RunRepo extends EventEmitter<RunRepoEvents> {
|
|||||||
return runs;
|
return runs;
|
||||||
};
|
};
|
||||||
|
|
||||||
public prepareRemove = async (options: FindRunsOptions) => {
|
public remove = async (options: FindRunsOptions) => {
|
||||||
await this.#isReady;
|
|
||||||
const { database } = this.#options;
|
const { database } = this.#options;
|
||||||
const db = await database.instance;
|
const db = await database.instance;
|
||||||
const query = db('runs').select('id');
|
const query = db('runs');
|
||||||
|
|
||||||
if (options.loadId) {
|
if (options.loadId) {
|
||||||
query.where({ loadId: options.loadId });
|
query.where({ loadId: options.loadId });
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await query;
|
await query.del();
|
||||||
const ids = result.map((row) => row.id);
|
|
||||||
const token = ids.map((id) => Buffer.from(id).toString('base64')).join('|');
|
|
||||||
const hash = createHash('sha256').update(token).digest('hex');
|
|
||||||
return {
|
|
||||||
ids,
|
|
||||||
hash,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
public remove = async (hash: string, ids: string[]) => {
|
|
||||||
const { database } = this.#options;
|
|
||||||
const db = await database.instance;
|
|
||||||
const token = ids.map((id) => Buffer.from(id).toString('base64')).join('|');
|
|
||||||
const actualHash = createHash('sha256').update(token).digest('hex');
|
|
||||||
|
|
||||||
if (hash !== actualHash) {
|
|
||||||
throw new Error('Invalid hash');
|
|
||||||
}
|
|
||||||
|
|
||||||
await db('runs').whereIn('id', ids).delete();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public started = async (id: string) => {
|
public started = async (id: string) => {
|
||||||
await this.#isReady;
|
|
||||||
const { database } = this.#options;
|
const { database } = this.#options;
|
||||||
const db = await database.instance;
|
const db = await database.instance;
|
||||||
const current = await this.getById(id);
|
const current = await this.getById(id);
|
||||||
@@ -126,7 +92,6 @@ class RunRepo extends EventEmitter<RunRepoEvents> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
public finished = async (id: string, options: UpdateRunOptions) => {
|
public finished = async (id: string, options: UpdateRunOptions) => {
|
||||||
await this.#isReady;
|
|
||||||
const { database } = this.#options;
|
const { database } = this.#options;
|
||||||
const db = await database.instance;
|
const db = await database.instance;
|
||||||
const { loadId } = await this.getById(id);
|
const { loadId } = await this.getById(id);
|
||||||
@@ -149,7 +114,6 @@ class RunRepo extends EventEmitter<RunRepoEvents> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
public create = async (options: CreateRunOptions) => {
|
public create = async (options: CreateRunOptions) => {
|
||||||
await this.#isReady;
|
|
||||||
const { database, loads } = this.#options;
|
const { database, loads } = this.#options;
|
||||||
const id = nanoid();
|
const id = nanoid();
|
||||||
const db = await database.instance;
|
const db = await database.instance;
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { z } from 'zod';
|
|
||||||
import { createRunSchema, findRunsSchema } from '../repos/repos.js';
|
import { createRunSchema, findRunsSchema } from '../repos/repos.js';
|
||||||
import { publicProcedure, router } from './router.utils.js';
|
import { publicProcedure, router } from './router.utils.js';
|
||||||
|
|
||||||
@@ -18,50 +17,17 @@ const find = publicProcedure.input(findRunsSchema).query(async ({ input, ctx })
|
|||||||
return results;
|
return results;
|
||||||
});
|
});
|
||||||
|
|
||||||
const prepareRemove = publicProcedure.input(findRunsSchema).query(async ({ input, ctx }) => {
|
const remove = publicProcedure.input(findRunsSchema).mutation(async ({ input, ctx }) => {
|
||||||
const { runtime } = ctx;
|
const { runtime } = ctx;
|
||||||
const { repos } = runtime;
|
const { repos } = runtime;
|
||||||
const { runs } = repos;
|
const { runs } = repos;
|
||||||
return await runs.prepareRemove(input);
|
await runs.remove(input);
|
||||||
});
|
|
||||||
|
|
||||||
const remove = publicProcedure
|
|
||||||
|
|
||||||
.input(
|
|
||||||
z.object({
|
|
||||||
hash: z.string(),
|
|
||||||
ids: z.array(z.string()),
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
.mutation(async ({ input, ctx }) => {
|
|
||||||
const { runtime } = ctx;
|
|
||||||
const { repos } = runtime;
|
|
||||||
const { runs } = repos;
|
|
||||||
for (const id of input.ids) {
|
|
||||||
const instance = runtime.runner.getInstance(id);
|
|
||||||
if (instance) {
|
|
||||||
await instance.run?.teardown();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await runs.remove(input.hash, input.ids);
|
|
||||||
});
|
|
||||||
|
|
||||||
const terminate = publicProcedure.input(z.string()).mutation(async ({ input, ctx }) => {
|
|
||||||
const { runtime } = ctx;
|
|
||||||
const { runner } = runtime;
|
|
||||||
const instance = runner.getInstance(input);
|
|
||||||
if (!instance || !instance.run) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await instance.run.teardown();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const runsRouter = router({
|
const runsRouter = router({
|
||||||
create,
|
create,
|
||||||
find,
|
find,
|
||||||
remove,
|
remove,
|
||||||
prepareRemove,
|
|
||||||
terminate,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export { runsRouter };
|
export { runsRouter };
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { EventEmitter } from 'eventemitter3';
|
import { EventEmitter } from 'eventemitter3';
|
||||||
import { RunInfo, run } from '@morten-olsen/mini-loader-runner';
|
import { run } from '@morten-olsen/mini-loader-runner';
|
||||||
import { Repos } from '../repos/repos.js';
|
import { Repos } from '../repos/repos.js';
|
||||||
import { LoggerEvent } from '../../../mini-loader/dist/esm/logger/logger.js';
|
import { LoggerEvent } from '../../../mini-loader/dist/esm/logger/logger.js';
|
||||||
import { ArtifactCreateEvent } from '../../../mini-loader/dist/esm/artifacts/artifacts.js';
|
import { ArtifactCreateEvent } from '../../../mini-loader/dist/esm/artifacts/artifacts.js';
|
||||||
@@ -20,17 +20,12 @@ type RunnerInstanceOptions = {
|
|||||||
|
|
||||||
class RunnerInstance extends EventEmitter<RunnerInstanceEvents> {
|
class RunnerInstance extends EventEmitter<RunnerInstanceEvents> {
|
||||||
#options: RunnerInstanceOptions;
|
#options: RunnerInstanceOptions;
|
||||||
#run?: RunInfo;
|
|
||||||
|
|
||||||
constructor(options: RunnerInstanceOptions) {
|
constructor(options: RunnerInstanceOptions) {
|
||||||
super();
|
super();
|
||||||
this.#options = options;
|
this.#options = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
public get run() {
|
|
||||||
return this.#run;
|
|
||||||
}
|
|
||||||
|
|
||||||
#addLog = async (event: LoggerEvent['payload']) => {
|
#addLog = async (event: LoggerEvent['payload']) => {
|
||||||
const { repos, id, loadId } = this.#options;
|
const { repos, id, loadId } = this.#options;
|
||||||
const { logs } = repos;
|
const { logs } = repos;
|
||||||
@@ -63,13 +58,11 @@ class RunnerInstance extends EventEmitter<RunnerInstanceEvents> {
|
|||||||
const script = await readFile(scriptLocation, 'utf-8');
|
const script = await readFile(scriptLocation, 'utf-8');
|
||||||
const allSecrets = await secrets.getAll();
|
const allSecrets = await secrets.getAll();
|
||||||
await runs.started(id);
|
await runs.started(id);
|
||||||
const current = await run({
|
const { promise, emitter } = await run({
|
||||||
script,
|
script,
|
||||||
secrets: allSecrets,
|
secrets: allSecrets,
|
||||||
input,
|
input,
|
||||||
});
|
});
|
||||||
this.#run = current;
|
|
||||||
const { promise, emitter } = current;
|
|
||||||
emitter.on('message', (message) => {
|
emitter.on('message', (message) => {
|
||||||
switch (message.type) {
|
switch (message.type) {
|
||||||
case 'log': {
|
case 'log': {
|
||||||
@@ -91,11 +84,9 @@ class RunnerInstance extends EventEmitter<RunnerInstanceEvents> {
|
|||||||
}
|
}
|
||||||
await runs.finished(id, { status: 'failed', error: errorMessage });
|
await runs.finished(id, { status: 'failed', error: errorMessage });
|
||||||
} finally {
|
} finally {
|
||||||
this.#run = undefined;
|
|
||||||
this.emit('completed', { id });
|
this.emit('completed', { id });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export type { RunInfo };
|
|
||||||
export { RunnerInstance };
|
export { RunnerInstance };
|
||||||
|
|||||||
@@ -36,10 +36,6 @@ class Runner {
|
|||||||
this.#instances.set(args.id, instance);
|
this.#instances.set(args.id, instance);
|
||||||
await instance.start();
|
await instance.start();
|
||||||
};
|
};
|
||||||
|
|
||||||
public getInstance = (id: string) => {
|
|
||||||
return this.#instances.get(id);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Runner };
|
export { Runner };
|
||||||
|
|||||||
@@ -3,16 +3,9 @@ import fastify from 'fastify';
|
|||||||
import { RootRouter, rootRouter } from '../router/router.js';
|
import { RootRouter, rootRouter } from '../router/router.js';
|
||||||
import { createContext } from '../router/router.utils.js';
|
import { createContext } from '../router/router.utils.js';
|
||||||
import { Runtime } from '../runtime/runtime.js';
|
import { Runtime } from '../runtime/runtime.js';
|
||||||
import { gateway } from '../gateway/gateway.js';
|
|
||||||
|
|
||||||
const createServer = async (runtime: Runtime) => {
|
const createServer = async (runtime: Runtime) => {
|
||||||
const server = fastify({
|
const server = fastify({});
|
||||||
maxParamLength: 10000,
|
|
||||||
bodyLimit: 30 * 1024 * 1024,
|
|
||||||
logger: {
|
|
||||||
level: 'warn',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
server.get('/', async () => {
|
server.get('/', async () => {
|
||||||
return { hello: 'world' };
|
return { hello: 'world' };
|
||||||
});
|
});
|
||||||
@@ -40,14 +33,6 @@ const createServer = async (runtime: Runtime) => {
|
|||||||
},
|
},
|
||||||
} satisfies FastifyTRPCPluginOptions<RootRouter>['trpcOptions'],
|
} satisfies FastifyTRPCPluginOptions<RootRouter>['trpcOptions'],
|
||||||
});
|
});
|
||||||
|
|
||||||
server.register(gateway, {
|
|
||||||
runtime,
|
|
||||||
});
|
|
||||||
|
|
||||||
server.addHook('onError', async (request, reply, error) => {
|
|
||||||
console.error(error);
|
|
||||||
});
|
|
||||||
await server.ready();
|
await server.ready();
|
||||||
|
|
||||||
return server;
|
return server;
|
||||||
|
|||||||
47
pnpm-lock.yaml
generated
47
pnpm-lock.yaml
generated
@@ -101,10 +101,6 @@ importers:
|
|||||||
packages/configs: {}
|
packages/configs: {}
|
||||||
|
|
||||||
packages/examples:
|
packages/examples:
|
||||||
dependencies:
|
|
||||||
fastify:
|
|
||||||
specifier: ^4.25.2
|
|
||||||
version: 4.25.2
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@morten-olsen/mini-loader':
|
'@morten-olsen/mini-loader':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
@@ -136,9 +132,6 @@ importers:
|
|||||||
|
|
||||||
packages/runner:
|
packages/runner:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@morten-olsen/mini-loader':
|
|
||||||
specifier: workspace:^
|
|
||||||
version: link:../mini-loader
|
|
||||||
eventemitter3:
|
eventemitter3:
|
||||||
specifier: ^5.0.1
|
specifier: ^5.0.1
|
||||||
version: 5.0.1
|
version: 5.0.1
|
||||||
@@ -146,6 +139,9 @@ importers:
|
|||||||
specifier: ^5.0.4
|
specifier: ^5.0.4
|
||||||
version: 5.0.4
|
version: 5.0.4
|
||||||
devDependencies:
|
devDependencies:
|
||||||
|
'@morten-olsen/mini-loader':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../mini-loader
|
||||||
'@morten-olsen/mini-loader-configs':
|
'@morten-olsen/mini-loader-configs':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../configs
|
version: link:../configs
|
||||||
@@ -158,9 +154,6 @@ importers:
|
|||||||
|
|
||||||
packages/server:
|
packages/server:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@fastify/reply-from':
|
|
||||||
specifier: ^9.7.0
|
|
||||||
version: 9.7.0
|
|
||||||
'@trpc/client':
|
'@trpc/client':
|
||||||
specifier: ^10.45.0
|
specifier: ^10.45.0
|
||||||
version: 10.45.0(@trpc/server@10.45.0)
|
version: 10.45.0(@trpc/server@10.45.0)
|
||||||
@@ -483,11 +476,6 @@ packages:
|
|||||||
fast-uri: 2.3.0
|
fast-uri: 2.3.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@fastify/busboy@2.1.0:
|
|
||||||
resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==}
|
|
||||||
engines: {node: '>=14'}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@fastify/deepmerge@1.3.0:
|
/@fastify/deepmerge@1.3.0:
|
||||||
resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==}
|
resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==}
|
||||||
dev: false
|
dev: false
|
||||||
@@ -502,19 +490,6 @@ packages:
|
|||||||
fast-json-stringify: 5.10.0
|
fast-json-stringify: 5.10.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@fastify/reply-from@9.7.0:
|
|
||||||
resolution: {integrity: sha512-/F1QBl3FGlTqStjmiuoLRDchVxP967TZh6FZPwQteWhdLsDec8mqSACE+cRzw6qHUj3v9hfdd7JNgmb++fyFhQ==}
|
|
||||||
dependencies:
|
|
||||||
'@fastify/error': 3.4.1
|
|
||||||
end-of-stream: 1.4.4
|
|
||||||
fast-content-type-parse: 1.1.0
|
|
||||||
fast-querystring: 1.1.2
|
|
||||||
fastify-plugin: 4.5.1
|
|
||||||
pump: 3.0.0
|
|
||||||
tiny-lru: 11.2.5
|
|
||||||
undici: 5.28.2
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/@gar/promisify@1.1.3:
|
/@gar/promisify@1.1.3:
|
||||||
resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==}
|
resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==}
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
@@ -2708,10 +2683,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==}
|
resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/fastify-plugin@4.5.1:
|
|
||||||
resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/fastify@4.25.2:
|
/fastify@4.25.2:
|
||||||
resolution: {integrity: sha512-SywRouGleDHvRh054onj+lEZnbC1sBCLkR0UY3oyJwjD4BdZJUrxBqfkfCaqn74pVCwBaRHGuL3nEWeHbHzAfw==}
|
resolution: {integrity: sha512-SywRouGleDHvRh054onj+lEZnbC1sBCLkR0UY3oyJwjD4BdZJUrxBqfkfCaqn74pVCwBaRHGuL3nEWeHbHzAfw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -5180,11 +5151,6 @@ packages:
|
|||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/tiny-lru@11.2.5:
|
|
||||||
resolution: {integrity: sha512-JpqM0K33lG6iQGKiigcwuURAKZlq6rHXfrgeL4/I8/REoyJTGU+tEMszvT/oTRVHG2OiylhGDjqPp1jWMlr3bw==}
|
|
||||||
engines: {node: '>=12'}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/tmp@0.0.33:
|
/tmp@0.0.33:
|
||||||
resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
|
resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
|
||||||
engines: {node: '>=0.6.0'}
|
engines: {node: '>=0.6.0'}
|
||||||
@@ -5402,13 +5368,6 @@ packages:
|
|||||||
/undici-types@5.26.5:
|
/undici-types@5.26.5:
|
||||||
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
||||||
|
|
||||||
/undici@5.28.2:
|
|
||||||
resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==}
|
|
||||||
engines: {node: '>=14.0'}
|
|
||||||
dependencies:
|
|
||||||
'@fastify/busboy': 2.1.0
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
/unique-filename@1.1.1:
|
/unique-filename@1.1.1:
|
||||||
resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
|
resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
import { findWorkspacePackages } from '@pnpm/find-workspace-packages';
|
import { findWorkspacePackages } from '@pnpm/find-workspace-packages';
|
||||||
import { readFile, writeFile } from 'fs/promises';
|
import { writeFile } from 'fs/promises';
|
||||||
import { join } from 'path';
|
import { join } from 'path';
|
||||||
|
|
||||||
const sharedData = JSON.parse(await readFile(join(process.cwd(), 'scripts/shared-data.json')));
|
|
||||||
|
|
||||||
const version = process.argv[2];
|
const version = process.argv[2];
|
||||||
if (!version) {
|
if (!version) {
|
||||||
throw new Error('Version is required');
|
throw new Error('Version is required');
|
||||||
@@ -13,9 +11,6 @@ const packages = await findWorkspacePackages(process.cwd());
|
|||||||
|
|
||||||
for (const { manifest, dir } of packages) {
|
for (const { manifest, dir } of packages) {
|
||||||
console.log(dir, version);
|
console.log(dir, version);
|
||||||
for (let [key, value] of Object.entries(sharedData || {})) {
|
|
||||||
manifest[key] = value;
|
|
||||||
}
|
|
||||||
manifest.version = version;
|
manifest.version = version;
|
||||||
await writeFile(join(dir, 'package.json'), JSON.stringify(manifest, null, 2));
|
await writeFile(join(dir, 'package.json'), JSON.stringify(manifest, null, 2));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"license": "GPL-3.0",
|
|
||||||
"homepage": "https://github.com/morten-olsen/mini-loader",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/morten-olsen/mini-loader"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
{
|
{
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
{
|
|
||||||
"path": "./packages/mini-loader/tsconfig.json"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "./packages/runner/tsconfig.json"
|
"path": "./packages/runner/tsconfig.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "./packages/server/tsconfig.json"
|
"path": "./packages/server/tsconfig.json"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "./packages/mini-loader/tsconfig.json"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "./packages/cli/tsconfig.json"
|
"path": "./packages/cli/tsconfig.json"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user