feat: complete Ancestor quote bot with production-ready Docker support

This commit is contained in:
unfunny
2026-09-13 14:14:38 -04:00
parent f2016da05a
commit fe7351a7dc
1145 changed files with 30890 additions and 97684 deletions

View File

@@ -1,4 +1,79 @@
import _defineProperty from "@babel/runtime/helpers/defineProperty";
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
var _exportNames = {
MatrixHttpApi: true
};
exports.MatrixHttpApi = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _fetch = require("./fetch");
var _prefix = require("./prefix");
Object.keys(_prefix).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
if (key in exports && exports[key] === _prefix[key]) return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {
return _prefix[key];
}
});
});
var _utils = require("../utils");
var callbacks = _interopRequireWildcard(require("../realtime-callbacks"));
var _method = require("./method");
Object.keys(_method).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
if (key in exports && exports[key] === _method[key]) return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {
return _method[key];
}
});
});
var _errors = require("./errors");
Object.keys(_errors).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
if (key in exports && exports[key] === _errors[key]) return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {
return _errors[key];
}
});
});
var _utils2 = require("./utils");
Object.keys(_utils2).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
if (key in exports && exports[key] === _utils2[key]) return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {
return _utils2[key];
}
});
});
var _interface = require("./interface");
Object.keys(_interface).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
if (key in exports && exports[key] === _interface[key]) return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {
return _interface[key];
}
});
});
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
/*
Copyright 2022 The Matrix.org Foundation C.I.C.
@@ -15,22 +90,10 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import { FetchHttpApi } from "./fetch.js";
import { MediaPrefix } from "./prefix.js";
import { removeElement } from "../utils.js";
import * as callbacks from "../realtime-callbacks.js";
import { Method } from "./method.js";
import { ConnectionError } from "./errors.js";
import { parseErrorResponse } from "./utils.js";
export * from "./interface.js";
export * from "./prefix.js";
export * from "./errors.js";
export * from "./method.js";
export * from "./utils.js";
export class MatrixHttpApi extends FetchHttpApi {
class MatrixHttpApi extends _fetch.FetchHttpApi {
constructor(...args) {
super(...args);
_defineProperty(this, "uploads", []);
(0, _defineProperty2.default)(this, "uploads", []);
}
/**
* Upload content to the homeserver
@@ -41,76 +104,79 @@ export class MatrixHttpApi extends FetchHttpApi {
*
* @param opts - options object
*
* @returns Promise which resolves to response object, or rejects with an error (usually a MatrixError).
* @throws May throw a `MatrixSafetyError` if content is deemed unsafe.
* @see MatrixSafetyError
* @returns Promise which resolves to response object, as
* determined by this.opts.onlyData, opts.rawResponse, and
* opts.onlyContentUri. Rejects with an error (usually a MatrixError).
*/
uploadContent(file, opts = {}) {
const includeFilename = opts.includeFilename ?? true;
const abortController = opts.abortController ?? new AbortController();
var _opts$includeFilename, _opts$abortController, _ref, _opts$type, _opts$name;
const includeFilename = (_opts$includeFilename = opts.includeFilename) !== null && _opts$includeFilename !== void 0 ? _opts$includeFilename : true;
const abortController = (_opts$abortController = opts.abortController) !== null && _opts$abortController !== void 0 ? _opts$abortController : new AbortController();
// If the file doesn't have a mime type, use a default since the HS errors if we don't supply one.
const contentType = (opts.type ?? file.type) || "application/octet-stream";
const fileName = opts.name ?? file.name;
const contentType = (_ref = (_opts$type = opts.type) !== null && _opts$type !== void 0 ? _opts$type : file.type) !== null && _ref !== void 0 ? _ref : "application/octet-stream";
const fileName = (_opts$name = opts.name) !== null && _opts$name !== void 0 ? _opts$name : file.name;
const upload = {
loaded: 0,
total: 0,
abortController
};
const uploadResolvers = Promise.withResolvers();
if (globalThis.XMLHttpRequest) {
const xhr = new globalThis.XMLHttpRequest();
const deferred = (0, _utils.defer)();
if (global.XMLHttpRequest) {
const xhr = new global.XMLHttpRequest();
const timeoutFn = function () {
xhr.abort();
uploadResolvers.reject(new Error("Timeout"));
deferred.reject(new Error("Timeout"));
};
// set an initial timeout of 30s; we'll advance it each time we get a progress notification
let timeoutTimer = callbacks.setTimeout(timeoutFn, 30000);
xhr.onreadystatechange = function () {
switch (xhr.readyState) {
case globalThis.XMLHttpRequest.DONE:
case global.XMLHttpRequest.DONE:
callbacks.clearTimeout(timeoutTimer);
try {
if (xhr.status === 0) {
throw new DOMException(xhr.statusText, "AbortError"); // mimic fetch API
}
if (!xhr.responseText) {
throw new Error("No response body.");
}
if (xhr.status >= 400) {
uploadResolvers.reject(parseErrorResponse(xhr, xhr.responseText));
deferred.reject((0, _utils2.parseErrorResponse)(xhr, xhr.responseText));
} else {
uploadResolvers.resolve(JSON.parse(xhr.responseText));
deferred.resolve(JSON.parse(xhr.responseText));
}
} catch (err) {
if (err.name === "AbortError") {
uploadResolvers.reject(err);
deferred.reject(err);
return;
}
uploadResolvers.reject(new ConnectionError("request failed", err));
deferred.reject(new _errors.ConnectionError("request failed", err));
}
break;
}
};
xhr.upload.onprogress = ev => {
var _opts$progressHandler;
callbacks.clearTimeout(timeoutTimer);
upload.loaded = ev.loaded;
upload.total = ev.total;
timeoutTimer = callbacks.setTimeout(timeoutFn, 30000);
opts.progressHandler?.({
(_opts$progressHandler = opts.progressHandler) === null || _opts$progressHandler === void 0 ? void 0 : _opts$progressHandler.call(opts, {
loaded: ev.loaded,
total: ev.total
});
};
const url = this.getUrl("/upload", undefined, MediaPrefix.V3);
const url = this.getUrl("/upload", undefined, _prefix.MediaPrefix.R0);
if (includeFilename && fileName) {
url.searchParams.set("filename", encodeURIComponent(fileName));
}
if (!this.opts.useAuthorizationHeader && this.opts.accessToken) {
url.searchParams.set("access_token", encodeURIComponent(this.opts.accessToken));
}
xhr.open(Method.Post, url.href);
xhr.open(_method.Method.Post, url.href);
if (this.opts.useAuthorizationHeader && this.opts.accessToken) {
xhr.setRequestHeader("Authorization", "Bearer " + this.opts.accessToken);
}
@@ -127,20 +193,22 @@ export class MatrixHttpApi extends FetchHttpApi {
const headers = {
"Content-Type": contentType
};
this.authedRequest(Method.Post, "/upload", queryParams, file, {
prefix: MediaPrefix.V3,
this.authedRequest(_method.Method.Post, "/upload", queryParams, file, {
prefix: _prefix.MediaPrefix.R0,
headers,
abortSignal: abortController.signal
}).then(uploadResolvers.resolve, uploadResolvers.reject);
}).then(response => {
return this.opts.onlyData ? response : response.json();
}).then(deferred.resolve, deferred.reject);
}
// remove the upload from the list on completion
upload.promise = uploadResolvers.promise.finally(() => {
removeElement(this.uploads, elem => elem === upload);
upload.promise = deferred.promise.finally(() => {
(0, _utils.removeElement)(this.uploads, elem => elem === upload);
});
abortController.signal.addEventListener("abort", () => {
removeElement(this.uploads, elem => elem === upload);
uploadResolvers.reject(new DOMException("Aborted", "AbortError"));
(0, _utils.removeElement)(this.uploads, elem => elem === upload);
deferred.reject(new DOMException("Aborted", "AbortError"));
});
this.uploads.push(upload);
return upload.promise;
@@ -156,5 +224,21 @@ export class MatrixHttpApi extends FetchHttpApi {
getCurrentUploads() {
return this.uploads;
}
/**
* Get the content repository url with query parameters.
* @returns An object with a 'base', 'path' and 'params' for base URL,
* path and query parameters respectively.
*/
getContentUri() {
return {
base: this.opts.baseUrl,
path: _prefix.MediaPrefix.R0 + "/upload",
params: {
access_token: this.opts.accessToken
}
};
}
}
exports.MatrixHttpApi = MatrixHttpApi;
//# sourceMappingURL=index.js.map