ai-planning-val
Version:
Javascript/typescript wrapper for VAL (AI Planning plan validation and evaluation tools from KCL Planning department and the planning community around the ICAPS conference).
193 lines • 8.46 kB
JavaScript
;
/* --------------------------------------------------------------------------------------------
* Copyright (c) Jan Dolejsi. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.HttpStatusError = exports.postJson = exports.getText = exports.getFile = exports.getJson = void 0;
const https = __importStar(require("https"));
const http = __importStar(require("http"));
const fs = __importStar(require("fs"));
function get(url) {
return url.protocol === 'https:' ? https.get : http.get;
}
function request(url) {
return url.protocol === 'https:' ? https.request : http.request;
}
function getJson(url) {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
get(url)(url, res => {
if (res.statusCode && res.statusCode >= 300) {
reject(new Error(`Status code ${res.statusCode}, ${res.statusMessage} from ${url}`));
res.resume();
return;
}
const contentType = res.headers['content-type'];
if (!contentType || !/^application\/json/.test(contentType)) {
reject(new Error('Invalid content-type.\n' +
`Expected application/json but received ${contentType} from ${url}`));
res.resume();
return;
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; });
res.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
// console.log(parsedData);
resolve(parsedData);
}
catch (e) {
console.error(e);
reject(e);
}
});
});
});
});
}
exports.getJson = getJson;
function getFile(url, localFilePath) {
const localFile = fs.createWriteStream(localFilePath);
return new Promise((resolve, reject) => {
get(url)(url, res => {
if (res.statusCode && res.statusCode >= 300) {
reject(new Error(`Status code ${res.statusCode}, ${res.statusMessage} from ${url}`));
res.resume();
return;
}
console.log("Downloading %s. Content-type: %s, Status code: %d", url, res.headers['content-type'], res.statusCode);
if (res.statusCode && res.statusCode >= 400) {
reject(new Error("Downloading VAL binaries failed with HTTP status code " + res.statusCode));
}
res.on('error', err => {
reject(err);
});
// pipe the stream to a file and wait for it to finish
res.pipe(localFile)
.on('finish', () => {
console.log("Downloaded %s to %s", url, localFilePath);
resolve();
}).on('error', err => {
reject(err);
});
});
});
}
exports.getFile = getFile;
function getText(url, options) {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
get(url)(url, res => {
if (res.statusCode && res.statusCode >= 300) {
reject(new Error(`Status code ${res.statusCode}, ${res.statusMessage} from ${url}`));
res.resume();
return;
}
if (options === null || options === void 0 ? void 0 : options.expectedContentType) {
const contentType = res.headers['content-type'];
if (!contentType || !options.expectedContentType.test(contentType)) {
reject(new Error('Invalid content-type.\n' +
`Expected ${options.expectedContentType} but received ${contentType} from ${url}`));
res.resume();
return;
}
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; });
res.on('end', () => {
resolve(rawData);
});
});
});
});
}
exports.getText = getText;
/**
* Post JSON body and expects JSON response.
* @param url url to call
* @param content content to post
* @param headers headers to add
* @returns returned body
* @throws HttpStatusError if the status code >= 300
*/
function postJson(url, content, headers) {
return __awaiter(this, void 0, void 0, function* () {
return yield new Promise((resolve, reject) => {
request(url)(url, { headers: headers, method: "POST" }, res => {
if (res.statusCode && res.statusCode >= 300) {
reject(new HttpStatusError(res.statusCode, res.statusMessage, url));
res.resume();
return;
}
const contentType = res.headers['content-type'];
if (!contentType || !/^application\/json/.test(contentType)) {
reject(new Error('Invalid content-type.\n' +
`Expected application/json but received ${contentType} from ${url}`));
res.resume();
return;
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; });
res.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
// console.log(parsedData);
resolve(parsedData);
}
catch (e) {
console.error(e);
reject(e);
}
});
}).end(JSON.stringify(content));
});
});
}
exports.postJson = postJson;
class HttpStatusError extends Error {
constructor(statusCode, statusMessage, url) {
super(`Status code ${statusCode}, ${statusMessage} from ${url}`);
this.statusCode = statusCode;
this.statusMessage = statusMessage;
this.url = url;
}
}
exports.HttpStatusError = HttpStatusError;
//# sourceMappingURL=httpUtils.js.map