cyberia 3.2.12 → 3.2.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +127 -68
- package/.github/workflows/cyberia-client.cd.yml +40 -0
- package/.github/workflows/cyberia-server.cd.yml +40 -0
- package/.github/workflows/docker-image.cyberia-client.ci.yml +49 -0
- package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +48 -0
- package/.github/workflows/docker-image.cyberia-server.ci.yml +69 -0
- package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +69 -0
- package/.github/workflows/docker-image.engine-cyberia.ci.yml +52 -0
- package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +52 -0
- package/.github/workflows/engine-cyberia.cd.yml +34 -24
- package/.github/workflows/engine-cyberia.ci.yml +27 -5
- package/.github/workflows/ghpkg.ci.yml +89 -1
- package/.github/workflows/gitlab.ci.yml +1 -1
- package/.github/workflows/hardhat.ci.yml +1 -1
- package/.github/workflows/npmpkg.ci.yml +19 -12
- package/.github/workflows/publish.ci.yml +2 -2
- package/.github/workflows/publish.cyberia.ci.yml +5 -16
- package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -8
- package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
- package/CHANGELOG.md +451 -1
- package/CLI-HELP.md +1040 -1130
- package/Dockerfile +141 -43
- package/Dockerfile.dev +143 -0
- package/Dockerfile.test +165 -0
- package/README.md +1 -1
- package/baremetal/commission-workflows.json +1 -0
- package/bin/build.js +128 -136
- package/bin/build.template.js +25 -179
- package/bin/cyberia.js +1089 -188
- package/bin/deploy.js +6 -3
- package/bin/index.js +1089 -188
- package/bump.config.js +1 -0
- package/compose.env +131 -0
- package/conf.js +19 -1
- package/deployment.yaml +74 -2
- package/docker-compose.yml +316 -0
- package/hardhat/hardhat.config.js +2 -2
- package/hardhat/package-lock.json +620 -2041
- package/hardhat/package.json +7 -5
- package/hardhat/scripts/deployObjectLayerToken.js +18 -18
- package/hardhat/test/ObjectLayerToken.js +378 -274
- package/ipfs/configure-ipfs.sh +13 -0
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +74 -2
- package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
- package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/mongodb/entrypoint.sh +76 -0
- package/nginx.conf +87 -0
- package/package.json +34 -22
- package/pv-pvc.yaml +32 -0
- package/scripts/disk-clean.sh +85 -60
- package/scripts/kubeadm-node-setup.sh +317 -0
- package/scripts/link-local-underpost-cli.sh +6 -0
- package/scripts/rocky-kickstart.sh +877 -185
- package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
- package/scripts/test-monitor.sh +248 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
- package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
- package/src/api/cyberia-action/cyberia-action.model.js +21 -29
- package/src/api/cyberia-action/cyberia-action.router.js +42 -7
- package/src/api/cyberia-action/cyberia-action.service.js +20 -4
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
- package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
- package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
- package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
- package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
- package/src/api/cyberia-map/cyberia-map.router.js +21 -6
- package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
- package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
- package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
- package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
- package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
- package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -122
- package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
- package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
- package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
- package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
- package/src/api/ipfs/ipfs.service.js +28 -15
- package/src/api/object-layer/object-layer.router.js +25 -15
- package/src/api/object-layer/object-layer.service.js +15 -20
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
- package/src/cli/baremetal.js +717 -16
- package/src/cli/cluster.js +80 -5
- package/src/cli/deploy.js +326 -292
- package/src/cli/docker-compose.js +648 -0
- package/src/cli/env.js +12 -6
- package/src/cli/fs.js +75 -30
- package/src/cli/image.js +187 -55
- package/src/cli/index.js +157 -6
- package/src/cli/kickstart.js +142 -20
- package/src/cli/monitor.js +387 -6
- package/src/cli/release.js +72 -15
- package/src/cli/repository.js +339 -40
- package/src/cli/run.js +678 -186
- package/src/cli/secrets.js +82 -48
- package/src/cli/ssh.js +234 -0
- package/src/cli/static.js +2 -2
- package/src/client/components/core/PanelForm.js +44 -44
- package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
- package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
- package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
- package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
- package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +92 -20
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +272 -50
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
- package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
- package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +28 -12
- package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +27 -5
- package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
- package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
- package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
- package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
- package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
- package/src/client/services/object-layer/object-layer.management.js +6 -6
- package/src/{server → client-builder}/client-build-docs.js +15 -5
- package/src/{server → client-builder}/client-build-live.js +3 -3
- package/src/{server → client-builder}/client-build.js +25 -22
- package/src/{server → client-builder}/client-dev-server.js +3 -3
- package/src/{server → client-builder}/client-icons.js +2 -2
- package/src/{server → client-builder}/ssr.js +5 -5
- package/src/client.build.js +1 -3
- package/src/client.dev.js +1 -1
- package/src/db/mongo/MongoBootstrap.js +12 -12
- package/src/db/mongo/MongooseDB.js +2 -1
- package/src/grpc/cyberia/grpc-server.js +255 -70
- package/src/index.js +12 -1
- package/src/mailer/EmailRender.js +1 -1
- package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
- package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
- package/src/projects/cyberia/catalog-cyberia.js +81 -0
- package/src/projects/cyberia/gemini-client.js +175 -0
- package/src/projects/cyberia/generate-saga.js +2107 -0
- package/src/{server → projects/cyberia}/ipfs-client.js +6 -4
- package/src/{server → projects/cyberia}/object-layer.js +12 -108
- package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
- package/src/{server → projects/cyberia}/shape-generator.js +2 -2
- package/src/projects/underpost/catalog-underpost.js +60 -0
- package/src/runtime/cyberia-client/Dockerfile +31 -83
- package/src/runtime/cyberia-client/Dockerfile.dev +23 -30
- package/src/runtime/cyberia-server/Dockerfile +23 -42
- package/src/runtime/cyberia-server/Dockerfile.dev +20 -35
- package/src/runtime/engine-cyberia/Dockerfile +143 -0
- package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
- package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
- package/src/runtime/engine-cyberia/compose.env +131 -0
- package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
- package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
- package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
- package/src/runtime/engine-cyberia/nginx.conf +87 -0
- package/src/runtime/express/Express.js +2 -2
- package/src/runtime/nginx/Nginx.js +250 -0
- package/src/runtime/wp/Dockerfile +3 -3
- package/src/server/catalog.js +72 -0
- package/src/server/conf.js +415 -60
- package/src/server/runtime-status.js +252 -0
- package/src/server/start.js +42 -11
- package/src/server.js +6 -2
- package/test/cyberia-instance-conf-defaults.test.js +140 -0
- package/test/deploy-monitor.test.js +267 -0
- package/test/shape-generator.test.js +7 -1
- package/typedoc.dd-cyberia.json +3 -1
- package/typedoc.json +3 -1
- package/manifests/deployment/dd-test-development/deployment.yaml +0 -256
- package/manifests/deployment/dd-test-development/proxy.yaml +0 -102
- /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
- /package/src/{server → client-builder}/client-formatted.js +0 -0
|
@@ -10,7 +10,7 @@ The Quest System is a **chain/tree-structured progression framework** linking NP
|
|
|
10
10
|
|
|
11
11
|
Quests are defined server-side as MongoDB documents and delivered to the client through the Engine REST API. Progress is tracked per-player in `CyberiaQuestProgress` documents.
|
|
12
12
|
|
|
13
|
-
> **Implementation status —
|
|
13
|
+
> **Implementation status — Alpha (talk / collect / kill):** The Quest and QuestProgress MongoDB schemas and Engine REST API (`src/api/cyberia-quest`, `src/api/cyberia-quest-progress`) are defined and seeded. The Go server fetches quest definitions at instance init and evaluates **all three** objective types authoritatively: `talk` (on `dlg_complete`), `kill` (on victim death, matched by the victim's active skin), and `collect` (idempotent inventory reconcile on item/coin gain). It grants quests — gated by `prerequisiteCodes` (AND logic) — advances steps, delivers rewards via FCT, and unlocks successors on completion. Live progress is pushed to the client over the `dlg_ack` envelope outside the dialogue flow. Quest progress is authoritative **per Go session** (in-memory) and best-effort mirrored to `POST /api/cyberia-quest-progress`; it resets on reconnect. The C client surfaces it through the **Quest Journal** and the **action tab** (offer + reward item slots), populated from the engine REST metadata endpoint `GET /api/cyberia-quest/code/:code` (which falls back to the canonical defaults so the procedural fallback world is playable without a seed).
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
@@ -81,9 +81,9 @@ CyberiaQuestProgress {
|
|
|
81
81
|
|
|
82
82
|
| `type` | `itemId` semantics | Completion trigger |
|
|
83
83
|
| --------- | -------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
84
|
-
| `collect` | ObjectLayer item ID that must appear in the player's inventory | Player inventory
|
|
85
|
-
| `talk` |
|
|
86
|
-
| `kill` | Skin item ID of the target entity (e.g. `"
|
|
84
|
+
| `collect` | ObjectLayer item ID that must appear in the player's inventory | Player inventory holds `>= quantity` of `itemId` (coins via the flat balance) — reconciled on every gain |
|
|
85
|
+
| `talk` | Active **skin** item ID of the NPC to interact with | Player completes a `dlg_complete` whose NPC active skin `=== itemId` and `dialogCode ∈ questDialogueCodes` |
|
|
86
|
+
| `kill` | Skin item ID of the target entity (e.g. `"scp-2040"`) | Player kills an entity whose active skin matches `itemId` |
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
@@ -119,7 +119,7 @@ sequenceDiagram
|
|
|
119
119
|
participant E as Engine (Node.js)
|
|
120
120
|
participant DB as MongoDB
|
|
121
121
|
|
|
122
|
-
P->>G: Tap NPC
|
|
122
|
+
P->>G: Tap NPC + Take Quest (quest_accept) — quest bound to the NPC's cell
|
|
123
123
|
G->>E: POST /api/cyberia-quest-progress (grant quest)
|
|
124
124
|
E->>DB: Create CyberiaQuestProgress { status: 'active' }
|
|
125
125
|
E-->>G: Progress document
|
|
@@ -168,6 +168,28 @@ On quest completion, the Engine grants each `rewards[].{itemId, quantity}` to th
|
|
|
168
168
|
|
|
169
169
|
---
|
|
170
170
|
|
|
171
|
+
## Quest Journal (client)
|
|
172
|
+
|
|
173
|
+
The C client keeps a local `quest_store` (in `cyberia-client/src/ui/quest_store.c`)
|
|
174
|
+
populated from two server sources — **no extra REST calls**:
|
|
175
|
+
|
|
176
|
+
- `init_data.quests[]` — the player's active/completed snapshot on connect.
|
|
177
|
+
- `dlg_ack.quests[]` — live upserts as quests are granted or completed.
|
|
178
|
+
|
|
179
|
+
The **Quest Journal** modal (`ui/quest_journal.c`) renders this store on the
|
|
180
|
+
right side below the map info modal: a three-section tree (Active / Completed /
|
|
181
|
+
Failed), each section independently collapsible via the shared `ui_toggle`
|
|
182
|
+
component, each with its own 10-per-page pagination cursor. The interaction
|
|
183
|
+
bubble column on the left is collapsible by the same toggle pattern. Both panels
|
|
184
|
+
default collapsed on screens narrower than 600 px. Collapse state is not
|
|
185
|
+
persisted across sessions.
|
|
186
|
+
|
|
187
|
+
Each server quest snapshot entry carries `{ code, title, description, status,
|
|
188
|
+
activeStep, objectivesText }` so the journal can render rows and inline detail
|
|
189
|
+
without re-fetching the quest definition.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
171
193
|
## Indexes
|
|
172
194
|
|
|
173
195
|
```javascript
|
package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Auth } from '../../components/core/Auth.js';
|
|
2
|
+
import { loggerFactory } from '../../components/core/Logger.js';
|
|
3
|
+
import { getApiBaseUrl, headersFactory, payloadFactory, buildQueryUrl } from '../core/core.service.js';
|
|
4
|
+
const logger = loggerFactory(import.meta);
|
|
5
|
+
logger.info('Load service');
|
|
6
|
+
const endpoint = 'cyberia-entity-type-default';
|
|
7
|
+
class CyberiaEntityTypeDefaultService {
|
|
8
|
+
static post = (options = { id: '', body: {} }) =>
|
|
9
|
+
new Promise((resolve, reject) =>
|
|
10
|
+
fetch(getApiBaseUrl({ id: options.id, endpoint }), {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: headersFactory(),
|
|
13
|
+
credentials: 'include',
|
|
14
|
+
body: payloadFactory(options.body),
|
|
15
|
+
})
|
|
16
|
+
.then(async (res) => {
|
|
17
|
+
return await res.json();
|
|
18
|
+
})
|
|
19
|
+
.then((res) => {
|
|
20
|
+
logger.info(res);
|
|
21
|
+
return resolve(res);
|
|
22
|
+
})
|
|
23
|
+
.catch((error) => {
|
|
24
|
+
logger.error(error);
|
|
25
|
+
return reject(error);
|
|
26
|
+
}),
|
|
27
|
+
);
|
|
28
|
+
static put = (options = { id: '', body: {} }) =>
|
|
29
|
+
new Promise((resolve, reject) =>
|
|
30
|
+
fetch(getApiBaseUrl({ id: options.id, endpoint }), {
|
|
31
|
+
method: 'PUT',
|
|
32
|
+
headers: headersFactory(),
|
|
33
|
+
credentials: 'include',
|
|
34
|
+
body: payloadFactory(options.body),
|
|
35
|
+
})
|
|
36
|
+
.then(async (res) => {
|
|
37
|
+
return await res.json();
|
|
38
|
+
})
|
|
39
|
+
.then((res) => {
|
|
40
|
+
logger.info(res);
|
|
41
|
+
return resolve(res);
|
|
42
|
+
})
|
|
43
|
+
.catch((error) => {
|
|
44
|
+
logger.error(error);
|
|
45
|
+
return reject(error);
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
static get = (options = {}) => {
|
|
49
|
+
const { id, page, limit, filterModel, sortModel, sort, asc, order } = options;
|
|
50
|
+
const url = buildQueryUrl(getApiBaseUrl({ id, endpoint }), {
|
|
51
|
+
page,
|
|
52
|
+
limit,
|
|
53
|
+
filterModel,
|
|
54
|
+
sortModel,
|
|
55
|
+
sort,
|
|
56
|
+
asc,
|
|
57
|
+
order,
|
|
58
|
+
});
|
|
59
|
+
return new Promise((resolve, reject) =>
|
|
60
|
+
fetch(url.toString(), {
|
|
61
|
+
method: 'GET',
|
|
62
|
+
headers: headersFactory(),
|
|
63
|
+
credentials: 'include',
|
|
64
|
+
})
|
|
65
|
+
.then(async (res) => {
|
|
66
|
+
return await res.json();
|
|
67
|
+
})
|
|
68
|
+
.then((res) => {
|
|
69
|
+
logger.info(res);
|
|
70
|
+
return resolve(res);
|
|
71
|
+
})
|
|
72
|
+
.catch((error) => {
|
|
73
|
+
logger.error(error);
|
|
74
|
+
return reject(error);
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
static delete = (options = { id: '', body: {} }) =>
|
|
79
|
+
new Promise((resolve, reject) =>
|
|
80
|
+
fetch(getApiBaseUrl({ id: options.id, endpoint }), {
|
|
81
|
+
method: 'DELETE',
|
|
82
|
+
headers: headersFactory(),
|
|
83
|
+
credentials: 'include',
|
|
84
|
+
body: payloadFactory(options.body),
|
|
85
|
+
})
|
|
86
|
+
.then(async (res) => {
|
|
87
|
+
return await res.json();
|
|
88
|
+
})
|
|
89
|
+
.then((res) => {
|
|
90
|
+
logger.info(res);
|
|
91
|
+
return resolve(res);
|
|
92
|
+
})
|
|
93
|
+
.catch((error) => {
|
|
94
|
+
logger.error(error);
|
|
95
|
+
return reject(error);
|
|
96
|
+
}),
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
export { CyberiaEntityTypeDefaultService };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BtnIcon } from '../../components/core/BtnIcon.js';
|
|
2
|
-
import { getId,
|
|
2
|
+
import { getId, commonModeratorGuard, commonAdminGuard } from '../../components/core/CommonJs.js';
|
|
3
3
|
import { EventsUI } from '../../components/core/EventsUI.js';
|
|
4
4
|
import { NotificationManager } from '../../components/core/NotificationManager.js';
|
|
5
5
|
import { s } from '../../components/core/VanillaJs.js';
|
|
@@ -118,7 +118,7 @@ class CyberiaInstanceManagement {
|
|
|
118
118
|
entity: 'cyberia-instance',
|
|
119
119
|
permissions: {
|
|
120
120
|
add: false,
|
|
121
|
-
remove:
|
|
121
|
+
remove: commonModeratorGuard(role),
|
|
122
122
|
reload: true,
|
|
123
123
|
},
|
|
124
124
|
usePagination: true,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BtnIcon } from '../../components/core/BtnIcon.js';
|
|
2
|
-
import { getId,
|
|
2
|
+
import { getId, commonModeratorGuard, commonAdminGuard } from '../../components/core/CommonJs.js';
|
|
3
3
|
import { EventsUI } from '../../components/core/EventsUI.js';
|
|
4
4
|
import { NotificationManager } from '../../components/core/NotificationManager.js';
|
|
5
5
|
import { s } from '../../components/core/VanillaJs.js';
|
|
@@ -118,7 +118,7 @@ class CyberiaMapManagement {
|
|
|
118
118
|
entity: 'cyberia-map',
|
|
119
119
|
permissions: {
|
|
120
120
|
add: false,
|
|
121
|
-
remove:
|
|
121
|
+
remove: commonModeratorGuard(role),
|
|
122
122
|
reload: true,
|
|
123
123
|
},
|
|
124
124
|
usePagination: true,
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Auth } from '../../components/core/Auth.js';
|
|
2
|
+
import { loggerFactory } from '../../components/core/Logger.js';
|
|
3
|
+
import { getApiBaseUrl, headersFactory, payloadFactory, buildQueryUrl } from '../core/core.service.js';
|
|
4
|
+
const logger = loggerFactory(import.meta);
|
|
5
|
+
logger.info('Load service');
|
|
6
|
+
const endpoint = 'cyberia-saga';
|
|
7
|
+
class CyberiaSagaService {
|
|
8
|
+
static post = (options = { id: '', body: {} }) =>
|
|
9
|
+
new Promise((resolve, reject) =>
|
|
10
|
+
fetch(getApiBaseUrl({ id: options.id, endpoint }), {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: headersFactory(),
|
|
13
|
+
credentials: 'include',
|
|
14
|
+
body: payloadFactory(options.body),
|
|
15
|
+
})
|
|
16
|
+
.then(async (res) => {
|
|
17
|
+
return await res.json();
|
|
18
|
+
})
|
|
19
|
+
.then((res) => {
|
|
20
|
+
logger.info(res);
|
|
21
|
+
return resolve(res);
|
|
22
|
+
})
|
|
23
|
+
.catch((error) => {
|
|
24
|
+
logger.error(error);
|
|
25
|
+
return reject(error);
|
|
26
|
+
}),
|
|
27
|
+
);
|
|
28
|
+
static put = (options = { id: '', body: {} }) =>
|
|
29
|
+
new Promise((resolve, reject) =>
|
|
30
|
+
fetch(getApiBaseUrl({ id: options.id, endpoint }), {
|
|
31
|
+
method: 'PUT',
|
|
32
|
+
headers: headersFactory(),
|
|
33
|
+
credentials: 'include',
|
|
34
|
+
body: payloadFactory(options.body),
|
|
35
|
+
})
|
|
36
|
+
.then(async (res) => {
|
|
37
|
+
return await res.json();
|
|
38
|
+
})
|
|
39
|
+
.then((res) => {
|
|
40
|
+
logger.info(res);
|
|
41
|
+
return resolve(res);
|
|
42
|
+
})
|
|
43
|
+
.catch((error) => {
|
|
44
|
+
logger.error(error);
|
|
45
|
+
return reject(error);
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
static get = (options = {}) => {
|
|
49
|
+
const { id, page, limit, filterModel, sortModel, sort, asc, order } = options;
|
|
50
|
+
const url = buildQueryUrl(getApiBaseUrl({ id, endpoint }), {
|
|
51
|
+
page,
|
|
52
|
+
limit,
|
|
53
|
+
filterModel,
|
|
54
|
+
sortModel,
|
|
55
|
+
sort,
|
|
56
|
+
asc,
|
|
57
|
+
order,
|
|
58
|
+
});
|
|
59
|
+
return new Promise((resolve, reject) =>
|
|
60
|
+
fetch(url.toString(), {
|
|
61
|
+
method: 'GET',
|
|
62
|
+
headers: headersFactory(),
|
|
63
|
+
credentials: 'include',
|
|
64
|
+
})
|
|
65
|
+
.then(async (res) => {
|
|
66
|
+
return await res.json();
|
|
67
|
+
})
|
|
68
|
+
.then((res) => {
|
|
69
|
+
logger.info(res);
|
|
70
|
+
return resolve(res);
|
|
71
|
+
})
|
|
72
|
+
.catch((error) => {
|
|
73
|
+
logger.error(error);
|
|
74
|
+
return reject(error);
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
static delete = (options = { id: '', body: {} }) =>
|
|
79
|
+
new Promise((resolve, reject) =>
|
|
80
|
+
fetch(getApiBaseUrl({ id: options.id, endpoint }), {
|
|
81
|
+
method: 'DELETE',
|
|
82
|
+
headers: headersFactory(),
|
|
83
|
+
credentials: 'include',
|
|
84
|
+
body: payloadFactory(options.body),
|
|
85
|
+
})
|
|
86
|
+
.then(async (res) => {
|
|
87
|
+
return await res.json();
|
|
88
|
+
})
|
|
89
|
+
.then((res) => {
|
|
90
|
+
logger.info(res);
|
|
91
|
+
return resolve(res);
|
|
92
|
+
})
|
|
93
|
+
.catch((error) => {
|
|
94
|
+
logger.error(error);
|
|
95
|
+
return reject(error);
|
|
96
|
+
}),
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
export { CyberiaSagaService };
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Auth } from '../../components/core/Auth.js';
|
|
2
|
+
import { loggerFactory } from '../../components/core/Logger.js';
|
|
3
|
+
import { getApiBaseUrl, headersFactory, payloadFactory, buildQueryUrl } from '../core/core.service.js';
|
|
4
|
+
const logger = loggerFactory(import.meta);
|
|
5
|
+
logger.info('Load service');
|
|
6
|
+
const endpoint = 'cyberia-skill';
|
|
7
|
+
class CyberiaSkillService {
|
|
8
|
+
static post = (options = { id: '', body: {} }) =>
|
|
9
|
+
new Promise((resolve, reject) =>
|
|
10
|
+
fetch(getApiBaseUrl({ id: options.id, endpoint }), {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: headersFactory(),
|
|
13
|
+
credentials: 'include',
|
|
14
|
+
body: payloadFactory(options.body),
|
|
15
|
+
})
|
|
16
|
+
.then(async (res) => {
|
|
17
|
+
return await res.json();
|
|
18
|
+
})
|
|
19
|
+
.then((res) => {
|
|
20
|
+
logger.info(res);
|
|
21
|
+
return resolve(res);
|
|
22
|
+
})
|
|
23
|
+
.catch((error) => {
|
|
24
|
+
logger.error(error);
|
|
25
|
+
return reject(error);
|
|
26
|
+
}),
|
|
27
|
+
);
|
|
28
|
+
static put = (options = { id: '', body: {} }) =>
|
|
29
|
+
new Promise((resolve, reject) =>
|
|
30
|
+
fetch(getApiBaseUrl({ id: options.id, endpoint }), {
|
|
31
|
+
method: 'PUT',
|
|
32
|
+
headers: headersFactory(),
|
|
33
|
+
credentials: 'include',
|
|
34
|
+
body: payloadFactory(options.body),
|
|
35
|
+
})
|
|
36
|
+
.then(async (res) => {
|
|
37
|
+
return await res.json();
|
|
38
|
+
})
|
|
39
|
+
.then((res) => {
|
|
40
|
+
logger.info(res);
|
|
41
|
+
return resolve(res);
|
|
42
|
+
})
|
|
43
|
+
.catch((error) => {
|
|
44
|
+
logger.error(error);
|
|
45
|
+
return reject(error);
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
static get = (options = {}) => {
|
|
49
|
+
const { id, page, limit, filterModel, sortModel, sort, asc, order } = options;
|
|
50
|
+
const url = buildQueryUrl(getApiBaseUrl({ id, endpoint }), {
|
|
51
|
+
page,
|
|
52
|
+
limit,
|
|
53
|
+
filterModel,
|
|
54
|
+
sortModel,
|
|
55
|
+
sort,
|
|
56
|
+
asc,
|
|
57
|
+
order,
|
|
58
|
+
});
|
|
59
|
+
return new Promise((resolve, reject) =>
|
|
60
|
+
fetch(url.toString(), {
|
|
61
|
+
method: 'GET',
|
|
62
|
+
headers: headersFactory(),
|
|
63
|
+
credentials: 'include',
|
|
64
|
+
})
|
|
65
|
+
.then(async (res) => {
|
|
66
|
+
return await res.json();
|
|
67
|
+
})
|
|
68
|
+
.then((res) => {
|
|
69
|
+
logger.info(res);
|
|
70
|
+
return resolve(res);
|
|
71
|
+
})
|
|
72
|
+
.catch((error) => {
|
|
73
|
+
logger.error(error);
|
|
74
|
+
return reject(error);
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
static delete = (options = { id: '', body: {} }) =>
|
|
79
|
+
new Promise((resolve, reject) =>
|
|
80
|
+
fetch(getApiBaseUrl({ id: options.id, endpoint }), {
|
|
81
|
+
method: 'DELETE',
|
|
82
|
+
headers: headersFactory(),
|
|
83
|
+
credentials: 'include',
|
|
84
|
+
body: payloadFactory(options.body),
|
|
85
|
+
})
|
|
86
|
+
.then(async (res) => {
|
|
87
|
+
return await res.json();
|
|
88
|
+
})
|
|
89
|
+
.then((res) => {
|
|
90
|
+
logger.info(res);
|
|
91
|
+
return resolve(res);
|
|
92
|
+
})
|
|
93
|
+
.catch((error) => {
|
|
94
|
+
logger.error(error);
|
|
95
|
+
return reject(error);
|
|
96
|
+
}),
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
export { CyberiaSkillService };
|
|
@@ -283,10 +283,10 @@ class ObjectLayerManagement {
|
|
|
283
283
|
{
|
|
284
284
|
field: 'data.item.id',
|
|
285
285
|
headerName: 'Item ID',
|
|
286
|
-
editable: role
|
|
286
|
+
editable: commonModeratorGuard(role),
|
|
287
287
|
},
|
|
288
|
-
{ field: 'data.item.type', headerName: 'Item Type', editable: role
|
|
289
|
-
{ field: 'data.item.description', headerName: 'Description', flex: 1, editable: role
|
|
288
|
+
{ field: 'data.item.type', headerName: 'Item Type', editable: commonModeratorGuard(role) },
|
|
289
|
+
{ field: 'data.item.description', headerName: 'Description', flex: 1, editable: commonModeratorGuard(role) },
|
|
290
290
|
{
|
|
291
291
|
field: 'data.ledger.type',
|
|
292
292
|
headerName: 'Ledger Type',
|
|
@@ -306,7 +306,7 @@ class ObjectLayerManagement {
|
|
|
306
306
|
},
|
|
307
307
|
{
|
|
308
308
|
field: 'data.render.cid',
|
|
309
|
-
headerName: '
|
|
309
|
+
headerName: 'render CID',
|
|
310
310
|
width: 160,
|
|
311
311
|
cellRenderer: AtlasCidRenderer,
|
|
312
312
|
editable: false,
|
|
@@ -315,7 +315,7 @@ class ObjectLayerManagement {
|
|
|
315
315
|
},
|
|
316
316
|
{
|
|
317
317
|
field: 'data.render.metadataCid',
|
|
318
|
-
headerName: '
|
|
318
|
+
headerName: 'render Metadata CID',
|
|
319
319
|
width: 160,
|
|
320
320
|
cellRenderer: MetadataCidRenderer,
|
|
321
321
|
editable: false,
|
|
@@ -369,7 +369,7 @@ class ObjectLayerManagement {
|
|
|
369
369
|
serviceId,
|
|
370
370
|
entity: 'object-layer',
|
|
371
371
|
permissions: {
|
|
372
|
-
add:
|
|
372
|
+
add: commonModeratorGuard(role),
|
|
373
373
|
remove: false,
|
|
374
374
|
reload: commonUserGuard(role),
|
|
375
375
|
},
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Module for building project documentation (JSDoc, Swagger, Coverage).
|
|
5
|
-
* @module src/
|
|
5
|
+
* @module src/client-builder/client-build-docs.js
|
|
6
6
|
* @namespace clientBuildDocs
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import fs from 'fs-extra';
|
|
10
|
-
import { shellExec } from '
|
|
11
|
-
import { loggerFactory } from '
|
|
10
|
+
import { shellExec } from '../server/process.js';
|
|
11
|
+
import { loggerFactory } from '../server/logger.js';
|
|
12
12
|
import { JSONweb } from './client-formatted.js';
|
|
13
13
|
import { ssrFactory } from './ssr.js';
|
|
14
14
|
|
|
@@ -396,10 +396,20 @@ const buildCoverage = async ({ docs, docsDestination }) => {
|
|
|
396
396
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
397
397
|
if (pkg.scripts && pkg.scripts.coverage) {
|
|
398
398
|
logger.info('generating coverage report', coveragePath);
|
|
399
|
-
|
|
399
|
+
try {
|
|
400
|
+
await shellExec(`cd ${coveragePath} && npm run coverage`, { silent: true });
|
|
401
|
+
} catch (err) {
|
|
402
|
+
logger.warn('coverage generation failed (non-fatal), skipping:', err.message);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
400
405
|
} else if (pkg.scripts && pkg.scripts.test) {
|
|
401
406
|
logger.info('generating coverage via test', coveragePath);
|
|
402
|
-
|
|
407
|
+
try {
|
|
408
|
+
await shellExec(`cd ${coveragePath} && npm test`, { silent: true, silentOnError: true });
|
|
409
|
+
} catch (err) {
|
|
410
|
+
logger.warn('coverage generation failed (non-fatal), skipping:', err.message);
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
403
413
|
}
|
|
404
414
|
}
|
|
405
415
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Module for live building client-side code
|
|
3
|
-
* @module src/
|
|
3
|
+
* @module src/client-builder/client-build-live.js
|
|
4
4
|
* @namespace clientLiveBuild
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import fs from 'fs-extra';
|
|
8
|
-
import { Config, loadConf, readConfJson } from '
|
|
9
|
-
import { loggerFactory } from '
|
|
8
|
+
import { Config, loadConf, readConfJson } from '../server/conf.js';
|
|
9
|
+
import { loggerFactory } from '../server/logger.js';
|
|
10
10
|
import { buildClient } from './client-build.js';
|
|
11
11
|
|
|
12
12
|
const logger = loggerFactory(import.meta);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Manages the client-side build process, including full builds and incremental builds.
|
|
3
|
-
* @module
|
|
3
|
+
* @module src/client-builder/client-build.js
|
|
4
4
|
* @namespace clientBuild
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -8,18 +8,18 @@
|
|
|
8
8
|
|
|
9
9
|
import fs from 'fs-extra';
|
|
10
10
|
import { transformClientJs, JSONweb } from './client-formatted.js';
|
|
11
|
-
import { loggerFactory } from '
|
|
11
|
+
import { loggerFactory } from '../server/logger.js';
|
|
12
12
|
import {
|
|
13
13
|
getCapVariableName,
|
|
14
14
|
newInstance,
|
|
15
15
|
orderArrayFromAttrInt,
|
|
16
16
|
uniqueArray,
|
|
17
17
|
} from '../client/components/core/CommonJs.js';
|
|
18
|
-
import { readConfJson } from '
|
|
18
|
+
import { readConfJson } from '../server/conf.js';
|
|
19
19
|
import { minify } from 'html-minifier-terser';
|
|
20
20
|
import AdmZip from 'adm-zip';
|
|
21
21
|
import * as dir from 'path';
|
|
22
|
-
import { shellExec } from '
|
|
22
|
+
import { shellExec } from '../server/process.js';
|
|
23
23
|
import { SitemapStream, streamToPromise } from 'sitemap';
|
|
24
24
|
import { Readable } from 'stream';
|
|
25
25
|
import { buildIcons } from './client-icons.js';
|
|
@@ -751,8 +751,9 @@ const buildClient = async (
|
|
|
751
751
|
)
|
|
752
752
|
)
|
|
753
753
|
for (const view of views) {
|
|
754
|
-
const buildPath = `${
|
|
755
|
-
|
|
754
|
+
const buildPath = `${
|
|
755
|
+
rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
|
|
756
|
+
}${view.path === '/' ? view.path : `${view.path}/`}`;
|
|
756
757
|
|
|
757
758
|
if (!fs.existsSync(buildPath)) fs.mkdirSync(buildPath, { recursive: true });
|
|
758
759
|
|
|
@@ -768,8 +769,9 @@ const buildClient = async (
|
|
|
768
769
|
fs.writeFileSync(`${buildPath}${buildId}.js`, jsSrc, 'utf8');
|
|
769
770
|
const title = metadata.title ? metadata.title : title;
|
|
770
771
|
|
|
771
|
-
const canonicalURL = `https://${host}${path}${
|
|
772
|
-
}
|
|
772
|
+
const canonicalURL = `https://${host}${path}${
|
|
773
|
+
view.path === '/' ? (path === '/' ? '' : '/') : path === '/' ? `${view.path.slice(1)}/` : `${view.path}/`
|
|
774
|
+
}`;
|
|
773
775
|
|
|
774
776
|
let ssrHeadComponents = ``;
|
|
775
777
|
let ssrBodyComponents = ``;
|
|
@@ -903,12 +905,12 @@ const buildClient = async (
|
|
|
903
905
|
`${buildPath}index.html`,
|
|
904
906
|
minifyBuild
|
|
905
907
|
? await minify(htmlSrc, {
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
908
|
+
minifyCSS: true,
|
|
909
|
+
minifyJS: true,
|
|
910
|
+
collapseBooleanAttributes: true,
|
|
911
|
+
collapseInlineTagWhitespace: true,
|
|
912
|
+
collapseWhitespace: true,
|
|
913
|
+
})
|
|
912
914
|
: htmlSrc,
|
|
913
915
|
'utf8',
|
|
914
916
|
);
|
|
@@ -997,8 +999,9 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
|
|
|
997
999
|
renderApi: { JSONweb },
|
|
998
1000
|
});
|
|
999
1001
|
|
|
1000
|
-
const buildPath = `${
|
|
1001
|
-
|
|
1002
|
+
const buildPath = `${
|
|
1003
|
+
rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
|
|
1004
|
+
}${view.path === '/' ? view.path : `${view.path}/`}`;
|
|
1002
1005
|
|
|
1003
1006
|
const indexUrl = buildIndexUrl(view.path);
|
|
1004
1007
|
if (view.offlineDefault) {
|
|
@@ -1018,12 +1021,12 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
|
|
|
1018
1021
|
buildHtmlPath,
|
|
1019
1022
|
minifyBuild
|
|
1020
1023
|
? await minify(htmlSrc, {
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1024
|
+
minifyCSS: true,
|
|
1025
|
+
minifyJS: true,
|
|
1026
|
+
collapseBooleanAttributes: true,
|
|
1027
|
+
collapseInlineTagWhitespace: true,
|
|
1028
|
+
collapseWhitespace: true,
|
|
1029
|
+
})
|
|
1027
1030
|
: htmlSrc,
|
|
1028
1031
|
'utf8',
|
|
1029
1032
|
);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Module for creating a client-side development server
|
|
3
|
-
* @module src/
|
|
3
|
+
* @module src/client-builder/client-dev-server.js
|
|
4
4
|
* @namespace clientDevServer
|
|
5
5
|
*/
|
|
6
6
|
import fs from 'fs-extra';
|
|
7
7
|
import nodemon from 'nodemon';
|
|
8
8
|
import dotenv from 'dotenv';
|
|
9
|
-
import { shellExec } from '
|
|
10
|
-
import { loggerFactory } from '
|
|
9
|
+
import { shellExec } from '../server/process.js';
|
|
10
|
+
import { loggerFactory } from '../server/logger.js';
|
|
11
11
|
import Underpost from '../index.js';
|
|
12
12
|
|
|
13
13
|
const logger = loggerFactory(import.meta);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Module for building client-side icons
|
|
3
|
-
* @module src/
|
|
3
|
+
* @module src/client-builder/client-icons.js
|
|
4
4
|
* @namespace clientIcons
|
|
5
5
|
*/
|
|
6
6
|
import { favicons } from 'favicons';
|
|
7
|
-
import { loggerFactory } from '
|
|
7
|
+
import { loggerFactory } from '../server/logger.js';
|
|
8
8
|
import fs from 'fs-extra';
|
|
9
9
|
import { getCapVariableName } from '../client/components/core/CommonJs.js';
|
|
10
10
|
|