@vlayer/sdk 0.1.0-nightly-20250127-5ee6ca8 → 0.1.0-nightly-20250128-0a32cfc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/src/api/email/dnsResolver.test.ts +19 -0
- package/src/api/email/dnsResolver.ts +87 -0
- package/src/api/email/parseEmail.test.ts +133 -0
- package/src/api/email/parseEmail.ts +55 -0
- package/src/api/email/preverify.test.ts +201 -0
- package/src/api/email/preverify.ts +70 -0
- package/src/api/email/testdata/test_email.txt +21 -0
- package/src/api/email/testdata/test_email_multiple_dkims.txt +28 -0
- package/src/api/email/testdata/test_email_subdomain.txt +21 -0
- package/src/api/email/testdata/test_email_unknown_domain.txt +21 -0
- package/src/api/lib/client.test.ts +261 -0
- package/src/api/lib/client.ts +191 -0
- package/src/api/lib/errors.ts +19 -0
- package/src/api/lib/types/ethereum.ts +45 -0
- package/src/api/lib/types/index.ts +3 -0
- package/src/api/lib/types/viem.ts +26 -0
- package/src/api/lib/types/vlayer.ts +156 -0
- package/src/api/lib/types/webProofProvider.ts +68 -0
- package/src/api/prover.ts +120 -0
- package/src/api/utils/prefixAllButNthSubstring.test.ts +24 -0
- package/src/api/utils/prefixAllButNthSubstring.ts +13 -0
- package/src/api/utils/versions.test.ts +52 -0
- package/src/api/utils/versions.ts +31 -0
- package/src/api/v_call.ts +58 -0
- package/src/api/v_getProofReceipt.ts +48 -0
- package/src/api/v_versions.ts +68 -0
- package/src/api/webProof/createWebProofRequest.ts +15 -0
- package/src/api/webProof/index.ts +3 -0
- package/src/api/webProof/providers/extension.test.ts +122 -0
- package/src/api/webProof/providers/extension.ts +197 -0
- package/src/api/webProof/providers/index.ts +1 -0
- package/src/api/webProof/steps/expectUrl.ts +12 -0
- package/src/api/webProof/steps/index.ts +11 -0
- package/src/api/webProof/steps/notarize.ts +20 -0
- package/src/api/webProof/steps/startPage.ts +12 -0
- package/src/config/createContext.ts +69 -0
- package/src/config/deploy.ts +108 -0
- package/src/config/getChainConfirmations.ts +6 -0
- package/src/config/getConfig.ts +71 -0
- package/src/config/index.ts +5 -0
- package/src/config/types.ts +26 -0
- package/src/config/writeEnvVariables.ts +28 -0
- package/src/index.ts +7 -0
- package/src/testHelpers/readFile.ts +3 -0
- package/src/web-proof-commons/index.ts +3 -0
- package/src/web-proof-commons/types/message.ts +176 -0
- package/src/web-proof-commons/types/redaction.test.ts +97 -0
- package/src/web-proof-commons/types/redaction.ts +201 -0
- package/src/web-proof-commons/utils.ts +11 -0
@@ -0,0 +1,176 @@
|
|
1
|
+
import type { Branded } from "../utils";
|
2
|
+
import { URLPattern } from "urlpattern-polyfill";
|
3
|
+
import { type RedactionConfig } from "./redaction";
|
4
|
+
import urlRegex from "url-regex";
|
5
|
+
import type { PresentationJSON as TLSNPresentationJSON } from "tlsn-js/src/types";
|
6
|
+
|
7
|
+
export const EXTENSION_STEP = {
|
8
|
+
expectUrl: "expectUrl",
|
9
|
+
startPage: "startPage",
|
10
|
+
notarize: "notarize",
|
11
|
+
} as const;
|
12
|
+
|
13
|
+
export type ExtensionStep =
|
14
|
+
(typeof EXTENSION_STEP)[keyof typeof EXTENSION_STEP];
|
15
|
+
|
16
|
+
export const enum ExtensionAction {
|
17
|
+
RequestWebProof = "RequestWebProof",
|
18
|
+
NotifyZkProvingStatus = "NotifyZkProvingStatus",
|
19
|
+
}
|
20
|
+
|
21
|
+
export enum ZkProvingStatus {
|
22
|
+
NotStarted = "NotStarted",
|
23
|
+
Proving = "Proving",
|
24
|
+
Done = "Done",
|
25
|
+
Error = "Error",
|
26
|
+
}
|
27
|
+
|
28
|
+
export type MessageToExtension =
|
29
|
+
| {
|
30
|
+
action: ExtensionAction.RequestWebProof;
|
31
|
+
payload: WebProverSessionConfig;
|
32
|
+
}
|
33
|
+
| {
|
34
|
+
action: ExtensionAction.NotifyZkProvingStatus;
|
35
|
+
payload: {
|
36
|
+
status: ZkProvingStatus;
|
37
|
+
};
|
38
|
+
};
|
39
|
+
|
40
|
+
export enum ExtensionMessageType {
|
41
|
+
ProofDone = "ProofDone",
|
42
|
+
ProofError = "ProofError",
|
43
|
+
RedirectBack = "RedirectBack",
|
44
|
+
TabOpened = "TabOpened",
|
45
|
+
ProofProcessing = "ProofProcessing",
|
46
|
+
}
|
47
|
+
|
48
|
+
export type PresentationJSON = TLSNPresentationJSON;
|
49
|
+
|
50
|
+
export type ExtensionMessage =
|
51
|
+
| {
|
52
|
+
type: ExtensionMessageType.ProofDone;
|
53
|
+
payload: {
|
54
|
+
presentationJSON: PresentationJSON;
|
55
|
+
decodedTranscript: {
|
56
|
+
sent: string;
|
57
|
+
recv: string;
|
58
|
+
};
|
59
|
+
};
|
60
|
+
}
|
61
|
+
| { type: ExtensionMessageType.ProofError; payload: { error: string } }
|
62
|
+
| { type: ExtensionMessageType.RedirectBack }
|
63
|
+
| { type: ExtensionMessageType.TabOpened; payload: { tabId: number } }
|
64
|
+
| {
|
65
|
+
type: ExtensionMessageType.ProofProcessing;
|
66
|
+
payload: {
|
67
|
+
// as we dont have progress yet from tlsn this is optional
|
68
|
+
progress?: number;
|
69
|
+
};
|
70
|
+
};
|
71
|
+
|
72
|
+
export type EmptyWebProverSessionConfig = {
|
73
|
+
notaryUrl: null;
|
74
|
+
wsProxyUrl: null;
|
75
|
+
logoUrl: null;
|
76
|
+
steps: never[];
|
77
|
+
};
|
78
|
+
|
79
|
+
export type WebProverSessionConfig =
|
80
|
+
| {
|
81
|
+
notaryUrl: string;
|
82
|
+
wsProxyUrl: string;
|
83
|
+
logoUrl: string;
|
84
|
+
steps: WebProofStep[];
|
85
|
+
}
|
86
|
+
| EmptyWebProverSessionConfig;
|
87
|
+
|
88
|
+
export function isEmptyWebProverSessionConfig(
|
89
|
+
config: WebProverSessionConfig,
|
90
|
+
): config is EmptyWebProverSessionConfig {
|
91
|
+
return (
|
92
|
+
config.notaryUrl === null &&
|
93
|
+
config.wsProxyUrl === null &&
|
94
|
+
config.logoUrl === null &&
|
95
|
+
config.steps.length === 0
|
96
|
+
);
|
97
|
+
}
|
98
|
+
|
99
|
+
export type WebProofStep =
|
100
|
+
| WebProofStepNotarize
|
101
|
+
| WebProofStepExpectUrl
|
102
|
+
| WebProofStepStartPage;
|
103
|
+
|
104
|
+
export type UrlPattern = Branded<string, "UrlPattern">;
|
105
|
+
|
106
|
+
export type Url = Branded<UrlPattern, "Url">;
|
107
|
+
|
108
|
+
export type WebProofStepNotarize = Branded<
|
109
|
+
{
|
110
|
+
url: UrlPattern;
|
111
|
+
method: string;
|
112
|
+
label: string;
|
113
|
+
redact: RedactionConfig;
|
114
|
+
step: typeof EXTENSION_STEP.notarize;
|
115
|
+
},
|
116
|
+
"notarize"
|
117
|
+
>;
|
118
|
+
|
119
|
+
export type WebProofStepStartPage = Branded<
|
120
|
+
{
|
121
|
+
url: Url;
|
122
|
+
label: string;
|
123
|
+
step: typeof EXTENSION_STEP.startPage;
|
124
|
+
},
|
125
|
+
"startPage"
|
126
|
+
>;
|
127
|
+
|
128
|
+
export type WebProofStepExpectUrl = Branded<
|
129
|
+
{
|
130
|
+
url: UrlPattern;
|
131
|
+
label: string;
|
132
|
+
step: typeof EXTENSION_STEP.expectUrl;
|
133
|
+
},
|
134
|
+
"expectUrl"
|
135
|
+
>;
|
136
|
+
|
137
|
+
export enum StepValidationErrors {
|
138
|
+
InvalidUrl = "InvalidUrl",
|
139
|
+
InvalidUrlPattern = "InvalidUrlPattern",
|
140
|
+
}
|
141
|
+
|
142
|
+
export enum StepValidationErrorMessage {
|
143
|
+
InvalidUrl = "Wrong url",
|
144
|
+
InvalidUrlPattern = "Wrong url pattern",
|
145
|
+
}
|
146
|
+
|
147
|
+
export class StepValidationError extends Error {
|
148
|
+
constructor(message: string, name: StepValidationErrors) {
|
149
|
+
super(message);
|
150
|
+
this.name = name;
|
151
|
+
}
|
152
|
+
}
|
153
|
+
|
154
|
+
export function assertUrl(url: string): asserts url is Url {
|
155
|
+
const regex = urlRegex({ strict: true });
|
156
|
+
const isUrl = regex.test(url);
|
157
|
+
if (!isUrl) {
|
158
|
+
throw new StepValidationError(
|
159
|
+
`${StepValidationErrorMessage.InvalidUrl}: ${url}`,
|
160
|
+
StepValidationErrors.InvalidUrl,
|
161
|
+
);
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
165
|
+
export function assertUrlPattern(
|
166
|
+
urlPattern: string,
|
167
|
+
): asserts urlPattern is UrlPattern {
|
168
|
+
try {
|
169
|
+
new URLPattern(urlPattern);
|
170
|
+
} catch {
|
171
|
+
throw new StepValidationError(
|
172
|
+
`${StepValidationErrorMessage.InvalidUrlPattern}: ${urlPattern} `,
|
173
|
+
StepValidationErrors.InvalidUrlPattern,
|
174
|
+
);
|
175
|
+
}
|
176
|
+
}
|
@@ -0,0 +1,97 @@
|
|
1
|
+
import { describe, test, expect } from "vitest";
|
2
|
+
import { RedactionItemsArray } from "./redaction";
|
3
|
+
describe("RedactionConfig", () => {
|
4
|
+
test("accepts empty array", () => {
|
5
|
+
const testEmpty = RedactionItemsArray.parse([]);
|
6
|
+
expect(testEmpty).toBeDefined();
|
7
|
+
});
|
8
|
+
|
9
|
+
test("valid redaction config", () => {
|
10
|
+
const testValid = RedactionItemsArray.parse([
|
11
|
+
{
|
12
|
+
request: {
|
13
|
+
headers: ["Authorization"],
|
14
|
+
},
|
15
|
+
},
|
16
|
+
{
|
17
|
+
response: {
|
18
|
+
headers: ["Content-Type"],
|
19
|
+
},
|
20
|
+
},
|
21
|
+
]);
|
22
|
+
console.log(testValid);
|
23
|
+
expect(testValid).toBeDefined();
|
24
|
+
});
|
25
|
+
|
26
|
+
test("invalid when using both request headers and headers_except", () => {
|
27
|
+
expect(() => {
|
28
|
+
RedactionItemsArray.parse([
|
29
|
+
{
|
30
|
+
request: {
|
31
|
+
headers: ["Authorization"],
|
32
|
+
},
|
33
|
+
},
|
34
|
+
{
|
35
|
+
request: {
|
36
|
+
headers_except: ["Authorization"],
|
37
|
+
},
|
38
|
+
},
|
39
|
+
]);
|
40
|
+
}).toThrow("Cannot have both request headers and request headers_except");
|
41
|
+
});
|
42
|
+
|
43
|
+
test("invalid when using both response headers and headers_except", () => {
|
44
|
+
expect(() => {
|
45
|
+
RedactionItemsArray.parse([
|
46
|
+
{
|
47
|
+
response: {
|
48
|
+
headers: ["Content-Type"],
|
49
|
+
},
|
50
|
+
},
|
51
|
+
{
|
52
|
+
response: {
|
53
|
+
headers_except: ["Authorization"],
|
54
|
+
},
|
55
|
+
},
|
56
|
+
]);
|
57
|
+
}).toThrow("Cannot have both response headers and response headers_except");
|
58
|
+
});
|
59
|
+
|
60
|
+
test("invalid when using both request url_query and url_query_except", () => {
|
61
|
+
expect(() => {
|
62
|
+
RedactionItemsArray.parse([
|
63
|
+
{
|
64
|
+
request: {
|
65
|
+
url_query: ["page"],
|
66
|
+
},
|
67
|
+
},
|
68
|
+
{
|
69
|
+
request: {
|
70
|
+
url_query_except: ["limit"],
|
71
|
+
},
|
72
|
+
},
|
73
|
+
]);
|
74
|
+
}).toThrow(
|
75
|
+
"Cannot have both request url_query and request url_query_except",
|
76
|
+
);
|
77
|
+
});
|
78
|
+
|
79
|
+
test("invalid when using both response json_body and json_body_except", () => {
|
80
|
+
expect(() => {
|
81
|
+
RedactionItemsArray.parse([
|
82
|
+
{
|
83
|
+
response: {
|
84
|
+
json_body: ["data"],
|
85
|
+
},
|
86
|
+
},
|
87
|
+
{
|
88
|
+
response: {
|
89
|
+
json_body_except: ["metadata"],
|
90
|
+
},
|
91
|
+
},
|
92
|
+
]);
|
93
|
+
}).toThrow(
|
94
|
+
"Cannot have both response json_body and response json_body_except",
|
95
|
+
);
|
96
|
+
});
|
97
|
+
});
|
@@ -0,0 +1,201 @@
|
|
1
|
+
import { z } from "zod";
|
2
|
+
import type { WebProofStepNotarize, WebProverSessionConfig } from "./message";
|
3
|
+
export const RedactRequestHeadersSchema = z.object({
|
4
|
+
request: z.object({
|
5
|
+
headers: z.array(z.string()),
|
6
|
+
}),
|
7
|
+
});
|
8
|
+
|
9
|
+
export const RedactRequestHeadersExceptSchema = z.object({
|
10
|
+
request: z.object({
|
11
|
+
headers_except: z.array(z.string()),
|
12
|
+
}),
|
13
|
+
});
|
14
|
+
|
15
|
+
export const RedactRequestUrlQueryParamSchema = z.object({
|
16
|
+
request: z.object({
|
17
|
+
url_query: z.array(z.string()),
|
18
|
+
}),
|
19
|
+
});
|
20
|
+
|
21
|
+
export const RedactRequestUrlQueryParamExceptSchema = z.object({
|
22
|
+
request: z.object({
|
23
|
+
url_query_except: z.array(z.string()),
|
24
|
+
}),
|
25
|
+
});
|
26
|
+
|
27
|
+
export const RedactResponseHeadersSchema = z.object({
|
28
|
+
response: z.object({
|
29
|
+
headers: z.array(z.string()),
|
30
|
+
}),
|
31
|
+
});
|
32
|
+
|
33
|
+
export const RedactResponseHeadersExceptSchema = z.object({
|
34
|
+
response: z.object({
|
35
|
+
headers_except: z.array(z.string()),
|
36
|
+
}),
|
37
|
+
});
|
38
|
+
|
39
|
+
export const RedactResponseJsonBodySchema = z.object({
|
40
|
+
response: z.object({
|
41
|
+
json_body: z.array(z.string()),
|
42
|
+
}),
|
43
|
+
});
|
44
|
+
|
45
|
+
export const RedactResponseJsonBodyExceptSchema = z.object({
|
46
|
+
response: z.object({
|
47
|
+
json_body_except: z.array(z.string()),
|
48
|
+
}),
|
49
|
+
});
|
50
|
+
|
51
|
+
export const RedactionItemSchema = z.union([
|
52
|
+
RedactRequestHeadersSchema,
|
53
|
+
RedactRequestHeadersExceptSchema,
|
54
|
+
RedactRequestUrlQueryParamSchema,
|
55
|
+
RedactRequestUrlQueryParamExceptSchema,
|
56
|
+
RedactResponseHeadersSchema,
|
57
|
+
RedactResponseHeadersExceptSchema,
|
58
|
+
RedactResponseJsonBodySchema,
|
59
|
+
RedactResponseJsonBodyExceptSchema,
|
60
|
+
]);
|
61
|
+
|
62
|
+
export type RedactRequestHeadersExcept = z.infer<
|
63
|
+
typeof RedactRequestHeadersExceptSchema
|
64
|
+
>;
|
65
|
+
export type RedactRequestHeaders = z.infer<typeof RedactRequestHeadersSchema>;
|
66
|
+
|
67
|
+
export type RedactRequestUrlQueryParam = z.infer<
|
68
|
+
typeof RedactRequestUrlQueryParamSchema
|
69
|
+
>;
|
70
|
+
export type RedactRequestUrlQueryParamExcept = z.infer<
|
71
|
+
typeof RedactRequestUrlQueryParamExceptSchema
|
72
|
+
>;
|
73
|
+
export type RedactResponseHeaders = z.infer<typeof RedactResponseHeadersSchema>;
|
74
|
+
|
75
|
+
export type RedactResponseJsonBody = z.infer<
|
76
|
+
typeof RedactResponseJsonBodySchema
|
77
|
+
>;
|
78
|
+
export type RedactResponseJsonBodyExcept = z.infer<
|
79
|
+
typeof RedactResponseJsonBodyExceptSchema
|
80
|
+
>;
|
81
|
+
export type RedactResponseHeadersExcept = z.infer<
|
82
|
+
typeof RedactResponseHeadersExceptSchema
|
83
|
+
>;
|
84
|
+
|
85
|
+
export type RedactionItem = z.infer<typeof RedactionItemSchema>;
|
86
|
+
// Define the individual types
|
87
|
+
|
88
|
+
const checkConflictingItems =
|
89
|
+
(items: RedactionItem[]) =>
|
90
|
+
(
|
91
|
+
getFirstItem: (item: RedactionItem) => boolean,
|
92
|
+
getSecondItem: (item: RedactionItem) => boolean,
|
93
|
+
) => {
|
94
|
+
const hasFirst = items.some(getFirstItem);
|
95
|
+
const hasSecond = items.some(getSecondItem);
|
96
|
+
return !(hasFirst && hasSecond);
|
97
|
+
};
|
98
|
+
|
99
|
+
const ensureNoResponseHeadersConflict = (items: RedactionItem[]) => {
|
100
|
+
const hasResponseHeaders = (item: RedactionItem) =>
|
101
|
+
"response" in item &&
|
102
|
+
"headers" in item.response &&
|
103
|
+
item.response.headers.length > 0;
|
104
|
+
|
105
|
+
const hasResponseHeadersExcept = (item: RedactionItem) =>
|
106
|
+
"response" in item &&
|
107
|
+
"headers_except" in item.response &&
|
108
|
+
item.response.headers_except.length > 0;
|
109
|
+
|
110
|
+
return checkConflictingItems(items)(
|
111
|
+
hasResponseHeaders,
|
112
|
+
hasResponseHeadersExcept,
|
113
|
+
);
|
114
|
+
};
|
115
|
+
|
116
|
+
const ensureNoResponseJsonBodyConflict = (items: RedactionItem[]) => {
|
117
|
+
const hasResponseJsonBody = (item: RedactionItem) =>
|
118
|
+
"response" in item &&
|
119
|
+
"json_body" in item.response &&
|
120
|
+
item.response.json_body.length > 0;
|
121
|
+
|
122
|
+
const hasResponseJsonBodyExcept = (item: RedactionItem) =>
|
123
|
+
"response" in item &&
|
124
|
+
"json_body_except" in item.response &&
|
125
|
+
item.response.json_body_except.length > 0;
|
126
|
+
|
127
|
+
return checkConflictingItems(items)(
|
128
|
+
hasResponseJsonBody,
|
129
|
+
hasResponseJsonBodyExcept,
|
130
|
+
);
|
131
|
+
};
|
132
|
+
|
133
|
+
const ensureNoRequestHeadersConflict = (items: RedactionItem[]) => {
|
134
|
+
const hasRequestHeaders = (item: RedactionItem) =>
|
135
|
+
"request" in item &&
|
136
|
+
"headers" in item.request &&
|
137
|
+
item.request.headers.length > 0;
|
138
|
+
|
139
|
+
const hasRequestHeadersExcept = (item: RedactionItem) =>
|
140
|
+
"request" in item &&
|
141
|
+
"headers_except" in item.request &&
|
142
|
+
item.request.headers_except.length > 0;
|
143
|
+
|
144
|
+
return checkConflictingItems(items)(
|
145
|
+
hasRequestHeaders,
|
146
|
+
hasRequestHeadersExcept,
|
147
|
+
);
|
148
|
+
};
|
149
|
+
|
150
|
+
const ensureNoRequestUrlQueryParamConflict = (items: RedactionItem[]) => {
|
151
|
+
const hasRequestUrlQuery = (item: RedactionItem) =>
|
152
|
+
"request" in item &&
|
153
|
+
"url_query" in item.request &&
|
154
|
+
item.request.url_query.length > 0;
|
155
|
+
|
156
|
+
const hasRequestUrlQueryExcept = (item: RedactionItem) =>
|
157
|
+
"request" in item &&
|
158
|
+
"url_query_except" in item.request &&
|
159
|
+
item.request.url_query_except.length > 0;
|
160
|
+
|
161
|
+
return checkConflictingItems(items)(
|
162
|
+
hasRequestUrlQuery,
|
163
|
+
hasRequestUrlQueryExcept,
|
164
|
+
);
|
165
|
+
};
|
166
|
+
|
167
|
+
export const RedactionItemsArray = z
|
168
|
+
.array(RedactionItemSchema)
|
169
|
+
.refine(ensureNoResponseHeadersConflict, {
|
170
|
+
message: "Cannot have both response headers and response headers_except",
|
171
|
+
})
|
172
|
+
.refine(ensureNoResponseJsonBodyConflict, {
|
173
|
+
message:
|
174
|
+
"Cannot have both response json_body and response json_body_except",
|
175
|
+
})
|
176
|
+
.refine(ensureNoRequestHeadersConflict, {
|
177
|
+
message: "Cannot have both request headers and request headers_except",
|
178
|
+
})
|
179
|
+
.refine(ensureNoRequestUrlQueryParamConflict, {
|
180
|
+
message: "Cannot have both request url_query and request url_query_except",
|
181
|
+
})
|
182
|
+
.refine(ensureNoRequestUrlQueryParamConflict, {
|
183
|
+
message: "Cannot have both request url_query and request url_query_except",
|
184
|
+
});
|
185
|
+
|
186
|
+
export type RedactionItemsArray = z.infer<typeof RedactionItemsArray>;
|
187
|
+
|
188
|
+
export type RedactionConfig = RedactionItem[];
|
189
|
+
|
190
|
+
export function getRedactionConfig(
|
191
|
+
provingSessionConfig: WebProverSessionConfig,
|
192
|
+
): RedactionConfig {
|
193
|
+
const notarizeStep = provingSessionConfig.steps.find(
|
194
|
+
(step): step is WebProofStepNotarize => step.step === "notarize",
|
195
|
+
);
|
196
|
+
const redactionConfig =
|
197
|
+
notarizeStep !== undefined
|
198
|
+
? (notarizeStep as WebProofStepNotarize).redact
|
199
|
+
: [];
|
200
|
+
return redactionConfig;
|
201
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
type Brand<B> = { __brand: B };
|
2
|
+
export type Branded<T, B> = T & Brand<B>;
|
3
|
+
|
4
|
+
export function isDefined<T>(
|
5
|
+
value: T | undefined,
|
6
|
+
message: string = "Value is undefined",
|
7
|
+
): asserts value is T {
|
8
|
+
if (value === undefined) {
|
9
|
+
throw new Error(message);
|
10
|
+
}
|
11
|
+
}
|