cyberia 3.0.3 → 3.2.5
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.production → .env.example} +20 -4
- package/.github/workflows/engine-cyberia.cd.yml +43 -10
- package/.github/workflows/engine-cyberia.ci.yml +48 -26
- package/.github/workflows/ghpkg.ci.yml +5 -5
- package/.github/workflows/gitlab.ci.yml +1 -1
- package/.github/workflows/hardhat.ci.yml +82 -0
- package/.github/workflows/npmpkg.ci.yml +60 -14
- package/.github/workflows/publish.ci.yml +26 -7
- package/.github/workflows/publish.cyberia.ci.yml +5 -5
- package/.github/workflows/pwa-microservices-template-page.cd.yml +6 -7
- package/.github/workflows/pwa-microservices-template-test.ci.yml +4 -4
- package/.github/workflows/release.cd.yml +14 -8
- package/.vscode/extensions.json +9 -8
- package/.vscode/settings.json +3 -2
- package/CHANGELOG.md +643 -1
- package/CLI-HELP.md +132 -57
- package/Dockerfile +4 -2
- package/README.md +347 -22
- package/WHITE-PAPER.md +1540 -0
- package/bin/build.js +21 -12
- package/bin/cyberia.js +2640 -106
- package/bin/deploy.js +258 -372
- package/bin/file.js +5 -1
- package/bin/index.js +2640 -106
- package/bin/vs.js +3 -3
- package/conf.js +169 -105
- package/deployment.yaml +236 -20
- package/hardhat/.env.example +31 -0
- package/hardhat/README.md +531 -0
- package/hardhat/WHITE-PAPER.md +1540 -0
- package/hardhat/contracts/ObjectLayerToken.sol +391 -0
- package/hardhat/deployments/.gitkeep +0 -0
- package/hardhat/deployments/hardhat-ObjectLayerToken.json +11 -0
- package/hardhat/hardhat.config.js +136 -0
- package/hardhat/ignition/modules/ObjectLayerToken.js +21 -0
- package/hardhat/networks/besu-object-layer.network.json +138 -0
- package/hardhat/package-lock.json +4323 -0
- package/hardhat/package.json +36 -0
- package/hardhat/scripts/deployObjectLayerToken.js +98 -0
- package/hardhat/test/ObjectLayerToken.js +592 -0
- package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
- package/hardhat/types/ethers-contracts/common.ts +92 -0
- package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
- package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
- package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
- package/hardhat/types/ethers-contracts/index.ts +6 -0
- package/jsdoc.dd-cyberia.json +68 -0
- package/jsdoc.json +65 -49
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +5 -4
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +5 -4
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +562 -0
- package/manifests/deployment/dd-cyberia-development/proxy.yaml +297 -0
- package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +132 -0
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/manifests/deployment/dd-test-development/deployment.yaml +88 -74
- package/manifests/deployment/dd-test-development/proxy.yaml +13 -4
- package/manifests/deployment/playwright/deployment.yaml +1 -1
- package/manifests/pv-pvc-dd.yaml +1 -1
- package/nodemon.json +1 -1
- package/package.json +60 -48
- package/proxy.yaml +118 -10
- package/pv-pvc.yaml +132 -0
- package/scripts/k3s-node-setup.sh +1 -1
- package/scripts/ports-ls.sh +2 -0
- package/scripts/rhel-grpc-setup.sh +56 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +47 -1
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +17 -2
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +80 -7
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +93 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +29 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +51 -0
- package/src/api/cyberia-entity/cyberia-entity.controller.js +74 -0
- package/src/api/cyberia-entity/cyberia-entity.model.js +24 -0
- package/src/api/cyberia-entity/cyberia-entity.router.js +27 -0
- package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +368 -0
- package/src/api/cyberia-instance/cyberia-instance.controller.js +92 -0
- package/src/api/cyberia-instance/cyberia-instance.model.js +84 -0
- package/src/api/cyberia-instance/cyberia-instance.router.js +63 -0
- package/src/api/cyberia-instance/cyberia-instance.service.js +191 -0
- package/src/api/cyberia-instance/cyberia-portal-connector.js +486 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +74 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +413 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +228 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +27 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +42 -0
- package/src/api/cyberia-map/cyberia-map.controller.js +79 -0
- package/src/api/cyberia-map/cyberia-map.model.js +30 -0
- package/src/api/cyberia-map/cyberia-map.router.js +40 -0
- package/src/api/cyberia-map/cyberia-map.service.js +74 -0
- package/src/api/document/document.service.js +1 -1
- package/src/api/file/file.controller.js +3 -1
- package/src/api/file/file.ref.json +18 -0
- package/src/api/file/file.service.js +28 -5
- package/src/api/ipfs/ipfs.controller.js +4 -25
- package/src/api/ipfs/ipfs.model.js +43 -34
- package/src/api/ipfs/ipfs.router.js +8 -13
- package/src/api/ipfs/ipfs.service.js +56 -104
- package/src/api/object-layer/README.md +347 -22
- package/src/api/object-layer/object-layer.controller.js +6 -2
- package/src/api/object-layer/object-layer.model.js +12 -8
- package/src/api/object-layer/object-layer.router.js +698 -42
- package/src/api/object-layer/object-layer.service.js +119 -37
- package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +1 -2
- package/src/api/user/user.router.js +10 -5
- package/src/api/user/user.service.js +15 -14
- package/src/cli/baremetal.js +6 -10
- package/src/cli/cloud-init.js +0 -3
- package/src/cli/cluster.js +7 -7
- package/src/cli/db.js +723 -857
- package/src/cli/deploy.js +215 -105
- package/src/cli/env.js +34 -5
- package/src/cli/fs.js +5 -4
- package/src/cli/image.js +0 -3
- package/src/cli/index.js +83 -15
- package/src/cli/kubectl.js +211 -0
- package/src/cli/monitor.js +5 -6
- package/src/cli/release.js +284 -0
- package/src/cli/repository.js +708 -62
- package/src/cli/run.js +371 -151
- package/src/cli/secrets.js +73 -2
- package/src/cli/ssh.js +1 -1
- package/src/cli/test.js +3 -3
- package/src/client/Cryptokoyn.index.js +3 -4
- package/src/client/CyberiaPortal.index.js +3 -4
- package/src/client/Default.index.js +3 -4
- package/src/client/Itemledger.index.js +4 -963
- package/src/client/Underpost.index.js +3 -4
- package/src/client/components/core/AgGrid.js +20 -5
- package/src/client/components/core/Alert.js +2 -2
- package/src/client/components/core/AppStore.js +69 -0
- package/src/client/components/core/CalendarCore.js +2 -2
- package/src/client/components/core/Content.js +22 -3
- package/src/client/components/core/Docs.js +30 -6
- package/src/client/components/core/DropDown.js +137 -17
- package/src/client/components/core/FileExplorer.js +71 -4
- package/src/client/components/core/Input.js +1 -1
- package/src/client/components/core/Keyboard.js +2 -2
- package/src/client/components/core/LogIn.js +2 -2
- package/src/client/components/core/LogOut.js +2 -2
- package/src/client/components/core/Modal.js +20 -7
- package/src/client/components/core/Panel.js +0 -1
- package/src/client/components/core/PanelForm.js +19 -19
- package/src/client/components/core/RichText.js +1 -2
- package/src/client/components/core/SocketIo.js +82 -29
- package/src/client/components/core/SocketIoHandler.js +75 -0
- package/src/client/components/core/Stream.js +143 -95
- package/src/client/components/core/Webhook.js +40 -7
- package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
- package/src/client/components/cryptokoyn/LogInCryptokoyn.js +3 -3
- package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +2 -2
- package/src/client/components/cryptokoyn/MenuCryptokoyn.js +3 -3
- package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +3 -51
- package/src/client/components/cyberia/InstanceEngineCyberia.js +700 -0
- package/src/client/components/cyberia/MapEngineCyberia.js +1359 -2
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +17 -6
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +92 -54
- package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +217 -30
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +44 -2
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +3 -4
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +2 -2
- package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +104 -9
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +5 -0
- package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +3 -49
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
- package/src/client/components/default/AppStoreDefault.js +5 -0
- package/src/client/components/default/LogInDefault.js +3 -3
- package/src/client/components/default/LogOutDefault.js +2 -2
- package/src/client/components/default/MenuDefault.js +5 -5
- package/src/client/components/default/SocketIoDefault.js +3 -51
- package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
- package/src/client/components/itemledger/LogInItemledger.js +3 -3
- package/src/client/components/itemledger/LogOutItemledger.js +2 -2
- package/src/client/components/itemledger/MenuItemledger.js +3 -3
- package/src/client/components/itemledger/SocketIoItemledger.js +3 -51
- package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
- package/src/client/components/underpost/CssUnderpost.js +59 -0
- package/src/client/components/underpost/LogInUnderpost.js +6 -3
- package/src/client/components/underpost/LogOutUnderpost.js +4 -2
- package/src/client/components/underpost/MenuUnderpost.js +104 -18
- package/src/client/components/underpost/RoutesUnderpost.js +2 -0
- package/src/client/components/underpost/SocketIoUnderpost.js +3 -51
- package/src/client/public/cryptokoyn/assets/logo/base-icon.png +0 -0
- package/src/client/public/cryptokoyn/browserconfig.xml +12 -0
- package/src/client/public/cryptokoyn/microdata.json +85 -0
- package/src/client/public/cryptokoyn/site.webmanifest +57 -0
- package/src/client/public/cryptokoyn/sitemap +3 -3
- package/src/client/public/default/sitemap +3 -3
- package/src/client/public/itemledger/browserconfig.xml +2 -2
- package/src/client/public/itemledger/manifest.webmanifest +4 -4
- package/src/client/public/itemledger/microdata.json +71 -0
- package/src/client/public/itemledger/sitemap +3 -3
- package/src/client/public/itemledger/yandex-browser-manifest.json +2 -2
- package/src/client/public/test/sitemap +3 -3
- package/src/client/services/core/core.service.js +20 -8
- package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +105 -0
- package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
- package/src/client/services/cyberia-entity/cyberia-entity.service.js +105 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +122 -0
- package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +105 -0
- package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
- package/src/client/services/cyberia-map/cyberia-map.service.js +126 -0
- package/src/client/services/instance/instance.management.js +2 -2
- package/src/client/services/ipfs/ipfs.service.js +3 -23
- package/src/client/services/object-layer/object-layer.management.js +3 -3
- package/src/client/services/object-layer/object-layer.service.js +21 -0
- package/src/client/services/user/user.management.js +2 -2
- package/src/client/ssr/body/404.js +15 -11
- package/src/client/ssr/body/500.js +15 -11
- package/src/client/ssr/body/SwaggerDarkMode.js +285 -0
- package/src/client/ssr/head/PwaItemledger.js +60 -0
- package/src/client/ssr/offline/NoNetworkConnection.js +11 -10
- package/src/client/ssr/pages/CyberiaServerMetrics.js +1 -1
- package/src/client/ssr/pages/Test.js +11 -10
- package/src/client.build.js +0 -3
- package/src/client.dev.js +0 -3
- package/src/db/DataBaseProvider.js +17 -2
- package/src/db/mariadb/MariaDB.js +14 -9
- package/src/db/mongo/MongooseDB.js +17 -1
- package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +305 -0
- package/src/grpc/cyberia/README.md +326 -0
- package/src/grpc/cyberia/grpc-server.js +530 -0
- package/src/index.js +24 -1
- package/src/proxy.js +0 -3
- package/src/runtime/express/Dockerfile +4 -0
- package/src/runtime/express/Express.js +33 -10
- package/src/runtime/lampp/Dockerfile +13 -2
- package/src/runtime/lampp/Lampp.js +33 -17
- package/src/runtime/wp/Dockerfile +68 -0
- package/src/runtime/wp/Wp.js +639 -0
- package/src/server/auth.js +36 -15
- package/src/server/backup.js +39 -12
- package/src/server/besu-genesis-generator.js +1630 -0
- package/src/server/client-build-docs.js +133 -17
- package/src/server/client-build-live.js +9 -18
- package/src/server/client-build.js +229 -101
- package/src/server/client-dev-server.js +14 -13
- package/src/server/client-formatted.js +109 -57
- package/src/server/conf.js +391 -164
- package/src/server/cron.js +27 -24
- package/src/server/dns.js +29 -12
- package/src/server/downloader.js +0 -2
- package/src/server/ipfs-client.js +24 -1
- package/src/server/logger.js +27 -9
- package/src/server/object-layer.js +217 -103
- package/src/server/peer.js +8 -2
- package/src/server/process.js +1 -50
- package/src/server/proxy.js +4 -8
- package/src/server/runtime.js +30 -9
- package/src/server/semantic-layer-generator-floor.js +359 -0
- package/src/server/semantic-layer-generator-skin.js +1294 -0
- package/src/server/semantic-layer-generator.js +116 -555
- package/src/server/ssr.js +0 -3
- package/src/server/start.js +19 -12
- package/src/server/tls.js +0 -2
- package/src/server.js +0 -4
- package/src/ws/IoInterface.js +1 -10
- package/src/ws/IoServer.js +14 -33
- package/src/ws/core/channels/core.ws.chat.js +65 -20
- package/src/ws/core/channels/core.ws.mailer.js +113 -32
- package/src/ws/core/channels/core.ws.stream.js +90 -31
- package/src/ws/core/core.ws.connection.js +12 -33
- package/src/ws/core/core.ws.emit.js +10 -26
- package/src/ws/core/core.ws.server.js +25 -58
- package/src/ws/default/channels/default.ws.main.js +53 -12
- package/src/ws/default/default.ws.connection.js +26 -13
- package/src/ws/default/default.ws.server.js +30 -12
- package/.env.development +0 -43
- package/.env.test +0 -43
- package/hardhat/contracts/CryptoKoyn.sol +0 -59
- package/hardhat/contracts/ItemLedger.sol +0 -73
- package/hardhat/contracts/Lock.sol +0 -34
- package/hardhat/hardhat.config.cjs +0 -45
- package/hardhat/ignition/modules/Lock.js +0 -18
- package/hardhat/networks/cryptokoyn-itemledger.network.json +0 -29
- package/hardhat/scripts/deployCryptokoyn.cjs +0 -25
- package/hardhat/scripts/deployItemledger.cjs +0 -25
- package/hardhat/test/Lock.js +0 -126
- package/hardhat/white-paper.md +0 -581
- package/src/client/components/cryptokoyn/CommonCryptokoyn.js +0 -29
- package/src/client/components/cryptokoyn/ElementsCryptokoyn.js +0 -38
- package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +0 -38
- package/src/client/components/default/ElementsDefault.js +0 -38
- package/src/client/components/itemledger/CommonItemledger.js +0 -29
- package/src/client/components/itemledger/ElementsItemledger.js +0 -38
- package/src/client/components/underpost/CommonUnderpost.js +0 -29
- package/src/client/components/underpost/ElementsUnderpost.js +0 -38
- package/src/ws/core/management/core.ws.chat.js +0 -8
- package/src/ws/core/management/core.ws.mailer.js +0 -16
- package/src/ws/core/management/core.ws.stream.js +0 -8
- package/src/ws/default/management/default.ws.main.js +0 -8
- package/white-paper.md +0 -581
|
@@ -46,7 +46,7 @@ const ObjectLayerService = {
|
|
|
46
46
|
* - Default — Create an object layer directly from the request body.
|
|
47
47
|
*
|
|
48
48
|
* The `/metadata` and default routes delegate to {@link ObjectLayerEngine.createObjectLayerDocuments}
|
|
49
|
-
* for
|
|
49
|
+
* for document creation, atlas generation, SHA-256 computation, and IPFS pinning.
|
|
50
50
|
*
|
|
51
51
|
* @async
|
|
52
52
|
* @function post
|
|
@@ -148,7 +148,7 @@ const ObjectLayerService = {
|
|
|
148
148
|
fs.writeFileSync(`${folder}/metadata.json`, metadataContent);
|
|
149
149
|
fs.writeFileSync(`${publicFolder}/metadata.json`, metadataContent);
|
|
150
150
|
|
|
151
|
-
// Build object layer data from the asset directory
|
|
151
|
+
// Build object layer data from the asset directory
|
|
152
152
|
const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
|
|
153
153
|
const ObjectLayerRenderFrames =
|
|
154
154
|
DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
|
|
@@ -161,7 +161,6 @@ const ObjectLayerService = {
|
|
|
161
161
|
metadataOverride: req.body,
|
|
162
162
|
});
|
|
163
163
|
|
|
164
|
-
// Create documents using centralized engine method (with atlas generation)
|
|
165
164
|
const { objectLayer } = await ObjectLayerEngine.createObjectLayerDocuments({
|
|
166
165
|
ObjectLayer,
|
|
167
166
|
ObjectLayerRenderFrames,
|
|
@@ -183,29 +182,66 @@ const ObjectLayerService = {
|
|
|
183
182
|
return objectLayer;
|
|
184
183
|
}
|
|
185
184
|
|
|
186
|
-
// create object layer from body
|
|
185
|
+
// create object layer from body – cut-over consistency: stage all CIDs before writing to DB
|
|
187
186
|
const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
|
|
188
187
|
const ObjectLayerRenderFrames =
|
|
189
188
|
DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
|
|
190
|
-
let newObjectLayer = await new ObjectLayer(req.body).save();
|
|
191
189
|
|
|
192
|
-
|
|
190
|
+
const bodyData = { ...req.body };
|
|
191
|
+
if (!bodyData.data) bodyData.data = {};
|
|
192
|
+
if (!bodyData.data.render) bodyData.data.render = {};
|
|
193
|
+
bodyData.data.render.cid = '';
|
|
194
|
+
bodyData.data.render.metadataCid = '';
|
|
195
|
+
|
|
196
|
+
// If has render frames, generate atlas + CIDs BEFORE creating the ObjectLayer
|
|
197
|
+
if (bodyData.objectLayerRenderFramesId) {
|
|
198
|
+
const renderFramesDoc = await ObjectLayerRenderFrames.findById(bodyData.objectLayerRenderFramesId);
|
|
199
|
+
if (renderFramesDoc) {
|
|
200
|
+
try {
|
|
201
|
+
const stagingOL = {
|
|
202
|
+
data: bodyData.data,
|
|
203
|
+
objectLayerRenderFramesId: renderFramesDoc,
|
|
204
|
+
};
|
|
205
|
+
const result = await AtlasSpriteSheetService.generate(
|
|
206
|
+
{ objectLayer: stagingOL, auth: req.auth },
|
|
207
|
+
res,
|
|
208
|
+
options,
|
|
209
|
+
{ skipObjectLayerSave: true },
|
|
210
|
+
);
|
|
211
|
+
bodyData.data.render.cid = result.atlasCid;
|
|
212
|
+
bodyData.data.render.metadataCid = result.atlasMetadataCid;
|
|
213
|
+
bodyData.atlasSpriteSheetId = result.atlasDoc._id;
|
|
214
|
+
} catch (atlasError) {
|
|
215
|
+
logger.error('Failed to auto-generate atlas for new ObjectLayer:', atlasError);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Compute final SHA-256 with all CIDs
|
|
221
|
+
bodyData.sha256 = ObjectLayerEngine.computeSha256(bodyData.data);
|
|
222
|
+
|
|
223
|
+
// Pin data JSON to IPFS
|
|
193
224
|
try {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
225
|
+
const itemId = bodyData.data.item.id;
|
|
226
|
+
const mfsPath = `/object-layer/${itemId}/${itemId}_data.json`;
|
|
227
|
+
const ipfsResult = await IpfsClient.addJsonToIpfs(bodyData.data, `${itemId}_data.json`, mfsPath);
|
|
228
|
+
if (ipfsResult) {
|
|
229
|
+
bodyData.cid = ipfsResult.cid;
|
|
230
|
+
await createPinRecord({ cid: ipfsResult.cid, resourceType: 'object-layer-data', mfsPath, options });
|
|
231
|
+
}
|
|
232
|
+
} catch (ipfsError) {
|
|
233
|
+
logger.warn('Failed to pin data JSON to IPFS:', ipfsError.message);
|
|
197
234
|
}
|
|
198
235
|
|
|
199
|
-
//
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
});
|
|
236
|
+
// Atomic create/replace – ObjectLayer is fully populated with all CIDs
|
|
237
|
+
let newObjectLayer;
|
|
238
|
+
const existingByItemId = await ObjectLayer.findOne({ 'data.item.id': bodyData.data.item.id });
|
|
239
|
+
if (existingByItemId) {
|
|
240
|
+
newObjectLayer = await ObjectLayer.findByIdAndUpdate(existingByItemId._id, bodyData, {
|
|
241
|
+
returnDocument: 'after',
|
|
242
|
+
}).populate('objectLayerRenderFramesId');
|
|
243
|
+
} else {
|
|
244
|
+
newObjectLayer = await (await new ObjectLayer(bodyData).save()).populate('objectLayerRenderFramesId');
|
|
209
245
|
}
|
|
210
246
|
|
|
211
247
|
return newObjectLayer;
|
|
@@ -236,6 +272,22 @@ const ObjectLayerService = {
|
|
|
236
272
|
/** @type {import('./object-layer.model.js').ObjectLayerModel} */
|
|
237
273
|
const ObjectLayer = DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayer;
|
|
238
274
|
|
|
275
|
+
// GET /search-item-ids?q=<partial> - Fast partial match search on data.item.id
|
|
276
|
+
if (req.path.startsWith('/search-item-ids')) {
|
|
277
|
+
const q = (req.query.q || '').trim();
|
|
278
|
+
if (!q) return { itemIds: [] };
|
|
279
|
+
// Escape regex special characters for safe partial matching
|
|
280
|
+
const escaped = q.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
281
|
+
const results = await ObjectLayer.find(
|
|
282
|
+
{ 'data.item.id': { $regex: escaped, $options: 'i' } },
|
|
283
|
+
{ 'data.item.id': 1, _id: 0 },
|
|
284
|
+
)
|
|
285
|
+
.limit(20)
|
|
286
|
+
.lean();
|
|
287
|
+
const itemIds = [...new Set(results.map((r) => r.data.item.id))];
|
|
288
|
+
return { itemIds };
|
|
289
|
+
}
|
|
290
|
+
|
|
239
291
|
// GET /frame-counts/:id - Get frame counts for each direction using numeric codes
|
|
240
292
|
if (req.path.startsWith('/frame-counts/')) {
|
|
241
293
|
const objectLayer = await ObjectLayer.findById(req.params.id)
|
|
@@ -519,7 +571,7 @@ const ObjectLayerService = {
|
|
|
519
571
|
* - `/:id` — Standard update from request body.
|
|
520
572
|
*
|
|
521
573
|
* The `/metadata` route delegates to {@link ObjectLayerEngine.updateObjectLayerDocuments}
|
|
522
|
-
* for
|
|
574
|
+
* for document update, atlas regeneration, SHA-256 computation, and IPFS pinning.
|
|
523
575
|
*
|
|
524
576
|
* @async
|
|
525
577
|
* @function put
|
|
@@ -636,7 +688,7 @@ const ObjectLayerService = {
|
|
|
636
688
|
const ObjectLayerRenderFrames =
|
|
637
689
|
DataBaseProvider.instance[`${options.host}${options.path}`].mongoose.models.ObjectLayerRenderFrames;
|
|
638
690
|
|
|
639
|
-
// Build object layer data from the asset directory
|
|
691
|
+
// Build object layer data from the asset directory
|
|
640
692
|
const { objectLayerRenderFramesData, objectLayerData } =
|
|
641
693
|
await ObjectLayerEngine.buildObjectLayerDataFromDirectory({
|
|
642
694
|
folder,
|
|
@@ -645,7 +697,7 @@ const ObjectLayerService = {
|
|
|
645
697
|
metadataOverride: req.body,
|
|
646
698
|
});
|
|
647
699
|
|
|
648
|
-
// Update documents using
|
|
700
|
+
// Update documents using engine method (with atlas generation)
|
|
649
701
|
const { objectLayer } = await ObjectLayerEngine.updateObjectLayerDocuments({
|
|
650
702
|
objectLayerId,
|
|
651
703
|
ObjectLayer,
|
|
@@ -668,30 +720,60 @@ const ObjectLayerService = {
|
|
|
668
720
|
return objectLayer;
|
|
669
721
|
}
|
|
670
722
|
|
|
671
|
-
// PUT /:id - Standard update
|
|
672
|
-
|
|
723
|
+
// PUT /:id - Standard update with cut-over consistency
|
|
724
|
+
const existingOL = await ObjectLayer.findById(req.params.id).populate('objectLayerRenderFramesId');
|
|
725
|
+
if (!existingOL) {
|
|
726
|
+
throw new Error('ObjectLayer not found');
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// Apply body updates to staging data in memory
|
|
730
|
+
const updateData = { ...req.body };
|
|
731
|
+
const stagingData = updateData.data || existingOL.data.toObject();
|
|
732
|
+
if (!stagingData.render) stagingData.render = {};
|
|
673
733
|
|
|
674
|
-
if
|
|
675
|
-
|
|
734
|
+
// Use existing render frames if available
|
|
735
|
+
const renderFramesData = existingOL.objectLayerRenderFramesId;
|
|
736
|
+
if (renderFramesData) {
|
|
676
737
|
try {
|
|
677
|
-
|
|
738
|
+
const stagingOL = {
|
|
739
|
+
data: stagingData,
|
|
740
|
+
objectLayerRenderFramesId: renderFramesData,
|
|
741
|
+
};
|
|
742
|
+
const result = await AtlasSpriteSheetService.generate(
|
|
743
|
+
{ objectLayer: stagingOL, auth: req.auth },
|
|
744
|
+
res,
|
|
745
|
+
options,
|
|
746
|
+
{ skipObjectLayerSave: true },
|
|
747
|
+
);
|
|
748
|
+
stagingData.render.cid = result.atlasCid;
|
|
749
|
+
stagingData.render.metadataCid = result.atlasMetadataCid;
|
|
750
|
+
updateData.atlasSpriteSheetId = result.atlasDoc._id;
|
|
678
751
|
} catch (atlasError) {
|
|
679
752
|
logger.error('Failed to auto-update atlas for ObjectLayer:', atlasError);
|
|
680
753
|
}
|
|
754
|
+
}
|
|
681
755
|
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
756
|
+
updateData.data = stagingData;
|
|
757
|
+
updateData.sha256 = ObjectLayerEngine.computeSha256(stagingData);
|
|
758
|
+
|
|
759
|
+
// Pin data JSON to IPFS
|
|
760
|
+
try {
|
|
761
|
+
const itemId = stagingData.item.id;
|
|
762
|
+
const mfsPath = `/object-layer/${itemId}/${itemId}_data.json`;
|
|
763
|
+
const ipfsResult = await IpfsClient.addJsonToIpfs(stagingData, `${itemId}_data.json`, mfsPath);
|
|
764
|
+
if (ipfsResult) {
|
|
765
|
+
updateData.cid = ipfsResult.cid;
|
|
766
|
+
await createPinRecord({ cid: ipfsResult.cid, resourceType: 'object-layer-data', mfsPath, options });
|
|
692
767
|
}
|
|
768
|
+
} catch (ipfsError) {
|
|
769
|
+
logger.warn('Failed to pin data JSON to IPFS:', ipfsError.message);
|
|
693
770
|
}
|
|
694
771
|
|
|
772
|
+
// Atomic update with all CIDs populated
|
|
773
|
+
let updatedObjectLayer = await ObjectLayer.findByIdAndUpdate(req.params.id, updateData, {
|
|
774
|
+
returnDocument: 'after',
|
|
775
|
+
}).populate('objectLayerRenderFramesId');
|
|
776
|
+
|
|
695
777
|
return updatedObjectLayer;
|
|
696
778
|
},
|
|
697
779
|
|
|
@@ -77,12 +77,11 @@ const ObjectLayerRenderFramesSchema = new Schema(
|
|
|
77
77
|
);
|
|
78
78
|
|
|
79
79
|
// Pre-save hook to ensure data consistency
|
|
80
|
-
ObjectLayerRenderFramesSchema.pre('save', function (
|
|
80
|
+
ObjectLayerRenderFramesSchema.pre('save', function () {
|
|
81
81
|
// Ensure all required fields are present
|
|
82
82
|
if (!this.frames || !this.colors || this.frame_duration === undefined) {
|
|
83
83
|
throw new Error('Missing required fields: frames, colors, or frame_duration');
|
|
84
84
|
}
|
|
85
|
-
next();
|
|
86
85
|
});
|
|
87
86
|
|
|
88
87
|
// Create and export the model
|
|
@@ -30,12 +30,15 @@ const UserRouter = (options) => {
|
|
|
30
30
|
emailConfirmed: true,
|
|
31
31
|
publicKey: [],
|
|
32
32
|
});
|
|
33
|
-
logger.warn('Default admin user created. Please change the default password immediately!',
|
|
33
|
+
logger.warn('Default admin user created. Please change the default password immediately!', {
|
|
34
|
+
username: result._doc.username,
|
|
35
|
+
email: result._doc.email,
|
|
36
|
+
role: result._doc.role,
|
|
37
|
+
});
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
40
|
} catch (error) {
|
|
37
|
-
logger.error('Error checking/creating admin user');
|
|
38
|
-
console.log(error);
|
|
41
|
+
logger.error('Error checking/creating admin user', { error: error.message });
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
// Cache mailer images
|
|
@@ -46,10 +49,12 @@ const UserRouter = (options) => {
|
|
|
46
49
|
check: fs.readFileSync(`./src/client/public/default/assets/mailer/api-user-check.png`),
|
|
47
50
|
avatar: fs.readFileSync(`./src/client/public/default/assets/mailer/api-user-default-avatar.png`),
|
|
48
51
|
},
|
|
49
|
-
header: (res) => {
|
|
52
|
+
header: (res, req) => {
|
|
50
53
|
res.set('Cross-Origin-Resource-Policy', 'cross-origin');
|
|
51
|
-
res.set('Access-Control-Allow-Origin', '*');
|
|
52
54
|
res.set('Access-Control-Allow-Headers', '*');
|
|
55
|
+
if (req && req.headers && req.headers.origin) {
|
|
56
|
+
res.set('Access-Control-Allow-Origin', req.headers.origin);
|
|
57
|
+
} else res.setHeader('Access-Control-Allow-Origin', '*');
|
|
53
58
|
res.set('Content-Type', 'image/png');
|
|
54
59
|
},
|
|
55
60
|
};
|
|
@@ -13,8 +13,7 @@ import {
|
|
|
13
13
|
validatePasswordMiddleware,
|
|
14
14
|
} from '../../server/auth.js';
|
|
15
15
|
import { MailerProvider } from '../../mailer/MailerProvider.js';
|
|
16
|
-
import {
|
|
17
|
-
import { CoreWsEmit } from '../../ws/core/core.ws.emit.js';
|
|
16
|
+
import { CoreWsEmitter } from '../../ws/core/core.ws.emit.js';
|
|
18
17
|
import { CoreWsMailerChannel } from '../../ws/core/channels/core.ws.mailer.js';
|
|
19
18
|
import validator from 'validator';
|
|
20
19
|
import { DataBaseProvider } from '../../db/DataBaseProvider.js';
|
|
@@ -265,7 +264,7 @@ const UserService = {
|
|
|
265
264
|
}
|
|
266
265
|
|
|
267
266
|
if (req.path.startsWith('/assets')) {
|
|
268
|
-
options.png.header(res);
|
|
267
|
+
options.png.header(res, req);
|
|
269
268
|
return options.png.buffer[req.params.id];
|
|
270
269
|
}
|
|
271
270
|
|
|
@@ -281,7 +280,7 @@ const UserService = {
|
|
|
281
280
|
payload = verifyJWT(req.params.id, options);
|
|
282
281
|
} catch (error) {
|
|
283
282
|
logger.error(error, { 'req.params.id': req.params.id });
|
|
284
|
-
options.png.header(res);
|
|
283
|
+
options.png.header(res, req);
|
|
285
284
|
return options.png.buffer['invalid-token'];
|
|
286
285
|
}
|
|
287
286
|
const user = await User.findOne({
|
|
@@ -294,10 +293,10 @@ const UserService = {
|
|
|
294
293
|
{ recoverTimeOut: new Date(+new Date() + 1000 * 60 * 15) },
|
|
295
294
|
{ runValidators: true },
|
|
296
295
|
);
|
|
297
|
-
options.png.header(res);
|
|
296
|
+
options.png.header(res, req);
|
|
298
297
|
return options.png.buffer['recover'];
|
|
299
298
|
} else {
|
|
300
|
-
options.png.header(res);
|
|
299
|
+
options.png.header(res, req);
|
|
301
300
|
return options.png.buffer['invalid-token'];
|
|
302
301
|
}
|
|
303
302
|
}
|
|
@@ -308,7 +307,7 @@ const UserService = {
|
|
|
308
307
|
payload = verifyJWT(req.params.id, options);
|
|
309
308
|
} catch (error) {
|
|
310
309
|
logger.error(error, { 'req.params.id': req.params.id });
|
|
311
|
-
options.png.header(res);
|
|
310
|
+
options.png.header(res, req);
|
|
312
311
|
return options.png.buffer['invalid-token'];
|
|
313
312
|
}
|
|
314
313
|
const user = await User.findOne({
|
|
@@ -319,15 +318,17 @@ const UserService = {
|
|
|
319
318
|
{
|
|
320
319
|
const user = await User.findByIdAndUpdate(_id, { emailConfirmed: true }, { runValidators: true });
|
|
321
320
|
}
|
|
322
|
-
const userWsId =
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
321
|
+
const userWsId = CoreWsMailerChannel.getUserWsId(`${options.host}${options.path}`, user._id.toString());
|
|
322
|
+
if (userWsId && CoreWsMailerChannel.client[userWsId]) {
|
|
323
|
+
CoreWsEmitter.emit(CoreWsMailerChannel.channel, CoreWsMailerChannel.client[userWsId], {
|
|
324
|
+
status: 'email-confirmed',
|
|
325
|
+
id: userWsId,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
options.png.header(res, req);
|
|
328
329
|
return options.png.buffer['check'];
|
|
329
330
|
} else {
|
|
330
|
-
options.png.header(res);
|
|
331
|
+
options.png.header(res, req);
|
|
331
332
|
return options.png.buffer['invalid-token'];
|
|
332
333
|
}
|
|
333
334
|
}
|
package/src/cli/baremetal.js
CHANGED
|
@@ -135,9 +135,6 @@ class UnderpostBaremetal {
|
|
|
135
135
|
) {
|
|
136
136
|
let { ipAddress, hostname, ipFileServer, ipConfig, netmask, dnsServer } = options;
|
|
137
137
|
|
|
138
|
-
// Load environment variables from .env file, overriding existing ones if present.
|
|
139
|
-
dotenv.config({ path: `${getUnderpostRootPath()}/.env`, override: true });
|
|
140
|
-
|
|
141
138
|
// Determine the root path for npm and underpost.
|
|
142
139
|
const npmRoot = getNpmRootPath();
|
|
143
140
|
const underpostRoot = options?.dev === true ? '.' : `${npmRoot}/underpost`;
|
|
@@ -1147,9 +1144,8 @@ rm -rf ${artifacts.join(' ')}`);
|
|
|
1147
1144
|
machine: machine ? machine.system_id : null,
|
|
1148
1145
|
});
|
|
1149
1146
|
|
|
1150
|
-
const { discovery, machine: discoveredMachine } =
|
|
1151
|
-
commissionMonitorPayload
|
|
1152
|
-
);
|
|
1147
|
+
const { discovery, machine: discoveredMachine } =
|
|
1148
|
+
await Underpost.baremetal.commissionMonitor(commissionMonitorPayload);
|
|
1153
1149
|
if (discoveredMachine) machine = discoveredMachine;
|
|
1154
1150
|
}
|
|
1155
1151
|
},
|
|
@@ -2494,10 +2490,10 @@ fi
|
|
|
2494
2490
|
const discoverHostname = discovery.hostname
|
|
2495
2491
|
? discovery.hostname
|
|
2496
2492
|
: discovery.mac_organization
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2493
|
+
? discovery.mac_organization
|
|
2494
|
+
: discovery.domain
|
|
2495
|
+
? discovery.domain
|
|
2496
|
+
: `generic-host-${s4()}${s4()}`;
|
|
2501
2497
|
|
|
2502
2498
|
console.log(discoverHostname.bgBlue.bold.white);
|
|
2503
2499
|
console.log('ip target:'.green + ipAddress, 'ip discovered:'.green + discovery.ip);
|
package/src/cli/cloud-init.js
CHANGED
|
@@ -5,15 +5,12 @@
|
|
|
5
5
|
* @namespace UnderpostCloudInit
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import dotenv from 'dotenv';
|
|
9
8
|
import { shellExec } from '../server/process.js';
|
|
10
9
|
import fs from 'fs-extra';
|
|
11
10
|
import { loggerFactory } from '../server/logger.js';
|
|
12
11
|
import { getNpmRootPath } from '../server/conf.js';
|
|
13
12
|
import Underpost from '../index.js';
|
|
14
13
|
|
|
15
|
-
dotenv.config();
|
|
16
|
-
|
|
17
14
|
const logger = loggerFactory(import.meta);
|
|
18
15
|
|
|
19
16
|
/**
|
package/src/cli/cluster.js
CHANGED
|
@@ -111,7 +111,7 @@ class UnderpostCluster {
|
|
|
111
111
|
const npmRoot = getNpmRootPath();
|
|
112
112
|
const underpostRoot = options.dev ? '.' : `${npmRoot}/underpost`;
|
|
113
113
|
|
|
114
|
-
if (options.listPods) return console.table(Underpost.
|
|
114
|
+
if (options.listPods) return console.table(Underpost.kubectl.get(podName ?? undefined));
|
|
115
115
|
// Set default namespace if not specified
|
|
116
116
|
if (!options.namespace) options.namespace = 'default';
|
|
117
117
|
|
|
@@ -146,10 +146,10 @@ class UnderpostCluster {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
// Check if a cluster (Kind, Kubeadm, or K3s) is already initialized
|
|
149
|
-
const alreadyKubeadmCluster = Underpost.
|
|
150
|
-
const alreadyKindCluster = Underpost.
|
|
149
|
+
const alreadyKubeadmCluster = Underpost.kubectl.get('calico-kube-controllers')[0];
|
|
150
|
+
const alreadyKindCluster = Underpost.kubectl.get('kube-apiserver-kind-control-plane')[0];
|
|
151
151
|
// K3s pods often contain 'svclb-traefik' in the kube-system namespace
|
|
152
|
-
const alreadyK3sCluster = Underpost.
|
|
152
|
+
const alreadyK3sCluster = Underpost.kubectl.get('svclb-traefik')[0];
|
|
153
153
|
|
|
154
154
|
// --- Kubeadm/Kind/K3s Cluster Initialization ---
|
|
155
155
|
if (!alreadyKubeadmCluster && !alreadyKindCluster && !alreadyK3sCluster) {
|
|
@@ -299,7 +299,7 @@ EOF
|
|
|
299
299
|
members: [{ _id: 0, host: `${options.mongoDbHost}:27017` }],
|
|
300
300
|
};
|
|
301
301
|
|
|
302
|
-
const [pod] = Underpost.
|
|
302
|
+
const [pod] = Underpost.kubectl.get(deploymentName);
|
|
303
303
|
|
|
304
304
|
shellExec(
|
|
305
305
|
`sudo kubectl exec -i ${pod.NAME} -- mongo --quiet \
|
|
@@ -351,7 +351,7 @@ EOF
|
|
|
351
351
|
}
|
|
352
352
|
|
|
353
353
|
if (options.certManager) {
|
|
354
|
-
if (!Underpost.
|
|
354
|
+
if (!Underpost.kubectl.get('cert-manager').find((p) => p.STATUS === 'Running')) {
|
|
355
355
|
shellExec(`helm repo add jetstack https://charts.jetstack.io --force-update`);
|
|
356
356
|
shellExec(
|
|
357
357
|
`helm install cert-manager jetstack/cert-manager \
|
|
@@ -641,7 +641,7 @@ net.ipv4.ip_forward = 1' | sudo tee ${iptableConfPath}`,
|
|
|
641
641
|
const resources = {};
|
|
642
642
|
const nodeName = node
|
|
643
643
|
? node
|
|
644
|
-
: Underpost.
|
|
644
|
+
: Underpost.kubectl.get('kind-control-plane', 'node').length > 0
|
|
645
645
|
? 'kind-control-plane'
|
|
646
646
|
: os.hostname();
|
|
647
647
|
const info = shellExec(`kubectl describe node ${nodeName} | grep -E '(Allocatable:|Capacity:)' -A 6`, {
|