Skip to content

Commit 1f1f714

Browse files
committed
merge origin-dev
2 parents ae58016 + 2a533d0 commit 1f1f714

12 files changed

Lines changed: 330 additions & 0 deletions

File tree

packages/config-builder/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"dependencies": {
2525
"@polywrap/core-js": "0.10.1",
2626
"@polywrap/config-bundle-types-js": "0.10.1",
27+
"@polywrap/plugin-js": "0.10.1",
2728
"@polywrap/sys-config-bundle-js": "0.10.1",
2829
"@polywrap/uri-resolver-extensions-js": "0.10.1",
2930
"@polywrap/uri-resolvers-js": "0.10.1",
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import {
2+
Uri,
3+
UriResolutionContext,
4+
} from "@polywrap/core-js";
5+
import { expectHistory } from "../helpers/expectHistory";
6+
import { PolywrapCoreClient } from "@polywrap/core-client-js";
7+
import { UriResolverAggregator } from "../../aggregator";
8+
9+
jest.setTimeout(20000);
10+
11+
describe("UriResolverAggregator", () => {
12+
const client = new PolywrapCoreClient({
13+
resolver: new UriResolverAggregator([
14+
{
15+
from: Uri.from("test/1"),
16+
to: Uri.from("test/2")
17+
},
18+
{
19+
from: Uri.from("test/2"),
20+
to: Uri.from("test/3")
21+
},
22+
{
23+
from: Uri.from("test/3"),
24+
to: Uri.from("test/4")
25+
}
26+
], "TestAggregator")
27+
});
28+
29+
it("can resolve using first resolver", async () => {
30+
const uri = new Uri("test/1");
31+
32+
let resolutionContext = new UriResolutionContext();
33+
let result = await client.tryResolveUri({ uri, resolutionContext });
34+
35+
await expectHistory(
36+
resolutionContext.getHistory(),
37+
"aggregator-resolver",
38+
"can-resolve-using-first-resolver",
39+
);
40+
41+
if (!result.ok) {
42+
fail(result.error);
43+
}
44+
45+
if (result.value.type !== "uri") {
46+
fail("Expected a uri, received: " + result.value.type);
47+
}
48+
49+
expect(result.value.uri.uri).toEqual("wrap://test/2");
50+
});
51+
52+
it("can resolve using last resolver", async () => {
53+
const uri = new Uri("test/3");
54+
55+
let resolutionContext = new UriResolutionContext();
56+
let result = await client.tryResolveUri({ uri, resolutionContext });
57+
58+
await expectHistory(
59+
resolutionContext.getHistory(),
60+
"aggregator-resolver",
61+
"can-resolve-using-last-resolver",
62+
);
63+
64+
if (!result.ok) {
65+
fail(result.error);
66+
}
67+
68+
if (result.value.type !== "uri") {
69+
fail("Expected a uri, received: " + result.value.type);
70+
}
71+
72+
expect(result.value.uri.uri).toEqual("wrap://test/4");
73+
});
74+
75+
76+
it("does not resolve a uri when not a match", async () => {
77+
const uri = new Uri("test/not-a-match");
78+
79+
let resolutionContext = new UriResolutionContext();
80+
let result = await client.tryResolveUri({ uri, resolutionContext });
81+
82+
await expectHistory(
83+
resolutionContext.getHistory(),
84+
"aggregator-resolver",
85+
"not-a-match",
86+
);
87+
88+
if (!result.ok) {
89+
fail(result.error);
90+
}
91+
92+
if (result.value.type !== "uri") {
93+
fail("Expected a uri, received: " + result.value.type);
94+
}
95+
96+
expect(result.value.uri.uri).toEqual("wrap://test/not-a-match");
97+
});
98+
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[
2+
"wrap://test/1 => TestAggregator => uri (wrap://test/2)",
3+
[
4+
"wrap://test/1 => Redirect (wrap://test/1 - wrap://test/2) => uri (wrap://test/2)"
5+
]
6+
]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[
2+
"wrap://test/3 => TestAggregator => uri (wrap://test/4)",
3+
[
4+
"wrap://test/3 => Redirect (wrap://test/1 - wrap://test/2)",
5+
"wrap://test/3 => Redirect (wrap://test/2 - wrap://test/3)",
6+
"wrap://test/3 => Redirect (wrap://test/3 - wrap://test/4) => uri (wrap://test/4)"
7+
]
8+
]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[
2+
"wrap://test/not-a-match => TestAggregator",
3+
[
4+
"wrap://test/not-a-match => Redirect (wrap://test/1 - wrap://test/2)",
5+
"wrap://test/not-a-match => Redirect (wrap://test/2 - wrap://test/3)",
6+
"wrap://test/not-a-match => Redirect (wrap://test/3 - wrap://test/4)"
7+
]
8+
]
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[
2+
"wrap://test/1 => InfiniteRedirectResolver => uri (wrap://test/2)",
3+
"wrap://test/2 => InfiniteRedirectResolver => uri (wrap://test/3)",
4+
"wrap://test/3 => InfiniteRedirectResolver => uri (wrap://test/1)"
5+
]

packages/uri-resolvers/src/__tests__/recursive-resolver/recursive-resolver.spec.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,38 @@ class SimpleRedirectResolver implements IUriResolver<Error> {
4646
}
4747
}
4848

49+
class InfiniteRedirectResolver implements IUriResolver<Error> {
50+
async tryResolveUri(
51+
uri: Uri,
52+
client: CoreClient,
53+
resolutionContext: IUriResolutionContext
54+
): Promise<Result<UriPackageOrWrapper, Error>> {
55+
let result: Result<UriPackageOrWrapper, Error>;
56+
57+
switch (uri.uri) {
58+
case "wrap://test/1":
59+
result = UriResolutionResult.ok(Uri.from("test/2"));
60+
break;
61+
case "wrap://test/2":
62+
result = UriResolutionResult.ok(Uri.from("test/3"));
63+
break;
64+
case "wrap://test/3":
65+
result = UriResolutionResult.ok(Uri.from("test/1"));
66+
break;
67+
default:
68+
result = UriResolutionResult.ok(uri);
69+
}
70+
71+
resolutionContext.trackStep({
72+
sourceUri: uri,
73+
result,
74+
description: "InfiniteRedirectResolver",
75+
});
76+
77+
return result;
78+
}
79+
}
80+
4981
describe("RecursiveResolver", () => {
5082
it("can recursively resolve a URI", async () => {
5183
const uri = new Uri("test/1");
@@ -100,4 +132,28 @@ describe("RecursiveResolver", () => {
100132

101133
expect(result.value.uri.uri).toEqual("wrap://test/not-a-match");
102134
});
135+
136+
it("should raise an error if infinite loop detected during URI Resolution", async () => {
137+
const uri = new Uri("test/1");
138+
139+
const client = new PolywrapCoreClient({
140+
resolver: RecursiveResolver.from(new InfiniteRedirectResolver()),
141+
});
142+
143+
let resolutionContext = new UriResolutionContext();
144+
let result = await client.tryResolveUri({ uri, resolutionContext });
145+
146+
await expectHistory(
147+
resolutionContext.getHistory(),
148+
"recursive-resolver",
149+
"infinite-loop"
150+
);
151+
152+
if (result.ok) {
153+
fail(`Expected an error got value: ${result.value}`);
154+
}
155+
156+
// @ts-ignore
157+
expect(result.error!.message).toMatch("An infinite loop was detected while resolving the URI: wrap://test/1");
158+
})
103159
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[
2+
"wrap://test/from => StaticResolver - Redirect (wrap://test/from - wrap://test/to) => uri (wrap://test/to)"
3+
]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[
2+
"wrap://test/package => StaticResolver - Package (wrap://test/package) => package (wrap://test/package)"
3+
]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[
2+
"wrap://test/wrapper => StaticResolver - Wrapper (wrap://test/wrapper) => wrapper (wrap://test/wrapper)"
3+
]

0 commit comments

Comments
 (0)