mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-26 02:11:53 +00:00
fix: Gitea/ Synapse/ Nostr types for manifest + config (#2704)
This commit is contained in:
@@ -168,7 +168,7 @@ export class MainLoop {
|
||||
id: healthId,
|
||||
name: value.name,
|
||||
result: "success",
|
||||
message: actionProcedure["success-message"],
|
||||
message: actionProcedure["success-message"] ?? null,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
export default {
|
||||
"eos-version": "0.3.5.1",
|
||||
id: "gitea",
|
||||
"git-hash": "91fada3edf30357a2e75c281d32f8888c87fcc2d\n",
|
||||
title: "Gitea",
|
||||
version: "1.22.0",
|
||||
description: {
|
||||
short: "A painless self-hosted Git service.",
|
||||
long: "Gitea is a community managed lightweight code hosting solution written in Go. It is published under the MIT license.\n",
|
||||
},
|
||||
assets: {
|
||||
license: "LICENSE",
|
||||
instructions: "instructions.md",
|
||||
icon: "icon.png",
|
||||
"docker-images": null,
|
||||
assets: null,
|
||||
scripts: null,
|
||||
},
|
||||
build: ["make"],
|
||||
"release-notes":
|
||||
"* Upstream code update\n* Fix deprecated config options\n* Full list of upstream changes available [here](https://github.com/go-gitea/gitea/compare/v1.21.8...v1.22.0)\n",
|
||||
license: "MIT",
|
||||
"wrapper-repo": "https://github.com/Start9Labs/gitea-startos",
|
||||
"upstream-repo": "https://github.com/go-gitea/gitea",
|
||||
"support-site": "https://docs.gitea.io/en-us/",
|
||||
"marketing-site": "https://gitea.io/en-us/",
|
||||
"donation-url": null,
|
||||
alerts: {
|
||||
install: null,
|
||||
uninstall: null,
|
||||
restore: null,
|
||||
start: null,
|
||||
stop: null,
|
||||
},
|
||||
main: {
|
||||
type: "docker",
|
||||
image: "main",
|
||||
system: false,
|
||||
entrypoint: "/usr/local/bin/docker_entrypoint.sh",
|
||||
args: [],
|
||||
inject: false,
|
||||
mounts: { main: "/data" },
|
||||
"io-format": null,
|
||||
"sigterm-timeout": null,
|
||||
"shm-size-mb": null,
|
||||
"gpu-acceleration": false,
|
||||
},
|
||||
"health-checks": {
|
||||
"user-signups-off": {
|
||||
name: "User Signups Off",
|
||||
"success-message": null,
|
||||
type: "script",
|
||||
args: [],
|
||||
timeout: null,
|
||||
},
|
||||
web: {
|
||||
name: "Web & Git HTTP Tor Interfaces",
|
||||
"success-message":
|
||||
"Gitea is ready to be visited in a web browser and git can be used with SSH over TOR.",
|
||||
type: "script",
|
||||
args: [],
|
||||
timeout: null,
|
||||
},
|
||||
},
|
||||
config: {
|
||||
get: { type: "script", args: [] },
|
||||
set: { type: "script", args: [] },
|
||||
},
|
||||
properties: { type: "script", args: [] },
|
||||
volumes: { main: { type: "data" } },
|
||||
interfaces: {
|
||||
main: {
|
||||
name: "Web UI / Git HTTPS/SSH",
|
||||
description:
|
||||
"Port 80: Browser Interface and HTTP Git Interface / Port 22: Git SSH Interface",
|
||||
"tor-config": { "port-mapping": { "22": "22", "80": "3000" } },
|
||||
"lan-config": { "443": { ssl: true, internal: 3000 } },
|
||||
ui: true,
|
||||
protocols: ["tcp", "http", "ssh", "git"],
|
||||
},
|
||||
},
|
||||
backup: {
|
||||
create: {
|
||||
type: "docker",
|
||||
image: "compat",
|
||||
system: true,
|
||||
entrypoint: "compat",
|
||||
args: ["duplicity", "create", "/mnt/backup", "/root/data"],
|
||||
inject: false,
|
||||
mounts: { BACKUP: "/mnt/backup", main: "/root/data" },
|
||||
"io-format": "yaml",
|
||||
"sigterm-timeout": null,
|
||||
"shm-size-mb": null,
|
||||
"gpu-acceleration": false,
|
||||
},
|
||||
restore: {
|
||||
type: "docker",
|
||||
image: "compat",
|
||||
system: true,
|
||||
entrypoint: "compat",
|
||||
args: ["duplicity", "restore", "/mnt/backup", "/root/data"],
|
||||
inject: false,
|
||||
mounts: { BACKUP: "/mnt/backup", main: "/root/data" },
|
||||
"io-format": "yaml",
|
||||
"sigterm-timeout": null,
|
||||
"shm-size-mb": null,
|
||||
"gpu-acceleration": false,
|
||||
},
|
||||
},
|
||||
migrations: {
|
||||
from: { "*": { type: "script", args: ["from"] } },
|
||||
to: { "*": { type: "script", args: ["to"] } },
|
||||
},
|
||||
actions: {},
|
||||
dependencies: {},
|
||||
containers: null,
|
||||
replaces: [],
|
||||
"hardware-requirements": {
|
||||
device: {},
|
||||
ram: null,
|
||||
arch: ["x86_64", "aarch64"],
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,187 @@
|
||||
export default {
|
||||
"tor-address": {
|
||||
name: "Tor Address",
|
||||
description: "The Tor address for the websocket server.",
|
||||
type: "pointer",
|
||||
subtype: "package",
|
||||
"package-id": "nostr",
|
||||
target: "tor-address",
|
||||
interface: "websocket",
|
||||
},
|
||||
"lan-address": {
|
||||
name: "Tor Address",
|
||||
description: "The LAN address for the websocket server.",
|
||||
type: "pointer",
|
||||
subtype: "package",
|
||||
"package-id": "nostr",
|
||||
target: "lan-address",
|
||||
interface: "websocket",
|
||||
},
|
||||
"relay-type": {
|
||||
type: "union",
|
||||
name: "Relay Type",
|
||||
warning:
|
||||
"Running a public relay carries risk. Your relay can be spammed, resulting in large amounts of disk usage.",
|
||||
tag: {
|
||||
id: "type",
|
||||
name: "Relay Type",
|
||||
description:
|
||||
"Private or public. A private relay (highly recommended) restricts write access to specific pubkeys. Anyone can write to a public relay.",
|
||||
"variant-names": { private: "Private", public: "Public" },
|
||||
},
|
||||
default: "private",
|
||||
variants: {
|
||||
private: {
|
||||
pubkey_whitelist: {
|
||||
name: "Pubkey Whitelist (hex)",
|
||||
description:
|
||||
"A list of pubkeys that are permitted to publish through your relay. A minimum, you need to enter your own Nostr hex (not npub) pubkey. Go to https://damus.io/key/ to convert from npub to hex.",
|
||||
type: "list",
|
||||
range: "[1,*)",
|
||||
subtype: "string",
|
||||
spec: {
|
||||
placeholder: "hex (not npub) pubkey",
|
||||
pattern: "[0-9a-fA-F]{64}",
|
||||
"pattern-description":
|
||||
"Must be a valid 64-digit hexadecimal value (ie a Nostr hex pubkey, not an npub). Go to https://damus.io/key/ to convert npub to hex.",
|
||||
},
|
||||
default: [],
|
||||
},
|
||||
},
|
||||
public: {
|
||||
info: {
|
||||
name: "Relay Info",
|
||||
description: "General public info about your relay",
|
||||
type: "object",
|
||||
spec: {
|
||||
name: {
|
||||
name: "Relay Name",
|
||||
description: "Your relay's human-readable identifier",
|
||||
type: "string",
|
||||
nullable: true,
|
||||
placeholder: "Bob's Public Relay",
|
||||
pattern: ".{3,32}",
|
||||
"pattern-description":
|
||||
"Must be at least 3 character and no more than 32 characters",
|
||||
masked: false,
|
||||
},
|
||||
description: {
|
||||
name: "Relay Description",
|
||||
description: "A more detailed description for your relay",
|
||||
type: "string",
|
||||
nullable: true,
|
||||
placeholder: "The best relay in town",
|
||||
pattern: ".{6,256}",
|
||||
"pattern-description":
|
||||
"Must be at least 6 character and no more than 256 characters",
|
||||
masked: false,
|
||||
},
|
||||
pubkey: {
|
||||
name: "Admin contact pubkey (hex)",
|
||||
description:
|
||||
"The Nostr hex (not npub) pubkey of the relay administrator",
|
||||
type: "string",
|
||||
nullable: true,
|
||||
placeholder: "hex (not npub) pubkey",
|
||||
pattern: "[0-9a-fA-F]{64}",
|
||||
"pattern-description":
|
||||
"Must be a valid 64-digit hexadecimal value (ie a Nostr hex pubkey, not an npub). Go to https://damus.io/key/ to convert npub to hex.",
|
||||
masked: false,
|
||||
},
|
||||
contact: {
|
||||
name: "Admin contact email",
|
||||
description: "The email address of the relay administrator",
|
||||
type: "string",
|
||||
nullable: true,
|
||||
pattern: "[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+",
|
||||
"pattern-description": "Must be a valid email address.",
|
||||
masked: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
limits: {
|
||||
name: "Limits",
|
||||
description:
|
||||
"Data limits to protect your relay from using too many resources",
|
||||
type: "object",
|
||||
spec: {
|
||||
messages_per_sec: {
|
||||
name: "Messages Per Second Limit",
|
||||
description:
|
||||
"Limit events created per second, averaged over one minute. Note: this is for the server as a whole, not per connection.",
|
||||
type: "number",
|
||||
nullable: false,
|
||||
range: "[1,*)",
|
||||
integral: true,
|
||||
default: 2,
|
||||
units: "messages/sec",
|
||||
},
|
||||
subscriptions_per_min: {
|
||||
name: "Subscriptions Per Minute Limit",
|
||||
description:
|
||||
"Limit client subscriptions created per second, averaged over one minute. Strongly recommended to set this to a low value such as 10 to ensure fair service.",
|
||||
type: "number",
|
||||
nullable: false,
|
||||
range: "[1,*)",
|
||||
integral: true,
|
||||
default: 10,
|
||||
units: "subscriptions",
|
||||
},
|
||||
max_blocking_threads: {
|
||||
name: "Max Blocking Threads",
|
||||
description:
|
||||
"Maximum number of blocking threads used for database connections.",
|
||||
type: "number",
|
||||
nullable: false,
|
||||
range: "[0,*)",
|
||||
integral: true,
|
||||
units: "threads",
|
||||
default: 16,
|
||||
},
|
||||
max_event_bytes: {
|
||||
name: "Max Event Size",
|
||||
description:
|
||||
"Limit the maximum size of an EVENT message. Set to 0 for unlimited",
|
||||
type: "number",
|
||||
nullable: false,
|
||||
range: "[0,*)",
|
||||
integral: true,
|
||||
units: "bytes",
|
||||
default: 131072,
|
||||
},
|
||||
max_ws_message_bytes: {
|
||||
name: "Max Websocket Message Size",
|
||||
description: "Maximum WebSocket message in bytes.",
|
||||
type: "number",
|
||||
nullable: false,
|
||||
range: "[0,*)",
|
||||
integral: true,
|
||||
units: "bytes",
|
||||
default: 131072,
|
||||
},
|
||||
max_ws_frame_bytes: {
|
||||
name: "Max Websocket Frame Size",
|
||||
description: "Maximum WebSocket frame size in bytes.",
|
||||
type: "number",
|
||||
nullable: false,
|
||||
range: "[0,*)",
|
||||
integral: true,
|
||||
units: "bytes",
|
||||
default: 131072,
|
||||
},
|
||||
event_kind_blacklist: {
|
||||
name: "Event Kind Blacklist",
|
||||
description:
|
||||
"Events with these kinds will be discarded. For a list of event kinds, see here: https://github.com/nostr-protocol/nips#event-kinds",
|
||||
type: "list",
|
||||
range: "[0,*)",
|
||||
subtype: "number",
|
||||
spec: { integral: true, placeholder: 30023, range: "(0,100000]" },
|
||||
default: [],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
export default {
|
||||
id: "synapse",
|
||||
title: "Synapse",
|
||||
version: "1.98.0",
|
||||
"release-notes":
|
||||
"* Upstream code update\n* Synapse Admin updated to the latest version - ([full changelog](https://github.com/Awesome-Technologies/synapse-admin/compare/0.8.7...0.9.1))\n* Instructions update\n* Updated package and upstream repositories links\n* Full list of upstream changes available [here](https://github.com/element-hq/synapse/compare/v1.95.1...v1.98.0)\n",
|
||||
license: "Apache-2.0",
|
||||
"wrapper-repo": "https://github.com/Start9Labs/synapse-startos",
|
||||
"upstream-repo": "https://github.com/element-hq/synapse",
|
||||
"support-site": "https://github.com/element-hq/synapse/issues",
|
||||
"marketing-site": "https://matrix.org/",
|
||||
build: ["make"],
|
||||
description: {
|
||||
short:
|
||||
"Synapse is a battle-tested implementation of the Matrix protocol, the killer of all messaging apps.",
|
||||
long: "Synapse is the battle-tested, reference implementation of the Matrix protocol. Matrix is a next-generation, federated, full-featured, encrypted, independent messaging system. There are no trusted third parties involved. (see matrix.org for details).",
|
||||
},
|
||||
assets: {
|
||||
license: "LICENSE",
|
||||
icon: "icon.png",
|
||||
instructions: "instructions.md",
|
||||
},
|
||||
main: {
|
||||
type: "docker",
|
||||
image: "main",
|
||||
entrypoint: "docker_entrypoint.sh",
|
||||
args: [],
|
||||
mounts: {
|
||||
main: "/data",
|
||||
cert: "/mnt/cert",
|
||||
"admin-cert": "/mnt/admin-cert",
|
||||
},
|
||||
},
|
||||
"health-checks": {
|
||||
federation: {
|
||||
name: "Federation",
|
||||
type: "docker",
|
||||
image: "main",
|
||||
system: false,
|
||||
entrypoint: "check-federation.sh",
|
||||
args: [],
|
||||
mounts: {},
|
||||
"io-format": "json",
|
||||
inject: true,
|
||||
},
|
||||
"synapse-admin": {
|
||||
name: "Admin interface",
|
||||
"success-message":
|
||||
"Synapse Admin is ready to be visited in a web browser.",
|
||||
type: "docker",
|
||||
image: "main",
|
||||
system: false,
|
||||
entrypoint: "check-ui.sh",
|
||||
args: [],
|
||||
mounts: {},
|
||||
"io-format": "yaml",
|
||||
inject: true,
|
||||
},
|
||||
"user-signups-off": {
|
||||
name: "User Signups Off",
|
||||
type: "docker",
|
||||
image: "main",
|
||||
system: false,
|
||||
entrypoint: "user-signups-off.sh",
|
||||
args: [],
|
||||
mounts: {},
|
||||
"io-format": "yaml",
|
||||
inject: true,
|
||||
},
|
||||
},
|
||||
config: {
|
||||
get: {
|
||||
type: "script",
|
||||
},
|
||||
set: {
|
||||
type: "script",
|
||||
},
|
||||
},
|
||||
properties: {
|
||||
type: "script",
|
||||
},
|
||||
volumes: {
|
||||
main: {
|
||||
type: "data",
|
||||
},
|
||||
cert: {
|
||||
type: "certificate",
|
||||
"interface-id": "main",
|
||||
},
|
||||
"admin-cert": {
|
||||
type: "certificate",
|
||||
"interface-id": "admin",
|
||||
},
|
||||
},
|
||||
alerts: {
|
||||
start:
|
||||
"After your first run, Synapse needs a little time to establish a stable TOR connection over federation. We kindly ask for your patience during this process. Remember, great things take time! 🕒",
|
||||
},
|
||||
interfaces: {
|
||||
main: {
|
||||
name: "Homeserver Address",
|
||||
description:
|
||||
"Used by clients and other servers to connect with your homeserver",
|
||||
"tor-config": {
|
||||
"port-mapping": {
|
||||
"80": "80",
|
||||
"443": "443",
|
||||
"8448": "8448",
|
||||
},
|
||||
},
|
||||
ui: false,
|
||||
protocols: ["tcp", "http", "matrix"],
|
||||
},
|
||||
admin: {
|
||||
name: "Admin Portal",
|
||||
description: "A web application for administering your Synapse server",
|
||||
"tor-config": {
|
||||
"port-mapping": {
|
||||
"80": "8080",
|
||||
"443": "4433",
|
||||
},
|
||||
},
|
||||
"lan-config": {
|
||||
"443": {
|
||||
ssl: true,
|
||||
internal: 8080,
|
||||
},
|
||||
},
|
||||
ui: true,
|
||||
protocols: ["tcp", "http"],
|
||||
},
|
||||
},
|
||||
dependencies: {},
|
||||
backup: {
|
||||
create: {
|
||||
type: "docker",
|
||||
image: "compat",
|
||||
system: true,
|
||||
entrypoint: "compat",
|
||||
args: ["duplicity", "create", "/mnt/backup", "/data"],
|
||||
mounts: {
|
||||
BACKUP: "/mnt/backup",
|
||||
main: "/data",
|
||||
},
|
||||
},
|
||||
restore: {
|
||||
type: "docker",
|
||||
image: "compat",
|
||||
system: true,
|
||||
entrypoint: "compat",
|
||||
args: ["duplicity", "restore", "/mnt/backup", "/data"],
|
||||
mounts: {
|
||||
BACKUP: "/mnt/backup",
|
||||
main: "/data",
|
||||
},
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
"reset-first-user": {
|
||||
name: "Reset First User",
|
||||
description:
|
||||
"This action will reset the password of the first user in your database to a random value.",
|
||||
"allowed-statuses": ["stopped"],
|
||||
implementation: {
|
||||
type: "docker",
|
||||
image: "main",
|
||||
system: false,
|
||||
entrypoint: "docker_entrypoint.sh",
|
||||
args: ["reset-first-user"],
|
||||
mounts: {
|
||||
main: "/data",
|
||||
},
|
||||
"io-format": "json",
|
||||
},
|
||||
},
|
||||
},
|
||||
migrations: {
|
||||
from: {
|
||||
"*": {
|
||||
type: "script",
|
||||
args: ["from"],
|
||||
},
|
||||
},
|
||||
to: {
|
||||
"*": {
|
||||
type: "script",
|
||||
args: ["to"],
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -750,6 +750,283 @@ exports[`transformConfigSpec transformConfigSpec(nostr) 1`] = `
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`transformConfigSpec transformConfigSpec(nostr2) 1`] = `
|
||||
{
|
||||
"relay-type": {
|
||||
"default": "private",
|
||||
"description": "Private or public. A private relay (highly recommended) restricts write access to specific pubkeys. Anyone can write to a public relay.",
|
||||
"disabled": false,
|
||||
"immutable": false,
|
||||
"name": "Relay Type",
|
||||
"required": true,
|
||||
"type": "union",
|
||||
"variants": {
|
||||
"private": {
|
||||
"name": "Private",
|
||||
"spec": {
|
||||
"pubkey_whitelist": {
|
||||
"default": [],
|
||||
"description": "A list of pubkeys that are permitted to publish through your relay. A minimum, you need to enter your own Nostr hex (not npub) pubkey. Go to https://damus.io/key/ to convert from npub to hex.",
|
||||
"disabled": false,
|
||||
"maxLength": null,
|
||||
"minLength": 1,
|
||||
"name": "Pubkey Whitelist (hex)",
|
||||
"spec": {
|
||||
"generate": null,
|
||||
"inputmode": "text",
|
||||
"masked": false,
|
||||
"maxLength": null,
|
||||
"minLength": null,
|
||||
"patterns": [
|
||||
{
|
||||
"description": "Must be a valid 64-digit hexadecimal value (ie a Nostr hex pubkey, not an npub). Go to https://damus.io/key/ to convert npub to hex.",
|
||||
"regex": "[0-9a-fA-F]{64}",
|
||||
},
|
||||
],
|
||||
"placeholder": "hex (not npub) pubkey",
|
||||
"type": "text",
|
||||
},
|
||||
"type": "list",
|
||||
"warning": null,
|
||||
},
|
||||
},
|
||||
},
|
||||
"public": {
|
||||
"name": "Public",
|
||||
"spec": {
|
||||
"info": {
|
||||
"description": "General public info about your relay",
|
||||
"name": "Relay Info",
|
||||
"spec": {
|
||||
"contact": {
|
||||
"default": null,
|
||||
"description": "The email address of the relay administrator",
|
||||
"disabled": false,
|
||||
"generate": null,
|
||||
"immutable": false,
|
||||
"inputmode": "text",
|
||||
"masked": false,
|
||||
"maxLength": null,
|
||||
"minLength": null,
|
||||
"name": "Admin contact email",
|
||||
"patterns": [
|
||||
{
|
||||
"description": "Must be a valid email address.",
|
||||
"regex": "[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+",
|
||||
},
|
||||
],
|
||||
"placeholder": null,
|
||||
"required": false,
|
||||
"type": "text",
|
||||
"warning": null,
|
||||
},
|
||||
"description": {
|
||||
"default": null,
|
||||
"description": "A more detailed description for your relay",
|
||||
"disabled": false,
|
||||
"generate": null,
|
||||
"immutable": false,
|
||||
"inputmode": "text",
|
||||
"masked": false,
|
||||
"maxLength": null,
|
||||
"minLength": null,
|
||||
"name": "Relay Description",
|
||||
"patterns": [
|
||||
{
|
||||
"description": "Must be at least 6 character and no more than 256 characters",
|
||||
"regex": ".{6,256}",
|
||||
},
|
||||
],
|
||||
"placeholder": "The best relay in town",
|
||||
"required": false,
|
||||
"type": "text",
|
||||
"warning": null,
|
||||
},
|
||||
"name": {
|
||||
"default": null,
|
||||
"description": "Your relay's human-readable identifier",
|
||||
"disabled": false,
|
||||
"generate": null,
|
||||
"immutable": false,
|
||||
"inputmode": "text",
|
||||
"masked": false,
|
||||
"maxLength": null,
|
||||
"minLength": null,
|
||||
"name": "Relay Name",
|
||||
"patterns": [
|
||||
{
|
||||
"description": "Must be at least 3 character and no more than 32 characters",
|
||||
"regex": ".{3,32}",
|
||||
},
|
||||
],
|
||||
"placeholder": "Bob's Public Relay",
|
||||
"required": false,
|
||||
"type": "text",
|
||||
"warning": null,
|
||||
},
|
||||
"pubkey": {
|
||||
"default": null,
|
||||
"description": "The Nostr hex (not npub) pubkey of the relay administrator",
|
||||
"disabled": false,
|
||||
"generate": null,
|
||||
"immutable": false,
|
||||
"inputmode": "text",
|
||||
"masked": false,
|
||||
"maxLength": null,
|
||||
"minLength": null,
|
||||
"name": "Admin contact pubkey (hex)",
|
||||
"patterns": [
|
||||
{
|
||||
"description": "Must be a valid 64-digit hexadecimal value (ie a Nostr hex pubkey, not an npub). Go to https://damus.io/key/ to convert npub to hex.",
|
||||
"regex": "[0-9a-fA-F]{64}",
|
||||
},
|
||||
],
|
||||
"placeholder": "hex (not npub) pubkey",
|
||||
"required": false,
|
||||
"type": "text",
|
||||
"warning": null,
|
||||
},
|
||||
},
|
||||
"type": "object",
|
||||
"warning": null,
|
||||
},
|
||||
"limits": {
|
||||
"description": "Data limits to protect your relay from using too many resources",
|
||||
"name": "Limits",
|
||||
"spec": {
|
||||
"event_kind_blacklist": {
|
||||
"default": [],
|
||||
"description": "Events with these kinds will be discarded. For a list of event kinds, see here: https://github.com/nostr-protocol/nips#event-kinds",
|
||||
"disabled": false,
|
||||
"maxLength": null,
|
||||
"minLength": null,
|
||||
"name": "Event Kind Blacklist",
|
||||
"spec": {
|
||||
"generate": null,
|
||||
"inputmode": "text",
|
||||
"masked": false,
|
||||
"maxLength": null,
|
||||
"minLength": null,
|
||||
"patterns": [
|
||||
{
|
||||
"description": "Integral number type",
|
||||
"regex": "[0-9]+",
|
||||
},
|
||||
],
|
||||
"placeholder": "30023",
|
||||
"type": "text",
|
||||
},
|
||||
"type": "list",
|
||||
"warning": null,
|
||||
},
|
||||
"max_blocking_threads": {
|
||||
"default": 16,
|
||||
"description": "Maximum number of blocking threads used for database connections.",
|
||||
"disabled": false,
|
||||
"immutable": false,
|
||||
"integer": true,
|
||||
"max": null,
|
||||
"min": null,
|
||||
"name": "Max Blocking Threads",
|
||||
"placeholder": null,
|
||||
"required": true,
|
||||
"step": null,
|
||||
"type": "number",
|
||||
"units": "threads",
|
||||
"warning": null,
|
||||
},
|
||||
"max_event_bytes": {
|
||||
"default": 131072,
|
||||
"description": "Limit the maximum size of an EVENT message. Set to 0 for unlimited",
|
||||
"disabled": false,
|
||||
"immutable": false,
|
||||
"integer": true,
|
||||
"max": null,
|
||||
"min": null,
|
||||
"name": "Max Event Size",
|
||||
"placeholder": null,
|
||||
"required": true,
|
||||
"step": null,
|
||||
"type": "number",
|
||||
"units": "bytes",
|
||||
"warning": null,
|
||||
},
|
||||
"max_ws_frame_bytes": {
|
||||
"default": 131072,
|
||||
"description": "Maximum WebSocket frame size in bytes.",
|
||||
"disabled": false,
|
||||
"immutable": false,
|
||||
"integer": true,
|
||||
"max": null,
|
||||
"min": null,
|
||||
"name": "Max Websocket Frame Size",
|
||||
"placeholder": null,
|
||||
"required": true,
|
||||
"step": null,
|
||||
"type": "number",
|
||||
"units": "bytes",
|
||||
"warning": null,
|
||||
},
|
||||
"max_ws_message_bytes": {
|
||||
"default": 131072,
|
||||
"description": "Maximum WebSocket message in bytes.",
|
||||
"disabled": false,
|
||||
"immutable": false,
|
||||
"integer": true,
|
||||
"max": null,
|
||||
"min": null,
|
||||
"name": "Max Websocket Message Size",
|
||||
"placeholder": null,
|
||||
"required": true,
|
||||
"step": null,
|
||||
"type": "number",
|
||||
"units": "bytes",
|
||||
"warning": null,
|
||||
},
|
||||
"messages_per_sec": {
|
||||
"default": 2,
|
||||
"description": "Limit events created per second, averaged over one minute. Note: this is for the server as a whole, not per connection.",
|
||||
"disabled": false,
|
||||
"immutable": false,
|
||||
"integer": true,
|
||||
"max": null,
|
||||
"min": 1,
|
||||
"name": "Messages Per Second Limit",
|
||||
"placeholder": null,
|
||||
"required": true,
|
||||
"step": null,
|
||||
"type": "number",
|
||||
"units": "messages/sec",
|
||||
"warning": null,
|
||||
},
|
||||
"subscriptions_per_min": {
|
||||
"default": 10,
|
||||
"description": "Limit client subscriptions created per second, averaged over one minute. Strongly recommended to set this to a low value such as 10 to ensure fair service.",
|
||||
"disabled": false,
|
||||
"immutable": false,
|
||||
"integer": true,
|
||||
"max": null,
|
||||
"min": 1,
|
||||
"name": "Subscriptions Per Minute Limit",
|
||||
"placeholder": null,
|
||||
"required": true,
|
||||
"step": null,
|
||||
"type": "number",
|
||||
"units": "subscriptions",
|
||||
"warning": null,
|
||||
},
|
||||
},
|
||||
"type": "object",
|
||||
"warning": null,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"warning": null,
|
||||
},
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`transformConfigSpec transformConfigSpec(searNXG) 1`] = `
|
||||
{
|
||||
"enable-metrics": {
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
import { matchManifest } from "./matchManifest"
|
||||
import giteaManifest from "./__fixtures__/giteaManifest"
|
||||
import synapseManifest from "./__fixtures__/synapseManifest"
|
||||
|
||||
describe("matchManifest", () => {
|
||||
test("gittea", () => {
|
||||
matchManifest.unsafeCast(giteaManifest)
|
||||
})
|
||||
test("synapse", () => {
|
||||
matchManifest.unsafeCast(synapseManifest)
|
||||
})
|
||||
})
|
||||
@@ -55,10 +55,13 @@ export const matchManifest = object(
|
||||
string,
|
||||
every(
|
||||
matchProcedure,
|
||||
object({
|
||||
name: string,
|
||||
["success-message"]: string,
|
||||
}),
|
||||
object(
|
||||
{
|
||||
name: string,
|
||||
["success-message"]: string,
|
||||
},
|
||||
["success-message"],
|
||||
),
|
||||
),
|
||||
]),
|
||||
config: object({
|
||||
|
||||
@@ -3,6 +3,7 @@ import fixtureEmbasyPagesConfig from "./__fixtures__/embasyPagesConfig"
|
||||
import searNXG from "./__fixtures__/searNXG"
|
||||
import bitcoind from "./__fixtures__/bitcoind"
|
||||
import nostr from "./__fixtures__/nostr"
|
||||
import nostrConfig2 from "./__fixtures__/nostrConfig2"
|
||||
|
||||
describe("transformConfigSpec", () => {
|
||||
test("matchOldConfigSpec(embassyPages.homepage.variants[web-page])", () => {
|
||||
@@ -30,4 +31,8 @@ describe("transformConfigSpec", () => {
|
||||
const spec = matchOldConfigSpec.unsafeCast(nostr)
|
||||
expect(transformConfigSpec(spec)).toMatchSnapshot()
|
||||
})
|
||||
test("transformConfigSpec(nostr2)", () => {
|
||||
const spec = matchOldConfigSpec.unsafeCast(nostrConfig2)
|
||||
expect(transformConfigSpec(spec)).toMatchSnapshot()
|
||||
})
|
||||
})
|
||||
|
||||
@@ -74,7 +74,7 @@ export function transformConfigSpec(oldSpec: OldConfigSpec): CT.InputSpec {
|
||||
integer: oldVal.integral,
|
||||
step: null,
|
||||
units: oldVal.units || null,
|
||||
placeholder: oldVal.placeholder || null,
|
||||
placeholder: oldVal.placeholder ? String(oldVal.placeholder) : null,
|
||||
}
|
||||
} else if (oldVal.type === "object") {
|
||||
newVal = {
|
||||
@@ -267,6 +267,31 @@ function getListSpec(
|
||||
{},
|
||||
),
|
||||
}
|
||||
} else if (isNumberList(oldVal)) {
|
||||
return {
|
||||
...partial,
|
||||
type: "list",
|
||||
default: oldVal.default.map(String) as string[],
|
||||
spec: {
|
||||
type: "text",
|
||||
patterns: oldVal.spec.integral
|
||||
? [{ regex: "[0-9]+", description: "Integral number type" }]
|
||||
: [
|
||||
{
|
||||
regex: "[-+]?[0-9]*\\.?[0-9]+",
|
||||
description: "Number type",
|
||||
},
|
||||
],
|
||||
minLength: null,
|
||||
maxLength: null,
|
||||
masked: false,
|
||||
generate: null,
|
||||
inputmode: "text",
|
||||
placeholder: oldVal.spec.placeholder
|
||||
? String(oldVal.spec.placeholder)
|
||||
: null,
|
||||
},
|
||||
}
|
||||
} else if (isStringList(oldVal)) {
|
||||
return {
|
||||
...partial,
|
||||
@@ -337,11 +362,16 @@ function isStringList(
|
||||
): val is OldValueSpecList & { subtype: "string" } {
|
||||
return val.subtype === "string"
|
||||
}
|
||||
function isNumberList(
|
||||
val: OldValueSpecList,
|
||||
): val is OldValueSpecList & { subtype: "number" } {
|
||||
return val.subtype === "number"
|
||||
}
|
||||
|
||||
function isObjectList(
|
||||
val: OldValueSpecList,
|
||||
): val is OldValueSpecList & { subtype: "object" } {
|
||||
if (["number", "union"].includes(val.subtype)) {
|
||||
if (["union"].includes(val.subtype)) {
|
||||
throw new Error("Invalid list subtype. enum, string, and object permitted.")
|
||||
}
|
||||
return val.subtype === "object"
|
||||
@@ -398,7 +428,7 @@ export const matchOldValueSpecNumber = object(
|
||||
description: string,
|
||||
warning: string,
|
||||
units: string,
|
||||
placeholder: string,
|
||||
placeholder: anyOf(number, string),
|
||||
},
|
||||
["default", "description", "warning", "units", "placeholder"],
|
||||
)
|
||||
@@ -499,6 +529,15 @@ const matchOldListValueSpecEnum = object({
|
||||
values: array(string),
|
||||
"value-names": dictionary([string, string]),
|
||||
})
|
||||
const matchOldListValueSpecNumber = object(
|
||||
{
|
||||
range: string,
|
||||
integral: boolean,
|
||||
units: string,
|
||||
placeholder: anyOf(number, string),
|
||||
},
|
||||
["units", "placeholder"],
|
||||
)
|
||||
|
||||
// represents a spec for a list
|
||||
const matchOldValueSpecList = every(
|
||||
@@ -531,6 +570,10 @@ const matchOldValueSpecList = every(
|
||||
subtype: literals("object"),
|
||||
spec: matchOldListValueSpecObject,
|
||||
}),
|
||||
object({
|
||||
subtype: literals("number"),
|
||||
spec: matchOldListValueSpecNumber,
|
||||
}),
|
||||
),
|
||||
)
|
||||
type OldValueSpecList = typeof matchOldValueSpecList._TYPE
|
||||
|
||||
Reference in New Issue
Block a user