overte-Armored-Dragon/scripts/system/request-service.js

48 lines
2.3 KiB
JavaScript

"use strict";
//
// request-service.js
//
// Created by Howard Stearns on May 22, 2018
// Copyright 2018 High Fidelity, Inc
//
// Distributed under the Apache License, Version 2.0
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
(function() { // BEGIN LOCAL_SCOPE
// QML has its own XMLHttpRequest, but:
// - npm request is easier to use.
// - It is not easy to hack QML's XMLHttpRequest to use our Directory Services, and to supply the user's auth when contacting it.
// a. Our custom XMLHttpRequestClass object only works with QScriptEngine, not QML's javascript.
// b. We have hacked profiles that intercept requests to our MetavserseServer (providing the correct auth), but those
// only work in QML WebEngineView. Setting up communication between ordinary QML and a hiddent WebEngineView is
// tantamount to the following anyway, and would still have to duplicate the code from request.js.
// So, this script does two things:
// 1. Allows any root .qml to signal sendToScript({id: aString, method: 'http.request', params: byNameOptions})
// We will then asynchonously call fromScript({id: theSameString, method: 'http.response', error: errorOrFalsey, response: body})
// on that root object.
// RootHttpRequest.qml does this.
// 2. If the uri used (computed from byNameOptions, see request.js) is to our Directory Services, we will use the appropriate auth.
var request = Script.require('request').request;
var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
function fromQml(message) { // messages are {id, method, params}, like json-rpc. See also sendToQml.
switch (message.method) {
case 'http.request':
request(message.params, function (error, response) {
tablet.sendToQml({
id: message.id,
method: 'http.response',
error: error, // Alas, this isn't always a JSON-RPC conforming error object.
response: response,
jsonrpc: '2.0'
});
});
break;
}
}
tablet.fromQml.connect(fromQml);
Script.scriptEnding.connect(function () { tablet.fromQml.disconnect(fromQml); });
}()); // END LOCAL_SCOPE