@positronic/spec 0.0.71 → 0.0.72
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/dist/api/index.d.ts +1 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/store.d.ts +40 -0
- package/dist/api/store.d.ts.map +1 -0
- package/dist/api/store.js +244 -0
- package/dist/api/store.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/src/api/index.js +1 -0
- package/dist/src/api/store.js +743 -0
- package/dist/src/index.js +1 -1
- package/package.json +1 -1
package/dist/api/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export { bundle } from './bundle.js';
|
|
|
10
10
|
export { users } from './users.js';
|
|
11
11
|
export { auth } from './auth.js';
|
|
12
12
|
export { scoping } from './scoping.js';
|
|
13
|
+
export { store } from './store.js';
|
|
13
14
|
export type { User, UserKey } from './users.js';
|
|
14
15
|
export type { AuthSetupResponse } from './auth.js';
|
|
15
16
|
export type { Fetch, FetchFactory } from './types.js';
|
package/dist/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/api/index.js
CHANGED
package/dist/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Fetch, FetchFactory } from './types.js';
|
|
2
|
+
export declare const store: {
|
|
3
|
+
/**
|
|
4
|
+
* Test GET /store - List brains with store data
|
|
5
|
+
*/
|
|
6
|
+
listBrains(fetch: Fetch): Promise<boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Test GET /store/:brainTitle - List keys for a brain
|
|
9
|
+
*/
|
|
10
|
+
listKeys(fetch: Fetch, brainTitle: string): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Test GET /store/:brainTitle/shared/:key - Get shared key value
|
|
13
|
+
*/
|
|
14
|
+
getSharedValue(fetch: Fetch, brainTitle: string, key: string): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Test GET /store/:brainTitle/user/:key - Get per-user key value
|
|
17
|
+
*/
|
|
18
|
+
getUserValue(fetch: Fetch, brainTitle: string, key: string): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Test DELETE /store/:brainTitle/shared/:key - Delete shared key
|
|
21
|
+
*/
|
|
22
|
+
deleteSharedKey(fetch: Fetch, brainTitle: string, key: string): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* Test DELETE /store/:brainTitle/user/:key - Delete per-user key
|
|
25
|
+
*/
|
|
26
|
+
deleteUserKey(fetch: Fetch, brainTitle: string, key: string): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Test DELETE /store/:brainTitle - Clear all accessible keys for a brain
|
|
29
|
+
*/
|
|
30
|
+
clearBrainStore(fetch: Fetch, brainTitle: string): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Test that shared endpoints require root access - non-root gets 403
|
|
33
|
+
*/
|
|
34
|
+
sharedKeyRequiresRoot(fetchFactory: FetchFactory): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Test that userA cannot read userB's per-user keys
|
|
37
|
+
*/
|
|
38
|
+
userKeyIsolation(rootFetch: Fetch, fetchFactory: FetchFactory): Promise<boolean>;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/api/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,KAAK;IAChB;;OAEG;sBACqB,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAqChD;;OAEG;oBACmB,KAAK,cAAc,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiElE;;OAEG;0BAEM,KAAK,cACA,MAAM,OACb,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IA+CnB;;OAEG;wBAEM,KAAK,cACA,MAAM,OACb,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IAqDnB;;OAEG;2BAEM,KAAK,cACA,MAAM,OACb,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IA0BnB;;OAEG;yBAEM,KAAK,cACA,MAAM,OACb,MAAM,GACV,OAAO,CAAC,OAAO,CAAC;IA0BnB;;OAEG;2BAEM,KAAK,cACA,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC;IAmCnB;;OAEG;wCACuC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBzE;;OAEG;gCAEU,KAAK,gBACF,YAAY,GACzB,OAAO,CAAC,OAAO,CAAC;CA4BpB,CAAC"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
export const store = {
|
|
2
|
+
/**
|
|
3
|
+
* Test GET /store - List brains with store data
|
|
4
|
+
*/
|
|
5
|
+
async listBrains(fetch) {
|
|
6
|
+
try {
|
|
7
|
+
const request = new Request('http://example.com/store', {
|
|
8
|
+
method: 'GET',
|
|
9
|
+
});
|
|
10
|
+
const response = await fetch(request);
|
|
11
|
+
if (!response.ok) {
|
|
12
|
+
console.error(`GET /store returned ${response.status}`);
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const data = (await response.json());
|
|
16
|
+
if (!Array.isArray(data.brains)) {
|
|
17
|
+
console.error(`Expected brains to be an array, got ${typeof data.brains}`);
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
if (typeof data.count !== 'number') {
|
|
21
|
+
console.error(`Expected count to be number, got ${typeof data.count}`);
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
console.error(`Failed to test GET /store:`, error);
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
/**
|
|
32
|
+
* Test GET /store/:brainTitle - List keys for a brain
|
|
33
|
+
*/
|
|
34
|
+
async listKeys(fetch, brainTitle) {
|
|
35
|
+
try {
|
|
36
|
+
const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}`, { method: 'GET' });
|
|
37
|
+
const response = await fetch(request);
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
console.error(`GET /store/${brainTitle} returned ${response.status}`);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const data = (await response.json());
|
|
43
|
+
if (!Array.isArray(data.keys)) {
|
|
44
|
+
console.error(`Expected keys to be an array, got ${typeof data.keys}`);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
if (typeof data.count !== 'number') {
|
|
48
|
+
console.error(`Expected count to be number, got ${typeof data.count}`);
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
for (const entry of data.keys) {
|
|
52
|
+
if (typeof entry.key !== 'string') {
|
|
53
|
+
console.error(`Expected key to be string, got ${typeof entry.key}`);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if (entry.scope !== 'shared' && entry.scope !== 'user') {
|
|
57
|
+
console.error(`Expected scope to be 'shared' or 'user', got '${entry.scope}'`);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
if (typeof entry.size !== 'number') {
|
|
61
|
+
console.error(`Expected size to be number, got ${typeof entry.size}`);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (typeof entry.lastModified !== 'string') {
|
|
65
|
+
console.error(`Expected lastModified to be string, got ${typeof entry.lastModified}`);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error(`Failed to test GET /store/${brainTitle}:`, error);
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
/**
|
|
77
|
+
* Test GET /store/:brainTitle/shared/:key - Get shared key value
|
|
78
|
+
*/
|
|
79
|
+
async getSharedValue(fetch, brainTitle, key) {
|
|
80
|
+
try {
|
|
81
|
+
const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}/shared/${encodeURIComponent(key)}`, { method: 'GET' });
|
|
82
|
+
const response = await fetch(request);
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
console.error(`GET /store/${brainTitle}/shared/${key} returned ${response.status}`);
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
const data = (await response.json());
|
|
88
|
+
if (data.key !== key) {
|
|
89
|
+
console.error(`Expected key '${key}', got '${data.key}'`);
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
if (data.scope !== 'shared') {
|
|
93
|
+
console.error(`Expected scope 'shared', got '${data.scope}'`);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
if (data.value === undefined) {
|
|
97
|
+
console.error(`Expected value to be defined`);
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error(`Failed to test GET /store/${brainTitle}/shared/${key}:`, error);
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
/**
|
|
108
|
+
* Test GET /store/:brainTitle/user/:key - Get per-user key value
|
|
109
|
+
*/
|
|
110
|
+
async getUserValue(fetch, brainTitle, key) {
|
|
111
|
+
try {
|
|
112
|
+
const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}/user/${encodeURIComponent(key)}`, { method: 'GET' });
|
|
113
|
+
const response = await fetch(request);
|
|
114
|
+
if (!response.ok) {
|
|
115
|
+
console.error(`GET /store/${brainTitle}/user/${key} returned ${response.status}`);
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
const data = (await response.json());
|
|
119
|
+
if (data.key !== key) {
|
|
120
|
+
console.error(`Expected key '${key}', got '${data.key}'`);
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
if (data.scope !== 'user') {
|
|
124
|
+
console.error(`Expected scope 'user', got '${data.scope}'`);
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
if (typeof data.userId !== 'string') {
|
|
128
|
+
console.error(`Expected userId to be string, got ${typeof data.userId}`);
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
if (data.value === undefined) {
|
|
132
|
+
console.error(`Expected value to be defined`);
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
console.error(`Failed to test GET /store/${brainTitle}/user/${key}:`, error);
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
/**
|
|
143
|
+
* Test DELETE /store/:brainTitle/shared/:key - Delete shared key
|
|
144
|
+
*/
|
|
145
|
+
async deleteSharedKey(fetch, brainTitle, key) {
|
|
146
|
+
try {
|
|
147
|
+
const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}/shared/${encodeURIComponent(key)}`, { method: 'DELETE' });
|
|
148
|
+
const response = await fetch(request);
|
|
149
|
+
if (response.status !== 204) {
|
|
150
|
+
console.error(`DELETE /store/${brainTitle}/shared/${key} returned ${response.status}, expected 204`);
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.error(`Failed to test DELETE /store/${brainTitle}/shared/${key}:`, error);
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
/**
|
|
161
|
+
* Test DELETE /store/:brainTitle/user/:key - Delete per-user key
|
|
162
|
+
*/
|
|
163
|
+
async deleteUserKey(fetch, brainTitle, key) {
|
|
164
|
+
try {
|
|
165
|
+
const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}/user/${encodeURIComponent(key)}`, { method: 'DELETE' });
|
|
166
|
+
const response = await fetch(request);
|
|
167
|
+
if (response.status !== 204) {
|
|
168
|
+
console.error(`DELETE /store/${brainTitle}/user/${key} returned ${response.status}, expected 204`);
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
console.error(`Failed to test DELETE /store/${brainTitle}/user/${key}:`, error);
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
/**
|
|
179
|
+
* Test DELETE /store/:brainTitle - Clear all accessible keys for a brain
|
|
180
|
+
*/
|
|
181
|
+
async clearBrainStore(fetch, brainTitle) {
|
|
182
|
+
try {
|
|
183
|
+
const request = new Request(`http://example.com/store/${encodeURIComponent(brainTitle)}`, { method: 'DELETE' });
|
|
184
|
+
const response = await fetch(request);
|
|
185
|
+
if (!response.ok) {
|
|
186
|
+
console.error(`DELETE /store/${brainTitle} returned ${response.status}`);
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
const data = (await response.json());
|
|
190
|
+
if (typeof data.deleted !== 'number') {
|
|
191
|
+
console.error(`Expected deleted to be number, got ${typeof data.deleted}`);
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.error(`Failed to test DELETE /store/${brainTitle}:`, error);
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
/**
|
|
202
|
+
* Test that shared endpoints require root access - non-root gets 403
|
|
203
|
+
*/
|
|
204
|
+
async sharedKeyRequiresRoot(fetchFactory) {
|
|
205
|
+
try {
|
|
206
|
+
const { fetch: userFetch } = await fetchFactory('non-root-user');
|
|
207
|
+
const request = new Request('http://example.com/store/test-brain/shared/test-key', { method: 'GET' });
|
|
208
|
+
const response = await userFetch(request);
|
|
209
|
+
if (response.status !== 403) {
|
|
210
|
+
console.error(`Expected 403 for non-root shared key access, got ${response.status}`);
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
console.error(`Failed to test shared key root requirement:`, error);
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
/**
|
|
221
|
+
* Test that userA cannot read userB's per-user keys
|
|
222
|
+
*/
|
|
223
|
+
async userKeyIsolation(rootFetch, fetchFactory) {
|
|
224
|
+
try {
|
|
225
|
+
// Get userA's fetch
|
|
226
|
+
const { fetch: userAFetch, userId: userAId } = await fetchFactory('userA');
|
|
227
|
+
// Try to access userA's key with userA's credentials - should work
|
|
228
|
+
const request = new Request('http://example.com/store/test-brain/user/test-key', { method: 'GET' });
|
|
229
|
+
const response = await userAFetch(request);
|
|
230
|
+
// If the key doesn't exist, we'd get 404, which is fine for isolation testing
|
|
231
|
+
// We're testing that the endpoint doesn't return 403 for the user's own data
|
|
232
|
+
if (response.status === 403) {
|
|
233
|
+
console.error(`User should be able to access their own per-user keys, got 403`);
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
console.error(`Failed to test user key isolation:`, error);
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/api/store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -119,6 +119,6 @@ export interface PositronicDevServer {
|
|
|
119
119
|
*/
|
|
120
120
|
bulkSecrets(filePath: string): Promise<void>;
|
|
121
121
|
}
|
|
122
|
-
export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping } from './api/index.js';
|
|
122
|
+
export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping, store } from './api/index.js';
|
|
123
123
|
export type { AuthSetupResponse, Fetch, FetchFactory } from './api/index.js';
|
|
124
124
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAExD;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAEhD;;;;OAIG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB;;;;OAIG;IACH,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtD;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5C;;;;;OAKG;IACH,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAEjD;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAEnD;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAErD;;;OAGG;IACH,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IAErF;;;;OAIG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD;;;;OAIG;IACH,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAExD;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAEhD;;;;OAIG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB;;;;OAIG;IACH,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtD;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5C;;;;;OAKG;IACH,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAEjD;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAEnD;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAErD;;;OAGG;IACH,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IAErF;;;;OAIG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD;;;;OAIG;IACH,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC3I,YAAY,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
* Currently includes the PositronicDevServer interface.
|
|
10
10
|
* Future additions will include REST API specifications and tests.
|
|
11
11
|
*/
|
|
12
|
-
export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping } from './api/index.js';
|
|
12
|
+
export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping, store } from './api/index.js';
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6HH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6HH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/src/api/index.js
CHANGED
|
@@ -0,0 +1,743 @@
|
|
|
1
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
2
|
+
try {
|
|
3
|
+
var info = gen[key](arg);
|
|
4
|
+
var value = info.value;
|
|
5
|
+
} catch (error) {
|
|
6
|
+
reject(error);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (info.done) {
|
|
10
|
+
resolve(value);
|
|
11
|
+
} else {
|
|
12
|
+
Promise.resolve(value).then(_next, _throw);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function _async_to_generator(fn) {
|
|
16
|
+
return function() {
|
|
17
|
+
var self = this, args = arguments;
|
|
18
|
+
return new Promise(function(resolve, reject) {
|
|
19
|
+
var gen = fn.apply(self, args);
|
|
20
|
+
function _next(value) {
|
|
21
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
22
|
+
}
|
|
23
|
+
function _throw(err) {
|
|
24
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
25
|
+
}
|
|
26
|
+
_next(undefined);
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function _type_of(obj) {
|
|
31
|
+
"@swc/helpers - typeof";
|
|
32
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
33
|
+
}
|
|
34
|
+
function _ts_generator(thisArg, body) {
|
|
35
|
+
var f, y, t, _ = {
|
|
36
|
+
label: 0,
|
|
37
|
+
sent: function() {
|
|
38
|
+
if (t[0] & 1) throw t[1];
|
|
39
|
+
return t[1];
|
|
40
|
+
},
|
|
41
|
+
trys: [],
|
|
42
|
+
ops: []
|
|
43
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
44
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
45
|
+
return this;
|
|
46
|
+
}), g;
|
|
47
|
+
function verb(n) {
|
|
48
|
+
return function(v) {
|
|
49
|
+
return step([
|
|
50
|
+
n,
|
|
51
|
+
v
|
|
52
|
+
]);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function step(op) {
|
|
56
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
57
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
58
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
59
|
+
if (y = 0, t) op = [
|
|
60
|
+
op[0] & 2,
|
|
61
|
+
t.value
|
|
62
|
+
];
|
|
63
|
+
switch(op[0]){
|
|
64
|
+
case 0:
|
|
65
|
+
case 1:
|
|
66
|
+
t = op;
|
|
67
|
+
break;
|
|
68
|
+
case 4:
|
|
69
|
+
_.label++;
|
|
70
|
+
return {
|
|
71
|
+
value: op[1],
|
|
72
|
+
done: false
|
|
73
|
+
};
|
|
74
|
+
case 5:
|
|
75
|
+
_.label++;
|
|
76
|
+
y = op[1];
|
|
77
|
+
op = [
|
|
78
|
+
0
|
|
79
|
+
];
|
|
80
|
+
continue;
|
|
81
|
+
case 7:
|
|
82
|
+
op = _.ops.pop();
|
|
83
|
+
_.trys.pop();
|
|
84
|
+
continue;
|
|
85
|
+
default:
|
|
86
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
87
|
+
_ = 0;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
91
|
+
_.label = op[1];
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
95
|
+
_.label = t[1];
|
|
96
|
+
t = op;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
if (t && _.label < t[2]) {
|
|
100
|
+
_.label = t[2];
|
|
101
|
+
_.ops.push(op);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
if (t[2]) _.ops.pop();
|
|
105
|
+
_.trys.pop();
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
op = body.call(thisArg, _);
|
|
109
|
+
} catch (e) {
|
|
110
|
+
op = [
|
|
111
|
+
6,
|
|
112
|
+
e
|
|
113
|
+
];
|
|
114
|
+
y = 0;
|
|
115
|
+
} finally{
|
|
116
|
+
f = t = 0;
|
|
117
|
+
}
|
|
118
|
+
if (op[0] & 5) throw op[1];
|
|
119
|
+
return {
|
|
120
|
+
value: op[0] ? op[1] : void 0,
|
|
121
|
+
done: true
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export var store = {
|
|
126
|
+
listBrains: /**
|
|
127
|
+
* Test GET /store - List brains with store data
|
|
128
|
+
*/ function listBrains(fetch) {
|
|
129
|
+
return _async_to_generator(function() {
|
|
130
|
+
var request, response, data, error;
|
|
131
|
+
return _ts_generator(this, function(_state) {
|
|
132
|
+
switch(_state.label){
|
|
133
|
+
case 0:
|
|
134
|
+
_state.trys.push([
|
|
135
|
+
0,
|
|
136
|
+
3,
|
|
137
|
+
,
|
|
138
|
+
4
|
|
139
|
+
]);
|
|
140
|
+
request = new Request('http://example.com/store', {
|
|
141
|
+
method: 'GET'
|
|
142
|
+
});
|
|
143
|
+
return [
|
|
144
|
+
4,
|
|
145
|
+
fetch(request)
|
|
146
|
+
];
|
|
147
|
+
case 1:
|
|
148
|
+
response = _state.sent();
|
|
149
|
+
if (!response.ok) {
|
|
150
|
+
console.error("GET /store returned ".concat(response.status));
|
|
151
|
+
return [
|
|
152
|
+
2,
|
|
153
|
+
false
|
|
154
|
+
];
|
|
155
|
+
}
|
|
156
|
+
return [
|
|
157
|
+
4,
|
|
158
|
+
response.json()
|
|
159
|
+
];
|
|
160
|
+
case 2:
|
|
161
|
+
data = _state.sent();
|
|
162
|
+
if (!Array.isArray(data.brains)) {
|
|
163
|
+
console.error("Expected brains to be an array, got ".concat(_type_of(data.brains)));
|
|
164
|
+
return [
|
|
165
|
+
2,
|
|
166
|
+
false
|
|
167
|
+
];
|
|
168
|
+
}
|
|
169
|
+
if (typeof data.count !== 'number') {
|
|
170
|
+
console.error("Expected count to be number, got ".concat(_type_of(data.count)));
|
|
171
|
+
return [
|
|
172
|
+
2,
|
|
173
|
+
false
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
return [
|
|
177
|
+
2,
|
|
178
|
+
true
|
|
179
|
+
];
|
|
180
|
+
case 3:
|
|
181
|
+
error = _state.sent();
|
|
182
|
+
console.error("Failed to test GET /store:", error);
|
|
183
|
+
return [
|
|
184
|
+
2,
|
|
185
|
+
false
|
|
186
|
+
];
|
|
187
|
+
case 4:
|
|
188
|
+
return [
|
|
189
|
+
2
|
|
190
|
+
];
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
})();
|
|
194
|
+
},
|
|
195
|
+
listKeys: /**
|
|
196
|
+
* Test GET /store/:brainTitle - List keys for a brain
|
|
197
|
+
*/ function listKeys(fetch, brainTitle) {
|
|
198
|
+
return _async_to_generator(function() {
|
|
199
|
+
var request, response, data, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, entry, error;
|
|
200
|
+
return _ts_generator(this, function(_state) {
|
|
201
|
+
switch(_state.label){
|
|
202
|
+
case 0:
|
|
203
|
+
_state.trys.push([
|
|
204
|
+
0,
|
|
205
|
+
3,
|
|
206
|
+
,
|
|
207
|
+
4
|
|
208
|
+
]);
|
|
209
|
+
request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle)), {
|
|
210
|
+
method: 'GET'
|
|
211
|
+
});
|
|
212
|
+
return [
|
|
213
|
+
4,
|
|
214
|
+
fetch(request)
|
|
215
|
+
];
|
|
216
|
+
case 1:
|
|
217
|
+
response = _state.sent();
|
|
218
|
+
if (!response.ok) {
|
|
219
|
+
console.error("GET /store/".concat(brainTitle, " returned ").concat(response.status));
|
|
220
|
+
return [
|
|
221
|
+
2,
|
|
222
|
+
false
|
|
223
|
+
];
|
|
224
|
+
}
|
|
225
|
+
return [
|
|
226
|
+
4,
|
|
227
|
+
response.json()
|
|
228
|
+
];
|
|
229
|
+
case 2:
|
|
230
|
+
data = _state.sent();
|
|
231
|
+
if (!Array.isArray(data.keys)) {
|
|
232
|
+
console.error("Expected keys to be an array, got ".concat(_type_of(data.keys)));
|
|
233
|
+
return [
|
|
234
|
+
2,
|
|
235
|
+
false
|
|
236
|
+
];
|
|
237
|
+
}
|
|
238
|
+
if (typeof data.count !== 'number') {
|
|
239
|
+
console.error("Expected count to be number, got ".concat(_type_of(data.count)));
|
|
240
|
+
return [
|
|
241
|
+
2,
|
|
242
|
+
false
|
|
243
|
+
];
|
|
244
|
+
}
|
|
245
|
+
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
246
|
+
try {
|
|
247
|
+
for(_iterator = data.keys[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
248
|
+
entry = _step.value;
|
|
249
|
+
if (typeof entry.key !== 'string') {
|
|
250
|
+
console.error("Expected key to be string, got ".concat(_type_of(entry.key)));
|
|
251
|
+
return [
|
|
252
|
+
2,
|
|
253
|
+
false
|
|
254
|
+
];
|
|
255
|
+
}
|
|
256
|
+
if (entry.scope !== 'shared' && entry.scope !== 'user') {
|
|
257
|
+
console.error("Expected scope to be 'shared' or 'user', got '".concat(entry.scope, "'"));
|
|
258
|
+
return [
|
|
259
|
+
2,
|
|
260
|
+
false
|
|
261
|
+
];
|
|
262
|
+
}
|
|
263
|
+
if (typeof entry.size !== 'number') {
|
|
264
|
+
console.error("Expected size to be number, got ".concat(_type_of(entry.size)));
|
|
265
|
+
return [
|
|
266
|
+
2,
|
|
267
|
+
false
|
|
268
|
+
];
|
|
269
|
+
}
|
|
270
|
+
if (typeof entry.lastModified !== 'string') {
|
|
271
|
+
console.error("Expected lastModified to be string, got ".concat(_type_of(entry.lastModified)));
|
|
272
|
+
return [
|
|
273
|
+
2,
|
|
274
|
+
false
|
|
275
|
+
];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
} catch (err) {
|
|
279
|
+
_didIteratorError = true;
|
|
280
|
+
_iteratorError = err;
|
|
281
|
+
} finally{
|
|
282
|
+
try {
|
|
283
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
284
|
+
_iterator.return();
|
|
285
|
+
}
|
|
286
|
+
} finally{
|
|
287
|
+
if (_didIteratorError) {
|
|
288
|
+
throw _iteratorError;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return [
|
|
293
|
+
2,
|
|
294
|
+
true
|
|
295
|
+
];
|
|
296
|
+
case 3:
|
|
297
|
+
error = _state.sent();
|
|
298
|
+
console.error("Failed to test GET /store/".concat(brainTitle, ":"), error);
|
|
299
|
+
return [
|
|
300
|
+
2,
|
|
301
|
+
false
|
|
302
|
+
];
|
|
303
|
+
case 4:
|
|
304
|
+
return [
|
|
305
|
+
2
|
|
306
|
+
];
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
})();
|
|
310
|
+
},
|
|
311
|
+
getSharedValue: /**
|
|
312
|
+
* Test GET /store/:brainTitle/shared/:key - Get shared key value
|
|
313
|
+
*/ function getSharedValue(fetch, brainTitle, key) {
|
|
314
|
+
return _async_to_generator(function() {
|
|
315
|
+
var request, response, data, error;
|
|
316
|
+
return _ts_generator(this, function(_state) {
|
|
317
|
+
switch(_state.label){
|
|
318
|
+
case 0:
|
|
319
|
+
_state.trys.push([
|
|
320
|
+
0,
|
|
321
|
+
3,
|
|
322
|
+
,
|
|
323
|
+
4
|
|
324
|
+
]);
|
|
325
|
+
request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle), "/shared/").concat(encodeURIComponent(key)), {
|
|
326
|
+
method: 'GET'
|
|
327
|
+
});
|
|
328
|
+
return [
|
|
329
|
+
4,
|
|
330
|
+
fetch(request)
|
|
331
|
+
];
|
|
332
|
+
case 1:
|
|
333
|
+
response = _state.sent();
|
|
334
|
+
if (!response.ok) {
|
|
335
|
+
console.error("GET /store/".concat(brainTitle, "/shared/").concat(key, " returned ").concat(response.status));
|
|
336
|
+
return [
|
|
337
|
+
2,
|
|
338
|
+
false
|
|
339
|
+
];
|
|
340
|
+
}
|
|
341
|
+
return [
|
|
342
|
+
4,
|
|
343
|
+
response.json()
|
|
344
|
+
];
|
|
345
|
+
case 2:
|
|
346
|
+
data = _state.sent();
|
|
347
|
+
if (data.key !== key) {
|
|
348
|
+
console.error("Expected key '".concat(key, "', got '").concat(data.key, "'"));
|
|
349
|
+
return [
|
|
350
|
+
2,
|
|
351
|
+
false
|
|
352
|
+
];
|
|
353
|
+
}
|
|
354
|
+
if (data.scope !== 'shared') {
|
|
355
|
+
console.error("Expected scope 'shared', got '".concat(data.scope, "'"));
|
|
356
|
+
return [
|
|
357
|
+
2,
|
|
358
|
+
false
|
|
359
|
+
];
|
|
360
|
+
}
|
|
361
|
+
if (data.value === undefined) {
|
|
362
|
+
console.error("Expected value to be defined");
|
|
363
|
+
return [
|
|
364
|
+
2,
|
|
365
|
+
false
|
|
366
|
+
];
|
|
367
|
+
}
|
|
368
|
+
return [
|
|
369
|
+
2,
|
|
370
|
+
true
|
|
371
|
+
];
|
|
372
|
+
case 3:
|
|
373
|
+
error = _state.sent();
|
|
374
|
+
console.error("Failed to test GET /store/".concat(brainTitle, "/shared/").concat(key, ":"), error);
|
|
375
|
+
return [
|
|
376
|
+
2,
|
|
377
|
+
false
|
|
378
|
+
];
|
|
379
|
+
case 4:
|
|
380
|
+
return [
|
|
381
|
+
2
|
|
382
|
+
];
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
})();
|
|
386
|
+
},
|
|
387
|
+
getUserValue: /**
|
|
388
|
+
* Test GET /store/:brainTitle/user/:key - Get per-user key value
|
|
389
|
+
*/ function getUserValue(fetch, brainTitle, key) {
|
|
390
|
+
return _async_to_generator(function() {
|
|
391
|
+
var request, response, data, error;
|
|
392
|
+
return _ts_generator(this, function(_state) {
|
|
393
|
+
switch(_state.label){
|
|
394
|
+
case 0:
|
|
395
|
+
_state.trys.push([
|
|
396
|
+
0,
|
|
397
|
+
3,
|
|
398
|
+
,
|
|
399
|
+
4
|
|
400
|
+
]);
|
|
401
|
+
request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle), "/user/").concat(encodeURIComponent(key)), {
|
|
402
|
+
method: 'GET'
|
|
403
|
+
});
|
|
404
|
+
return [
|
|
405
|
+
4,
|
|
406
|
+
fetch(request)
|
|
407
|
+
];
|
|
408
|
+
case 1:
|
|
409
|
+
response = _state.sent();
|
|
410
|
+
if (!response.ok) {
|
|
411
|
+
console.error("GET /store/".concat(brainTitle, "/user/").concat(key, " returned ").concat(response.status));
|
|
412
|
+
return [
|
|
413
|
+
2,
|
|
414
|
+
false
|
|
415
|
+
];
|
|
416
|
+
}
|
|
417
|
+
return [
|
|
418
|
+
4,
|
|
419
|
+
response.json()
|
|
420
|
+
];
|
|
421
|
+
case 2:
|
|
422
|
+
data = _state.sent();
|
|
423
|
+
if (data.key !== key) {
|
|
424
|
+
console.error("Expected key '".concat(key, "', got '").concat(data.key, "'"));
|
|
425
|
+
return [
|
|
426
|
+
2,
|
|
427
|
+
false
|
|
428
|
+
];
|
|
429
|
+
}
|
|
430
|
+
if (data.scope !== 'user') {
|
|
431
|
+
console.error("Expected scope 'user', got '".concat(data.scope, "'"));
|
|
432
|
+
return [
|
|
433
|
+
2,
|
|
434
|
+
false
|
|
435
|
+
];
|
|
436
|
+
}
|
|
437
|
+
if (typeof data.userId !== 'string') {
|
|
438
|
+
console.error("Expected userId to be string, got ".concat(_type_of(data.userId)));
|
|
439
|
+
return [
|
|
440
|
+
2,
|
|
441
|
+
false
|
|
442
|
+
];
|
|
443
|
+
}
|
|
444
|
+
if (data.value === undefined) {
|
|
445
|
+
console.error("Expected value to be defined");
|
|
446
|
+
return [
|
|
447
|
+
2,
|
|
448
|
+
false
|
|
449
|
+
];
|
|
450
|
+
}
|
|
451
|
+
return [
|
|
452
|
+
2,
|
|
453
|
+
true
|
|
454
|
+
];
|
|
455
|
+
case 3:
|
|
456
|
+
error = _state.sent();
|
|
457
|
+
console.error("Failed to test GET /store/".concat(brainTitle, "/user/").concat(key, ":"), error);
|
|
458
|
+
return [
|
|
459
|
+
2,
|
|
460
|
+
false
|
|
461
|
+
];
|
|
462
|
+
case 4:
|
|
463
|
+
return [
|
|
464
|
+
2
|
|
465
|
+
];
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
})();
|
|
469
|
+
},
|
|
470
|
+
deleteSharedKey: /**
|
|
471
|
+
* Test DELETE /store/:brainTitle/shared/:key - Delete shared key
|
|
472
|
+
*/ function deleteSharedKey(fetch, brainTitle, key) {
|
|
473
|
+
return _async_to_generator(function() {
|
|
474
|
+
var request, response, error;
|
|
475
|
+
return _ts_generator(this, function(_state) {
|
|
476
|
+
switch(_state.label){
|
|
477
|
+
case 0:
|
|
478
|
+
_state.trys.push([
|
|
479
|
+
0,
|
|
480
|
+
2,
|
|
481
|
+
,
|
|
482
|
+
3
|
|
483
|
+
]);
|
|
484
|
+
request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle), "/shared/").concat(encodeURIComponent(key)), {
|
|
485
|
+
method: 'DELETE'
|
|
486
|
+
});
|
|
487
|
+
return [
|
|
488
|
+
4,
|
|
489
|
+
fetch(request)
|
|
490
|
+
];
|
|
491
|
+
case 1:
|
|
492
|
+
response = _state.sent();
|
|
493
|
+
if (response.status !== 204) {
|
|
494
|
+
console.error("DELETE /store/".concat(brainTitle, "/shared/").concat(key, " returned ").concat(response.status, ", expected 204"));
|
|
495
|
+
return [
|
|
496
|
+
2,
|
|
497
|
+
false
|
|
498
|
+
];
|
|
499
|
+
}
|
|
500
|
+
return [
|
|
501
|
+
2,
|
|
502
|
+
true
|
|
503
|
+
];
|
|
504
|
+
case 2:
|
|
505
|
+
error = _state.sent();
|
|
506
|
+
console.error("Failed to test DELETE /store/".concat(brainTitle, "/shared/").concat(key, ":"), error);
|
|
507
|
+
return [
|
|
508
|
+
2,
|
|
509
|
+
false
|
|
510
|
+
];
|
|
511
|
+
case 3:
|
|
512
|
+
return [
|
|
513
|
+
2
|
|
514
|
+
];
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
})();
|
|
518
|
+
},
|
|
519
|
+
deleteUserKey: /**
|
|
520
|
+
* Test DELETE /store/:brainTitle/user/:key - Delete per-user key
|
|
521
|
+
*/ function deleteUserKey(fetch, brainTitle, key) {
|
|
522
|
+
return _async_to_generator(function() {
|
|
523
|
+
var request, response, error;
|
|
524
|
+
return _ts_generator(this, function(_state) {
|
|
525
|
+
switch(_state.label){
|
|
526
|
+
case 0:
|
|
527
|
+
_state.trys.push([
|
|
528
|
+
0,
|
|
529
|
+
2,
|
|
530
|
+
,
|
|
531
|
+
3
|
|
532
|
+
]);
|
|
533
|
+
request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle), "/user/").concat(encodeURIComponent(key)), {
|
|
534
|
+
method: 'DELETE'
|
|
535
|
+
});
|
|
536
|
+
return [
|
|
537
|
+
4,
|
|
538
|
+
fetch(request)
|
|
539
|
+
];
|
|
540
|
+
case 1:
|
|
541
|
+
response = _state.sent();
|
|
542
|
+
if (response.status !== 204) {
|
|
543
|
+
console.error("DELETE /store/".concat(brainTitle, "/user/").concat(key, " returned ").concat(response.status, ", expected 204"));
|
|
544
|
+
return [
|
|
545
|
+
2,
|
|
546
|
+
false
|
|
547
|
+
];
|
|
548
|
+
}
|
|
549
|
+
return [
|
|
550
|
+
2,
|
|
551
|
+
true
|
|
552
|
+
];
|
|
553
|
+
case 2:
|
|
554
|
+
error = _state.sent();
|
|
555
|
+
console.error("Failed to test DELETE /store/".concat(brainTitle, "/user/").concat(key, ":"), error);
|
|
556
|
+
return [
|
|
557
|
+
2,
|
|
558
|
+
false
|
|
559
|
+
];
|
|
560
|
+
case 3:
|
|
561
|
+
return [
|
|
562
|
+
2
|
|
563
|
+
];
|
|
564
|
+
}
|
|
565
|
+
});
|
|
566
|
+
})();
|
|
567
|
+
},
|
|
568
|
+
clearBrainStore: /**
|
|
569
|
+
* Test DELETE /store/:brainTitle - Clear all accessible keys for a brain
|
|
570
|
+
*/ function clearBrainStore(fetch, brainTitle) {
|
|
571
|
+
return _async_to_generator(function() {
|
|
572
|
+
var request, response, data, error;
|
|
573
|
+
return _ts_generator(this, function(_state) {
|
|
574
|
+
switch(_state.label){
|
|
575
|
+
case 0:
|
|
576
|
+
_state.trys.push([
|
|
577
|
+
0,
|
|
578
|
+
3,
|
|
579
|
+
,
|
|
580
|
+
4
|
|
581
|
+
]);
|
|
582
|
+
request = new Request("http://example.com/store/".concat(encodeURIComponent(brainTitle)), {
|
|
583
|
+
method: 'DELETE'
|
|
584
|
+
});
|
|
585
|
+
return [
|
|
586
|
+
4,
|
|
587
|
+
fetch(request)
|
|
588
|
+
];
|
|
589
|
+
case 1:
|
|
590
|
+
response = _state.sent();
|
|
591
|
+
if (!response.ok) {
|
|
592
|
+
console.error("DELETE /store/".concat(brainTitle, " returned ").concat(response.status));
|
|
593
|
+
return [
|
|
594
|
+
2,
|
|
595
|
+
false
|
|
596
|
+
];
|
|
597
|
+
}
|
|
598
|
+
return [
|
|
599
|
+
4,
|
|
600
|
+
response.json()
|
|
601
|
+
];
|
|
602
|
+
case 2:
|
|
603
|
+
data = _state.sent();
|
|
604
|
+
if (typeof data.deleted !== 'number') {
|
|
605
|
+
console.error("Expected deleted to be number, got ".concat(_type_of(data.deleted)));
|
|
606
|
+
return [
|
|
607
|
+
2,
|
|
608
|
+
false
|
|
609
|
+
];
|
|
610
|
+
}
|
|
611
|
+
return [
|
|
612
|
+
2,
|
|
613
|
+
true
|
|
614
|
+
];
|
|
615
|
+
case 3:
|
|
616
|
+
error = _state.sent();
|
|
617
|
+
console.error("Failed to test DELETE /store/".concat(brainTitle, ":"), error);
|
|
618
|
+
return [
|
|
619
|
+
2,
|
|
620
|
+
false
|
|
621
|
+
];
|
|
622
|
+
case 4:
|
|
623
|
+
return [
|
|
624
|
+
2
|
|
625
|
+
];
|
|
626
|
+
}
|
|
627
|
+
});
|
|
628
|
+
})();
|
|
629
|
+
},
|
|
630
|
+
sharedKeyRequiresRoot: /**
|
|
631
|
+
* Test that shared endpoints require root access - non-root gets 403
|
|
632
|
+
*/ function sharedKeyRequiresRoot(fetchFactory) {
|
|
633
|
+
return _async_to_generator(function() {
|
|
634
|
+
var _ref, userFetch, request, response, error;
|
|
635
|
+
return _ts_generator(this, function(_state) {
|
|
636
|
+
switch(_state.label){
|
|
637
|
+
case 0:
|
|
638
|
+
_state.trys.push([
|
|
639
|
+
0,
|
|
640
|
+
3,
|
|
641
|
+
,
|
|
642
|
+
4
|
|
643
|
+
]);
|
|
644
|
+
return [
|
|
645
|
+
4,
|
|
646
|
+
fetchFactory('non-root-user')
|
|
647
|
+
];
|
|
648
|
+
case 1:
|
|
649
|
+
_ref = _state.sent(), userFetch = _ref.fetch;
|
|
650
|
+
request = new Request('http://example.com/store/test-brain/shared/test-key', {
|
|
651
|
+
method: 'GET'
|
|
652
|
+
});
|
|
653
|
+
return [
|
|
654
|
+
4,
|
|
655
|
+
userFetch(request)
|
|
656
|
+
];
|
|
657
|
+
case 2:
|
|
658
|
+
response = _state.sent();
|
|
659
|
+
if (response.status !== 403) {
|
|
660
|
+
console.error("Expected 403 for non-root shared key access, got ".concat(response.status));
|
|
661
|
+
return [
|
|
662
|
+
2,
|
|
663
|
+
false
|
|
664
|
+
];
|
|
665
|
+
}
|
|
666
|
+
return [
|
|
667
|
+
2,
|
|
668
|
+
true
|
|
669
|
+
];
|
|
670
|
+
case 3:
|
|
671
|
+
error = _state.sent();
|
|
672
|
+
console.error("Failed to test shared key root requirement:", error);
|
|
673
|
+
return [
|
|
674
|
+
2,
|
|
675
|
+
false
|
|
676
|
+
];
|
|
677
|
+
case 4:
|
|
678
|
+
return [
|
|
679
|
+
2
|
|
680
|
+
];
|
|
681
|
+
}
|
|
682
|
+
});
|
|
683
|
+
})();
|
|
684
|
+
},
|
|
685
|
+
userKeyIsolation: /**
|
|
686
|
+
* Test that userA cannot read userB's per-user keys
|
|
687
|
+
*/ function userKeyIsolation(rootFetch, fetchFactory) {
|
|
688
|
+
return _async_to_generator(function() {
|
|
689
|
+
var _ref, userAFetch, userAId, request, response, error;
|
|
690
|
+
return _ts_generator(this, function(_state) {
|
|
691
|
+
switch(_state.label){
|
|
692
|
+
case 0:
|
|
693
|
+
_state.trys.push([
|
|
694
|
+
0,
|
|
695
|
+
3,
|
|
696
|
+
,
|
|
697
|
+
4
|
|
698
|
+
]);
|
|
699
|
+
return [
|
|
700
|
+
4,
|
|
701
|
+
fetchFactory('userA')
|
|
702
|
+
];
|
|
703
|
+
case 1:
|
|
704
|
+
_ref = _state.sent(), userAFetch = _ref.fetch, userAId = _ref.userId;
|
|
705
|
+
// Try to access userA's key with userA's credentials - should work
|
|
706
|
+
request = new Request('http://example.com/store/test-brain/user/test-key', {
|
|
707
|
+
method: 'GET'
|
|
708
|
+
});
|
|
709
|
+
return [
|
|
710
|
+
4,
|
|
711
|
+
userAFetch(request)
|
|
712
|
+
];
|
|
713
|
+
case 2:
|
|
714
|
+
response = _state.sent();
|
|
715
|
+
// If the key doesn't exist, we'd get 404, which is fine for isolation testing
|
|
716
|
+
// We're testing that the endpoint doesn't return 403 for the user's own data
|
|
717
|
+
if (response.status === 403) {
|
|
718
|
+
console.error("User should be able to access their own per-user keys, got 403");
|
|
719
|
+
return [
|
|
720
|
+
2,
|
|
721
|
+
false
|
|
722
|
+
];
|
|
723
|
+
}
|
|
724
|
+
return [
|
|
725
|
+
2,
|
|
726
|
+
true
|
|
727
|
+
];
|
|
728
|
+
case 3:
|
|
729
|
+
error = _state.sent();
|
|
730
|
+
console.error("Failed to test user key isolation:", error);
|
|
731
|
+
return [
|
|
732
|
+
2,
|
|
733
|
+
false
|
|
734
|
+
];
|
|
735
|
+
case 4:
|
|
736
|
+
return [
|
|
737
|
+
2
|
|
738
|
+
];
|
|
739
|
+
}
|
|
740
|
+
});
|
|
741
|
+
})();
|
|
742
|
+
}
|
|
743
|
+
};
|
package/dist/src/index.js
CHANGED
|
@@ -13,4 +13,4 @@
|
|
|
13
13
|
*
|
|
14
14
|
* This interface provides lifecycle management for a server instance,
|
|
15
15
|
* abstracting away the underlying implementation details (process, worker, etc.)
|
|
16
|
-
*/ export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping } from './api/index.js';
|
|
16
|
+
*/ export { testStatus, resources, brains, schedules, secrets, webhooks, signals, pages, bundle, auth, scoping, store } from './api/index.js';
|