Project

General

Profile

« Previous | Next » 

Revision bbc9fae4

Added by koszko over 1 year ago

serialize and deserialize entire Response object when relaying fetch() calls to other contexts using sendMessage

View differences:

html/install.js
51 51
#FROM common/misc.js       IMPORT sha256_async AS compute_sha256
52 52
#FROM common/jsonschema.js IMPORT haketilo_validator, haketilo_schemas
53 53

  
54
#FROM html/repo_query_cacher_client.js IMPORT indirect_fetch
55

  
54 56
const coll = new Intl.Collator();
55 57

  
56 58
/*
......
104 106
    };
105 107

  
106 108
    work.err = function (error, user_message) {
109
	if (!this.is_ok)
110
	    return;
111

  
107 112
	if (error)
108 113
	    console.error("Haketilo:", error);
109 114
	work.is_ok = false;
......
171 176
	const url = ver ?
172 177
	      `${this.repo_url}${item_type}/${id}/${ver.join(".")}` :
173 178
	      `${this.repo_url}${item_type}/${id}.json`;
174
	const response =
175
	      await browser.tabs.sendMessage(tab_id, ["repo_query", url]);
176
	if (!work.is_ok)
177
	    return;
178 179

  
179
	if ("error" in response) {
180
	    return work.err(response.error,
181
			    "Failure to communicate with repository :(");
180

  
181
	try {
182
	    var response = await indirect_fetch(tab_id, url);
183
	} catch(e) {
184
	    return work.err(e, "Failure to communicate with repository :(");
182 185
	}
183 186

  
187
	if (!work.is_ok)
188
	    return;
189

  
184 190
	if (!response.ok) {
185 191
	    return work.err(null,
186 192
			    `Repository sent HTTP code ${response.status} :(`);
187 193
	}
188 194

  
189
	if ("error_json" in response) {
190
	    return work.err(response.error_json,
191
			    "Repository's response is not valid JSON :(");
195
	try {
196
	    var json = await response.json();
197
	} catch(e) {
198
	    return work.err(e, "Repository's response is not valid JSON :(");
192 199
	}
193 200

  
201
	if (!work.is_ok)
202
	    return;
203

  
194 204
	const captype = item_type[0].toUpperCase() + item_type.substring(1);
195 205

  
196 206
	const $id =
197 207
	      `https://hydrilla.koszko.org/schemas/api_${item_type}_description-1.0.1.schema.json`;
198 208
	const schema = haketilo_schemas[$id];
199
	const result = haketilo_validator.validate(response.json, schema);
209
	const result = haketilo_validator.validate(json, schema);
200 210
	if (result.errors.length > 0) {
201 211
	    const reg = new RegExp(schema.allOf[2].properties.$schema.pattern);
202
	    if (response.json.$schema && !reg.test(response.json.$schema)) {
212
	    if (json.$schema && !reg.test(json.$schema)) {
203 213
		const msg = `${captype} ${item_id_string(id, ver)} was served using unsupported Hydrilla API version. You might need to update Haketilo.`;
204 214
		return work.err(result.errors, msg);
205 215
	    }
......
208 218
	    return work.err(result.errors, msg);
209 219
	}
210 220

  
211
	const scripts = item_type === "resource" && response.json.scripts;
212
	const files = response.json.source_copyright.concat(scripts || []);
221
	const scripts = item_type === "resource" && json.scripts;
222
	const files = json.source_copyright.concat(scripts || []);
213 223

  
214 224
	if (item_type === "mapping") {
215
	    for (const res_ref of Object.values(response.json.payloads || {}))
225
	    for (const res_ref of Object.values(json.payloads || {}))
216 226
		process_item(work, "resource", res_ref.identifier);
217 227
	} else {
218
	    for (const res_ref of (response.json.dependencies || []))
228
	    for (const res_ref of (json.dependencies || []))
219 229
		process_item(work, "resource", res_ref.identifier);
220 230
	}
221 231

  
......
234 244
	    const msg = "Error accessing Haketilo's internal database :(";
235 245
	    return work.err(e, msg);
236 246
	}
237
	if (!db_def || db_def.version < response.json.version)
238
	    work.result.push({def: response.json, db_def});
247
	if (!db_def || db_def.version < json.version)
248
	    work.result.push({def: json, db_def});
239 249

  
240 250
	if (--work.waiting === 0)
241 251
	    work.resolve_cb(work.result);
......
320 330
		return work.err(null, msg);
321 331
	    }
322 332

  
323
	    try {
324
		var text = await response.text();
325
		if (!work.is_ok)
326
		    return;
327
	    } catch(e) {
328
		const msg = "Repository's response is not valid text :(";
329
		return work.err(e, msg);
330
	    }
333
	    const text = await response.text();
334
	    if (!work.is_ok)
335
		return;
331 336

  
332 337
	    const digest = await compute_sha256(text);
333 338
	    if (!work.is_ok)

Also available in: Unified diff