@modelprofile.com/browser-runtime 1.0.0
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/.smartconfig.json +34 -0
- package/changelog.md +11 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/actions.d.ts +3 -0
- package/dist_ts/actions.js +215 -0
- package/dist_ts/classes.artifactstore.d.ts +38 -0
- package/dist_ts/classes.artifactstore.js +344 -0
- package/dist_ts/classes.egressproxy.d.ts +67 -0
- package/dist_ts/classes.egressproxy.js +830 -0
- package/dist_ts/classes.flexprovider.d.ts +9 -0
- package/dist_ts/classes.flexprovider.js +117 -0
- package/dist_ts/classes.framed.d.ts +52 -0
- package/dist_ts/classes.framed.js +557 -0
- package/dist_ts/classes.runtime.d.ts +202 -0
- package/dist_ts/classes.runtime.js +1667 -0
- package/dist_ts/confinement.d.ts +2 -0
- package/dist_ts/confinement.js +63 -0
- package/dist_ts/errors.d.ts +7 -0
- package/dist_ts/errors.js +40 -0
- package/dist_ts/index.d.ts +11 -0
- package/dist_ts/index.js +9 -0
- package/dist_ts/interfaces.d.ts +287 -0
- package/dist_ts/interfaces.js +2 -0
- package/dist_ts/internal.testing.d.ts +9 -0
- package/dist_ts/internal.testing.js +2 -0
- package/dist_ts/mcp.d.ts +4 -0
- package/dist_ts/mcp.js +196 -0
- package/dist_ts/plugins.d.ts +20 -0
- package/dist_ts/plugins.js +24 -0
- package/dist_ts/utils.d.ts +25 -0
- package/dist_ts/utils.js +143 -0
- package/license.md +21 -0
- package/package.json +59 -0
- package/readme.hints.md +35 -0
- package/readme.md +181 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/actions.ts +241 -0
- package/ts/classes.artifactstore.ts +432 -0
- package/ts/classes.egressproxy.ts +1005 -0
- package/ts/classes.flexprovider.ts +134 -0
- package/ts/classes.framed.ts +649 -0
- package/ts/classes.runtime.ts +2135 -0
- package/ts/confinement.ts +90 -0
- package/ts/errors.ts +63 -0
- package/ts/index.ts +52 -0
- package/ts/interfaces.ts +375 -0
- package/ts/internal.testing.ts +18 -0
- package/ts/mcp.ts +230 -0
- package/ts/plugins.ts +28 -0
- package/ts/utils.ts +188 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"@git.zone/cli": {
|
|
3
|
+
"schemaVersion": 2,
|
|
4
|
+
"projectType": "npm",
|
|
5
|
+
"module": {
|
|
6
|
+
"githost": "code.foss.global",
|
|
7
|
+
"gitscope": "modelprofile.com",
|
|
8
|
+
"gitrepo": "browser-runtime",
|
|
9
|
+
"description": "Parent-owned, project-scoped Chromium runtime with authenticated human and agent control, fail-closed egress, bounded artifacts, and Flex/MCP adapters.",
|
|
10
|
+
"npmPackagename": "@modelprofile.com/browser-runtime",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"projectDomain": "modelprofile.com"
|
|
13
|
+
},
|
|
14
|
+
"release": {
|
|
15
|
+
"targets": {
|
|
16
|
+
"git": {
|
|
17
|
+
"enabled": true,
|
|
18
|
+
"remote": "origin",
|
|
19
|
+
"pushBranch": true,
|
|
20
|
+
"pushTags": true
|
|
21
|
+
},
|
|
22
|
+
"npm": {
|
|
23
|
+
"enabled": true,
|
|
24
|
+
"registries": [
|
|
25
|
+
"https://verdaccio.lossless.digital",
|
|
26
|
+
"https://registry.npmjs.org"
|
|
27
|
+
],
|
|
28
|
+
"accessLevel": "public",
|
|
29
|
+
"alreadyPublished": "success"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
package/changelog.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2026-08-11 - 1.0.0
|
|
4
|
+
|
|
5
|
+
### Breaking Changes
|
|
6
|
+
|
|
7
|
+
- introduce the project-scoped Chromium runtime (runtime)
|
|
8
|
+
- Add capability-bound human and agent leases with preemption, lifecycle fencing, and bounded cleanup.
|
|
9
|
+
- Enforce sandboxed Chromium profiles, authenticated fail-closed egress, artifact quotas, and integrity checks.
|
|
10
|
+
- Expose inherited-pipe, Flex, and metadata-only MCP adapters with the six approved browser actions.
|
|
11
|
+
- Cover runtime, proxy, artifact, adapter, and real-Chromium confinement behavior.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autocreated commitinfo by @push.rocks/commitinfo
|
|
3
|
+
*/
|
|
4
|
+
export const commitinfo = {
|
|
5
|
+
name: '@modelprofile.com/browser-runtime',
|
|
6
|
+
version: '1.0.0',
|
|
7
|
+
description: 'Parent-owned, project-scoped Chromium runtime with authenticated human and agent control, fail-closed egress, bounded artifacts, and Flex/MCP adapters.'
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxtQ0FBbUM7SUFDekMsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHlKQUF5SjtDQUN2SyxDQUFBIn0=
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { BrowserRuntimeError } from './errors.js';
|
|
2
|
+
import { validateBoundedString, validateExactKeys, validateInteger, } from './utils.js';
|
|
3
|
+
const optionalTabId = (value) => value === undefined
|
|
4
|
+
? undefined
|
|
5
|
+
: validateBoundedString(value, 'tabId', 1, 128);
|
|
6
|
+
const optionalTimeout = (value) => value === undefined
|
|
7
|
+
? undefined
|
|
8
|
+
: validateInteger(value, 'timeoutMs', 100, 120_000);
|
|
9
|
+
export const validateAgentAction = (value) => {
|
|
10
|
+
const base = validateExactKeys(value, [
|
|
11
|
+
'action',
|
|
12
|
+
'url',
|
|
13
|
+
'selector',
|
|
14
|
+
'text',
|
|
15
|
+
'key',
|
|
16
|
+
'tabId',
|
|
17
|
+
'timeoutMs',
|
|
18
|
+
'maxCharacters',
|
|
19
|
+
'format',
|
|
20
|
+
'quality',
|
|
21
|
+
], 'agent action');
|
|
22
|
+
const action = base.action;
|
|
23
|
+
if (typeof action !== 'string')
|
|
24
|
+
throw new BrowserRuntimeError('INVALID_INPUT');
|
|
25
|
+
switch (action) {
|
|
26
|
+
case 'navigate': {
|
|
27
|
+
validateExactKeys(value, ['action', 'url', 'tabId', 'timeoutMs'], 'navigate action');
|
|
28
|
+
const result = {
|
|
29
|
+
action,
|
|
30
|
+
url: validateBoundedString(base.url, 'url', 1, 8192),
|
|
31
|
+
};
|
|
32
|
+
const tabId = optionalTabId(base.tabId);
|
|
33
|
+
const timeoutMs = optionalTimeout(base.timeoutMs);
|
|
34
|
+
if (tabId !== undefined)
|
|
35
|
+
result.tabId = tabId;
|
|
36
|
+
if (timeoutMs !== undefined)
|
|
37
|
+
result.timeoutMs = timeoutMs;
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
case 'snapshot': {
|
|
41
|
+
validateExactKeys(value, ['action', 'tabId', 'maxCharacters'], 'snapshot action');
|
|
42
|
+
const result = { action };
|
|
43
|
+
const tabId = optionalTabId(base.tabId);
|
|
44
|
+
const maxCharacters = base.maxCharacters === undefined
|
|
45
|
+
? undefined
|
|
46
|
+
: validateInteger(base.maxCharacters, 'maxCharacters', 256, 50_000);
|
|
47
|
+
if (tabId !== undefined)
|
|
48
|
+
result.tabId = tabId;
|
|
49
|
+
if (maxCharacters !== undefined)
|
|
50
|
+
result.maxCharacters = maxCharacters;
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
case 'screenshot': {
|
|
54
|
+
validateExactKeys(value, ['action', 'tabId', 'format', 'quality'], 'screenshot action');
|
|
55
|
+
const result = { action };
|
|
56
|
+
const tabId = optionalTabId(base.tabId);
|
|
57
|
+
if (tabId !== undefined)
|
|
58
|
+
result.tabId = tabId;
|
|
59
|
+
if (base.format !== undefined) {
|
|
60
|
+
if (base.format !== 'jpeg' && base.format !== 'png') {
|
|
61
|
+
throw new BrowserRuntimeError('INVALID_INPUT');
|
|
62
|
+
}
|
|
63
|
+
result.format = base.format;
|
|
64
|
+
}
|
|
65
|
+
if (base.quality !== undefined) {
|
|
66
|
+
result.quality = validateInteger(base.quality, 'quality', 0, 100);
|
|
67
|
+
}
|
|
68
|
+
if (result.format === 'png' && result.quality !== undefined) {
|
|
69
|
+
throw new BrowserRuntimeError('INVALID_INPUT');
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
case 'click': {
|
|
74
|
+
validateExactKeys(value, ['action', 'selector', 'tabId', 'timeoutMs'], 'click action');
|
|
75
|
+
const result = {
|
|
76
|
+
action,
|
|
77
|
+
selector: validateBoundedString(base.selector, 'selector', 1, 4096),
|
|
78
|
+
};
|
|
79
|
+
const tabId = optionalTabId(base.tabId);
|
|
80
|
+
const timeoutMs = optionalTimeout(base.timeoutMs);
|
|
81
|
+
if (tabId !== undefined)
|
|
82
|
+
result.tabId = tabId;
|
|
83
|
+
if (timeoutMs !== undefined)
|
|
84
|
+
result.timeoutMs = timeoutMs;
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
case 'fill': {
|
|
88
|
+
validateExactKeys(value, ['action', 'selector', 'text', 'tabId', 'timeoutMs'], 'fill action');
|
|
89
|
+
const result = {
|
|
90
|
+
action,
|
|
91
|
+
selector: validateBoundedString(base.selector, 'selector', 1, 4096),
|
|
92
|
+
text: typeof base.text === 'string' && base.text.length <= 100_000
|
|
93
|
+
? base.text
|
|
94
|
+
: (() => { throw new BrowserRuntimeError('INVALID_INPUT'); })(),
|
|
95
|
+
};
|
|
96
|
+
const tabId = optionalTabId(base.tabId);
|
|
97
|
+
const timeoutMs = optionalTimeout(base.timeoutMs);
|
|
98
|
+
if (tabId !== undefined)
|
|
99
|
+
result.tabId = tabId;
|
|
100
|
+
if (timeoutMs !== undefined)
|
|
101
|
+
result.timeoutMs = timeoutMs;
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
case 'press': {
|
|
105
|
+
validateExactKeys(value, ['action', 'selector', 'key', 'tabId', 'timeoutMs'], 'press action');
|
|
106
|
+
const result = {
|
|
107
|
+
action,
|
|
108
|
+
selector: validateBoundedString(base.selector, 'selector', 1, 4096),
|
|
109
|
+
key: validateBoundedString(base.key, 'key', 1, 64),
|
|
110
|
+
};
|
|
111
|
+
const tabId = optionalTabId(base.tabId);
|
|
112
|
+
const timeoutMs = optionalTimeout(base.timeoutMs);
|
|
113
|
+
if (tabId !== undefined)
|
|
114
|
+
result.tabId = tabId;
|
|
115
|
+
if (timeoutMs !== undefined)
|
|
116
|
+
result.timeoutMs = timeoutMs;
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
default:
|
|
120
|
+
throw new BrowserRuntimeError('INVALID_INPUT');
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const validateRuntimeState = (value) => {
|
|
124
|
+
const state = validateExactKeys(value, ['status', 'activeTabId', 'viewportRevision', 'viewport', 'tabs', 'lastError'], 'browser state');
|
|
125
|
+
if (state.status !== 'stopped'
|
|
126
|
+
&& state.status !== 'starting'
|
|
127
|
+
&& state.status !== 'running'
|
|
128
|
+
&& state.status !== 'stopping')
|
|
129
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
130
|
+
if (state.activeTabId !== null)
|
|
131
|
+
validateBoundedString(state.activeTabId, 'activeTabId', 1, 128);
|
|
132
|
+
validateInteger(state.viewportRevision, 'viewportRevision', 0, Number.MAX_SAFE_INTEGER);
|
|
133
|
+
const viewport = validateExactKeys(state.viewport, ['width', 'height', 'deviceScaleFactor'], 'viewport');
|
|
134
|
+
validateInteger(viewport.width, 'viewport.width', 1, 16_384);
|
|
135
|
+
validateInteger(viewport.height, 'viewport.height', 1, 16_384);
|
|
136
|
+
if (typeof viewport.deviceScaleFactor !== 'number'
|
|
137
|
+
|| !Number.isFinite(viewport.deviceScaleFactor)
|
|
138
|
+
|| viewport.deviceScaleFactor <= 0
|
|
139
|
+
|| viewport.deviceScaleFactor > 8)
|
|
140
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
141
|
+
if (!Array.isArray(state.tabs) || state.tabs.length > 256) {
|
|
142
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
143
|
+
}
|
|
144
|
+
for (const tabValue of state.tabs) {
|
|
145
|
+
const tab = validateExactKeys(tabValue, [
|
|
146
|
+
'id',
|
|
147
|
+
'url',
|
|
148
|
+
'title',
|
|
149
|
+
'active',
|
|
150
|
+
'status',
|
|
151
|
+
'generation',
|
|
152
|
+
'appliedViewportRevision',
|
|
153
|
+
'streaming',
|
|
154
|
+
], 'tab');
|
|
155
|
+
validateBoundedString(tab.id, 'tab.id', 1, 128);
|
|
156
|
+
if (typeof tab.url !== 'string' || tab.url.length > 8192)
|
|
157
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
158
|
+
if (typeof tab.title !== 'string' || tab.title.length > 2048)
|
|
159
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
160
|
+
if (typeof tab.active !== 'boolean' || typeof tab.streaming !== 'boolean') {
|
|
161
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
162
|
+
}
|
|
163
|
+
if (tab.status !== 'open' && tab.status !== 'crashed')
|
|
164
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
165
|
+
validateInteger(tab.generation, 'tab.generation', 0, Number.MAX_SAFE_INTEGER);
|
|
166
|
+
validateInteger(tab.appliedViewportRevision, 'tab.appliedViewportRevision', 0, Number.MAX_SAFE_INTEGER);
|
|
167
|
+
}
|
|
168
|
+
if (state.lastError !== undefined) {
|
|
169
|
+
const lastError = validateExactKeys(state.lastError, ['code', 'fatal', 'tabId'], 'lastError');
|
|
170
|
+
validateBoundedString(lastError.code, 'lastError.code', 1, 128);
|
|
171
|
+
if (typeof lastError.fatal !== 'boolean')
|
|
172
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
173
|
+
if (lastError.tabId !== undefined)
|
|
174
|
+
validateBoundedString(lastError.tabId, 'lastError.tabId', 1, 128);
|
|
175
|
+
}
|
|
176
|
+
return value;
|
|
177
|
+
};
|
|
178
|
+
export const validateAgentActionResult = (value) => {
|
|
179
|
+
const result = validateExactKeys(value, ['action', 'state', 'tabId', 'url', 'title', 'text', 'truncated', 'artifact'], 'agent action result');
|
|
180
|
+
if (result.action === 'navigate'
|
|
181
|
+
|| result.action === 'click'
|
|
182
|
+
|| result.action === 'fill'
|
|
183
|
+
|| result.action === 'press') {
|
|
184
|
+
validateExactKeys(value, ['action', 'state'], 'state action result');
|
|
185
|
+
validateRuntimeState(result.state);
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
if (result.action === 'snapshot') {
|
|
189
|
+
validateExactKeys(value, ['action', 'tabId', 'url', 'title', 'text', 'truncated', 'state'], 'snapshot result');
|
|
190
|
+
validateBoundedString(result.tabId, 'tabId', 1, 128);
|
|
191
|
+
if (typeof result.url !== 'string' || result.url.length > 8192)
|
|
192
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
193
|
+
if (typeof result.title !== 'string' || result.title.length > 2048)
|
|
194
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
195
|
+
if (typeof result.text !== 'string' || result.text.length > 50_000)
|
|
196
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
197
|
+
if (typeof result.truncated !== 'boolean')
|
|
198
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
199
|
+
validateRuntimeState(result.state);
|
|
200
|
+
return value;
|
|
201
|
+
}
|
|
202
|
+
if (result.action === 'screenshot') {
|
|
203
|
+
validateExactKeys(value, ['action', 'artifact'], 'screenshot result');
|
|
204
|
+
const artifact = validateExactKeys(result.artifact, ['artifactId', 'projectId', 'mimeType', 'size', 'createdAt', 'expiresAt'], 'artifact metadata');
|
|
205
|
+
validateBoundedString(artifact.artifactId, 'artifactId', 1, 128);
|
|
206
|
+
validateBoundedString(artifact.projectId, 'projectId', 1, 128);
|
|
207
|
+
validateBoundedString(artifact.mimeType, 'mimeType', 1, 128);
|
|
208
|
+
validateInteger(artifact.size, 'artifact.size', 0, 64 * 1024 * 1024);
|
|
209
|
+
validateInteger(artifact.createdAt, 'artifact.createdAt', 0, Number.MAX_SAFE_INTEGER);
|
|
210
|
+
validateInteger(artifact.expiresAt, 'artifact.expiresAt', 0, Number.MAX_SAFE_INTEGER);
|
|
211
|
+
return value;
|
|
212
|
+
}
|
|
213
|
+
throw new BrowserRuntimeError('PROTOCOL_ERROR');
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2FjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGVBQWUsR0FDaEIsTUFBTSxZQUFZLENBQUM7QUFFcEIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFjLEVBQXNCLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUztJQUMvRSxDQUFDLENBQUMsU0FBUztJQUNYLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUVsRCxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWMsRUFBc0IsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTO0lBQ2pGLENBQUMsQ0FBQyxTQUFTO0lBQ1gsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEtBQWMsRUFBdUIsRUFBRTtJQUN6RSxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUU7UUFDcEMsUUFBUTtRQUNSLEtBQUs7UUFDTCxVQUFVO1FBQ1YsTUFBTTtRQUNOLEtBQUs7UUFDTCxPQUFPO1FBQ1AsV0FBVztRQUNYLGVBQWU7UUFDZixRQUFRO1FBQ1IsU0FBUztLQUNWLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUMzQixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7UUFBRSxNQUFNLElBQUksbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDL0UsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssVUFBVSxD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
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { IBrowserArtifactMetadata, IBrowserArtifactStoreOptions } from './interfaces.js';
|
|
2
|
+
export declare class BrowserArtifactStore {
|
|
3
|
+
private readonly rootDirectory;
|
|
4
|
+
private readonly maxFileBytes;
|
|
5
|
+
private readonly maxArtifactsPerProject;
|
|
6
|
+
private readonly maxProjectBytes;
|
|
7
|
+
private readonly maxProjects;
|
|
8
|
+
private readonly maxTotalArtifacts;
|
|
9
|
+
private readonly maxTotalBytes;
|
|
10
|
+
private readonly artifactTtlMs;
|
|
11
|
+
private readonly now;
|
|
12
|
+
private readonly directoryKey;
|
|
13
|
+
private readonly projects;
|
|
14
|
+
private readonly mutex;
|
|
15
|
+
private totalArtifacts;
|
|
16
|
+
private totalBytes;
|
|
17
|
+
private started;
|
|
18
|
+
private startPromise?;
|
|
19
|
+
private stopPromise?;
|
|
20
|
+
private sweepTimer?;
|
|
21
|
+
private sweepRunning;
|
|
22
|
+
constructor(options: IBrowserArtifactStoreOptions);
|
|
23
|
+
start(): Promise<void>;
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
store(projectIdArg: string, mimeTypeArg: string, data: Uint8Array): Promise<IBrowserArtifactMetadata>;
|
|
26
|
+
read(projectIdArg: string, artifactIdArg: string): Promise<Uint8Array>;
|
|
27
|
+
delete(projectIdArg: string, artifactIdArg: string): Promise<void>;
|
|
28
|
+
purgeExpired(projectIdArg?: string): Promise<number>;
|
|
29
|
+
purgeProject(projectIdArg: string): Promise<void>;
|
|
30
|
+
getMetadata(projectIdArg: string, artifactIdArg: string): IBrowserArtifactMetadata;
|
|
31
|
+
private startInternal;
|
|
32
|
+
private requireStarted;
|
|
33
|
+
private createProject;
|
|
34
|
+
private purgeExpiredInternal;
|
|
35
|
+
private deleteArtifact;
|
|
36
|
+
private removeEmptyProject;
|
|
37
|
+
private resolveArtifact;
|
|
38
|
+
}
|