Skip to content

Commit 46dc152

Browse files
committed
fix: refactor build to support loading built-in policies
1 parent 000f046 commit 46dc152

11 files changed

+148
-17
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ USER node
2525
ENV NODE_ENV=production
2626

2727
EXPOSE 8080
28-
CMD ["node", "/app/dist/bootstrap.js"]
28+
CMD ["node", "/app/dist/src/bootstrap.js"]

etsc.config.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const path = require("path");
77
module.exports = {
88
tsConfigFile: "tsconfig.build.json",
99
esbuild: {
10+
outbase: "./",
1011
entryPoints: ["src/bootstrap.ts"],
1112
assetNames: "[dir]/[name]",
1213
bundle: true,
@@ -16,6 +17,9 @@ module.exports = {
1617
".yaml": "text",
1718
".node": "copy",
1819
},
20+
define: {
21+
"process.env.POLICY_DIR": `"./policies"`,
22+
},
1923
},
2024
postbuild: async () => {
2125
// uWebSockets.js works with binary targets and it has a different binary for each platform.
@@ -26,7 +30,7 @@ module.exports = {
2630
`uws_${process.platform}_${process.arch}_${process.versions.modules}.node`,
2731
];
2832

29-
const dirPath = path.resolve(`dist/_.._/node_modules/uWebSockets.js/`);
33+
const dirPath = path.resolve(`dist/node_modules/uWebSockets.js/`);
3034

3135
// Get all the available .node files.
3236
const dirContent = await fsp.readdir(dirPath);
@@ -37,5 +41,7 @@ module.exports = {
3741
await fsp.rm(path.resolve(dirPath, file), { recursive: true });
3842
}
3943
}
44+
45+
await (await import("cpy")).default("policies/*.wasm", "dist/policies/");
4046
},
4147
};

nodemon.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
22
"watch": ["src/**/*"],
3-
"exec": "etsc && (node ./dist/bootstrap.js | node_modules/.bin/pino-pretty)"
3+
"exec": "etsc && (node ./dist/src/bootstrap.js | node_modules/.bin/pino-pretty)"
44
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
"@commitlint/cli": "^19.3.0",
7171
"@types/supertest": "^6.0.2",
7272
"@vitest/coverage-v8": "^1.5.2",
73+
"cpy": "^11.0.1",
7374
"dotenv-cli": "^7.4.1",
7475
"esbuild": "^0.20.2",
7576
"esbuild-node-tsc": "^2.0.5",

shims.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
declare module "@open-policy-agent/opa-wasm" {
2+
import type { loadPolicy as _loadPolicy } from "@open-policy-agent/opa-wasm/dist/types";
3+
import type * as opa from "@open-policy-agent/opa-wasm/dist/types/opa";
4+
5+
export const loadPolicy: typeof _loadPolicy;
6+
export default opa;
7+
}

src/dispatch-handler/policy.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @ts-ignore
21
import { loadPolicy } from "@open-policy-agent/opa-wasm";
32
import * as fsp from "fs/promises";
43
import * as path from "path";
@@ -7,8 +6,7 @@ import z from "zod";
76
import { getConfig } from "../utils/config";
87
import { getLogger } from "../utils/logger";
98

10-
// @ts-ignore
11-
import type { LoadedPolicy } from "@open-policy-agent/opa-wasm/dist/types/opa";
9+
import type opa from "@open-policy-agent/opa-wasm";
1210

1311
const policyInputSchemas = z.object({
1412
config: z.record(z.string()),
@@ -34,8 +32,8 @@ const _logger = getLogger("handler/policy");
3432

3533
// The built-in policies.
3634
const builtInPolicyMapping = {
37-
allow_all: path.join(__dirname, "../../policies/allow_all.wasm"),
38-
allow_org_wide: path.join(__dirname, "../../policies/allow_org_wide.wasm"),
35+
allow_all: "allow_all.wasm",
36+
allow_org_wide: "allow_org_wide.wasm",
3937
};
4038

4139
/**
@@ -46,7 +44,9 @@ const builtInPolicyMapping = {
4644
*/
4745
async function readPolicyFile(policyPath: string): Promise<ArrayBuffer> {
4846
try {
49-
return await fsp.readFile(policyPath);
47+
return await fsp.readFile(
48+
path.join(process.env.POLICY_DIR as string, policyPath)
49+
);
5050
} catch (error) {
5151
_logger.error({ error }, "Failed to read policy file");
5252

@@ -72,7 +72,7 @@ async function parsePolicyConfig(
7272
}
7373

7474
async function evaluatePolicy(
75-
policy: LoadedPolicy,
75+
policy: opa.LoadedPolicy,
7676
opts: PolicyInput
7777
): Promise<boolean> {
7878
try {

tsconfig.build.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"extends": "./tsconfig.json",
3-
"include": ["src/**/*.ts"],
3+
"include": ["src/**/*.ts", "shims.d.ts"],
44
"exclude": ["src/**/*.spec.ts"]
55
}

tsconfig.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
"isolatedModules": true,
2020
"incremental": true
2121
},
22-
"include": ["src/**/*.ts", "test/**/*.ts", "vitest.config.ts"],
22+
"include": [
23+
"src/**/*.ts",
24+
"test/**/*.ts",
25+
"vitest.config.*.ts",
26+
"shims.d.ts"
27+
],
2328
"exclude": ["node_modules"]
2429
}

vitest.config.integration.mts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ import {defineConfig} from "vitest/config";
22

33
export default defineConfig({
44
assetsInclude: [
5-
"**/*.yaml"
5+
"**/*.yaml",
66
],
7+
define: {
8+
"process.env.POLICY_DIR": `"./policies"`,
9+
},
710
test: {
811
include: ["test/**/*.spec-integration.ts"],
912
globals: true,

vitest.config.unit.mts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ import {defineConfig} from "vitest/config";
22

33
export default defineConfig({
44
assetsInclude: [
5-
"**/*.yaml"
5+
"**/*.yaml",
66
],
7+
define: {
8+
"process.env.POLICY_DIR": `"./policies"`,
9+
},
710
test: {
811
include: ["src/**/*.spec.ts"],
912
globals: true,

yarn.lock

Lines changed: 109 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,6 +1560,16 @@ __metadata:
15601560
languageName: node
15611561
linkType: hard
15621562

1563+
"aggregate-error@npm:^4.0.0":
1564+
version: 4.0.1
1565+
resolution: "aggregate-error@npm:4.0.1"
1566+
dependencies:
1567+
clean-stack: "npm:^4.0.0"
1568+
indent-string: "npm:^5.0.0"
1569+
checksum: 10/bb3ffdfd13447800fff237c2cba752c59868ee669104bb995dfbbe0b8320e967d679e683dabb640feb32e4882d60258165cde0baafc4cd467cc7d275a13ad6b5
1570+
languageName: node
1571+
linkType: hard
1572+
15631573
"ajv@npm:^6.12.4":
15641574
version: 6.12.6
15651575
resolution: "ajv@npm:6.12.6"
@@ -2061,6 +2071,15 @@ __metadata:
20612071
languageName: node
20622072
linkType: hard
20632073

2074+
"clean-stack@npm:^4.0.0":
2075+
version: 4.2.0
2076+
resolution: "clean-stack@npm:4.2.0"
2077+
dependencies:
2078+
escape-string-regexp: "npm:5.0.0"
2079+
checksum: 10/373f656a31face5c615c0839213b9b542a0a48057abfb1df66900eab4dc2a5c6097628e4a0b5aa559cdfc4e66f8a14ea47be9681773165a44470ef5fb8ccc172
2080+
languageName: node
2081+
linkType: hard
2082+
20642083
"cli-cursor@npm:^4.0.0":
20652084
version: 4.0.0
20662085
resolution: "cli-cursor@npm:4.0.0"
@@ -2260,6 +2279,16 @@ __metadata:
22602279
languageName: node
22612280
linkType: hard
22622281

2282+
"copy-file@npm:^11.0.0":
2283+
version: 11.0.0
2284+
resolution: "copy-file@npm:11.0.0"
2285+
dependencies:
2286+
graceful-fs: "npm:^4.2.11"
2287+
p-event: "npm:^6.0.0"
2288+
checksum: 10/49714b82fcc1315c06dbb50ce929621f10d620f3a8a17e1b212d4c676fecdcda42626917502b109e3ae5bdd9558ddcfedb5e6b70bd7c485fae53e18fc26e2dba
2289+
languageName: node
2290+
linkType: hard
2291+
22632292
"cors@npm:^2.8.5":
22642293
version: 2.8.5
22652294
resolution: "cors@npm:2.8.5"
@@ -2300,6 +2329,20 @@ __metadata:
23002329
languageName: node
23012330
linkType: hard
23022331

2332+
"cpy@npm:^11.0.1":
2333+
version: 11.0.1
2334+
resolution: "cpy@npm:11.0.1"
2335+
dependencies:
2336+
copy-file: "npm:^11.0.0"
2337+
globby: "npm:^13.2.2"
2338+
junk: "npm:^4.0.1"
2339+
micromatch: "npm:^4.0.5"
2340+
p-filter: "npm:^3.0.0"
2341+
p-map: "npm:^6.0.0"
2342+
checksum: 10/0547b160d423f7a23d5c866fe4b3844e639e2c8f19c3521dcd3cf15b7501d1741c3f169f3e294d66834819359d333c588ac8a0b8d9ea5800a95fc1d2ac9574b6
2343+
languageName: node
2344+
linkType: hard
2345+
23032346
"create-require@npm:^1.1.0":
23042347
version: 1.1.1
23052348
resolution: "create-require@npm:1.1.1"
@@ -2874,6 +2917,13 @@ __metadata:
28742917
languageName: node
28752918
linkType: hard
28762919

2920+
"escape-string-regexp@npm:5.0.0":
2921+
version: 5.0.0
2922+
resolution: "escape-string-regexp@npm:5.0.0"
2923+
checksum: 10/20daabe197f3cb198ec28546deebcf24b3dbb1a5a269184381b3116d12f0532e06007f4bc8da25669d6a7f8efb68db0758df4cd981f57bc5b57f521a3e12c59e
2924+
languageName: node
2925+
linkType: hard
2926+
28772927
"escape-string-regexp@npm:^1.0.5":
28782928
version: 1.0.5
28792929
resolution: "escape-string-regexp@npm:1.0.5"
@@ -3541,6 +3591,7 @@ __metadata:
35413591
"@open-policy-agent/opa-wasm": "npm:^1.8.1"
35423592
"@types/supertest": "npm:^6.0.2"
35433593
"@vitest/coverage-v8": "npm:^1.5.2"
3594+
cpy: "npm:^11.0.1"
35443595
dotenv-cli: "npm:^7.4.1"
35453596
esbuild: "npm:^0.20.2"
35463597
esbuild-node-tsc: "npm:^2.0.5"
@@ -3664,7 +3715,7 @@ __metadata:
36643715
languageName: node
36653716
linkType: hard
36663717

3667-
"globby@npm:^13.1.2":
3718+
"globby@npm:^13.1.2, globby@npm:^13.2.2":
36683719
version: 13.2.2
36693720
resolution: "globby@npm:13.2.2"
36703721
dependencies:
@@ -3686,7 +3737,7 @@ __metadata:
36863737
languageName: node
36873738
linkType: hard
36883739

3689-
"graceful-fs@npm:^4.2.6":
3740+
"graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.6":
36903741
version: 4.2.11
36913742
resolution: "graceful-fs@npm:4.2.11"
36923743
checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2
@@ -3926,6 +3977,13 @@ __metadata:
39263977
languageName: node
39273978
linkType: hard
39283979

3980+
"indent-string@npm:^5.0.0":
3981+
version: 5.0.0
3982+
resolution: "indent-string@npm:5.0.0"
3983+
checksum: 10/e466c27b6373440e6d84fbc19e750219ce25865cb82d578e41a6053d727e5520dc5725217d6eb1cc76005a1bb1696a0f106d84ce7ebda3033b963a38583fb3b3
3984+
languageName: node
3985+
linkType: hard
3986+
39293987
"inflight@npm:^1.0.4":
39303988
version: 1.0.6
39313989
resolution: "inflight@npm:1.0.6"
@@ -4438,6 +4496,13 @@ __metadata:
44384496
languageName: node
44394497
linkType: hard
44404498

4499+
"junk@npm:^4.0.1":
4500+
version: 4.0.1
4501+
resolution: "junk@npm:4.0.1"
4502+
checksum: 10/4f0c94c0b2e46172284d9eaeb57bf1b784d86d218dbc673a1c8e08ef3443d03164238eb067591d0ad9f2c76a6ad012aeb618bb8135a2f0f26a6da931058e131b
4503+
languageName: node
4504+
linkType: hard
4505+
44414506
"jwa@npm:^1.4.1":
44424507
version: 1.4.1
44434508
resolution: "jwa@npm:1.4.1"
@@ -4794,7 +4859,7 @@ __metadata:
47944859
languageName: node
47954860
linkType: hard
47964861

4797-
"micromatch@npm:4.0.5, micromatch@npm:^4.0.4":
4862+
"micromatch@npm:4.0.5, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5":
47984863
version: 4.0.5
47994864
resolution: "micromatch@npm:4.0.5"
48004865
dependencies:
@@ -5306,6 +5371,24 @@ __metadata:
53065371
languageName: node
53075372
linkType: hard
53085373

5374+
"p-event@npm:^6.0.0":
5375+
version: 6.0.1
5376+
resolution: "p-event@npm:6.0.1"
5377+
dependencies:
5378+
p-timeout: "npm:^6.1.2"
5379+
checksum: 10/f8a6bb7e5addee541f5be42685fb070d9848aa0fb761132e825762c1e4009d90416b3f78ec06f7d4ee96b48ef9cebda0b809a0a87e504d7ae5f371f406cf16a8
5380+
languageName: node
5381+
linkType: hard
5382+
5383+
"p-filter@npm:^3.0.0":
5384+
version: 3.0.0
5385+
resolution: "p-filter@npm:3.0.0"
5386+
dependencies:
5387+
p-map: "npm:^5.1.0"
5388+
checksum: 10/aacc36820f0531c01963334edc6debf5038b47c83a1c2255b7c14f6964a9a5fc1887ce0b93e72d137727403253bcc9bb26eed9bb79896ece1fa9f52d979bb97b
5389+
languageName: node
5390+
linkType: hard
5391+
53095392
"p-limit@npm:^3.0.2":
53105393
version: 3.1.0
53115394
resolution: "p-limit@npm:3.1.0"
@@ -5360,6 +5443,29 @@ __metadata:
53605443
languageName: node
53615444
linkType: hard
53625445

5446+
"p-map@npm:^5.1.0":
5447+
version: 5.5.0
5448+
resolution: "p-map@npm:5.5.0"
5449+
dependencies:
5450+
aggregate-error: "npm:^4.0.0"
5451+
checksum: 10/089a709d2525208a965b7907cc8e58af950542629b538198fc142c40e7f36b3b492dd6a46a1279515ccab58bb6f047e04593c0ab5ef4539d312adf7f761edf55
5452+
languageName: node
5453+
linkType: hard
5454+
5455+
"p-map@npm:^6.0.0":
5456+
version: 6.0.0
5457+
resolution: "p-map@npm:6.0.0"
5458+
checksum: 10/1fd59257b3828a4c4def676ef64acb0edb7809b161ada25efd9a0c8db312ad81c66bcaa9e5d8fd982fd20d412609aabcb8da9b090e81f6c449bc1203752ba0eb
5459+
languageName: node
5460+
linkType: hard
5461+
5462+
"p-timeout@npm:^6.1.2":
5463+
version: 6.1.2
5464+
resolution: "p-timeout@npm:6.1.2"
5465+
checksum: 10/ca3ede368d792bd86fcfa4e133220536382225d31e5f62e2cedb8280df267b25f6684aa0056b22e8aa538cc85014b310058d8fdddeb0a1ff363093d56e87ac3a
5466+
languageName: node
5467+
linkType: hard
5468+
53635469
"parent-module@npm:^1.0.0":
53645470
version: 1.0.1
53655471
resolution: "parent-module@npm:1.0.1"

0 commit comments

Comments
 (0)