cyberia 3.0.2 → 3.0.3
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/CHANGELOG.md +323 -290
- package/CLI-HELP.md +2 -1
- package/bin/build.js +0 -1
- package/bin/cyberia.js +98 -4
- package/bin/index.js +98 -4
- package/conf.js +192 -0
- package/deployment.yaml +72 -2
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/manifests/deployment/dd-test-development/deployment.yaml +2 -2
- package/package.json +13 -9
- package/proxy.yaml +56 -9
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +40 -7
- package/src/api/object-layer/object-layer.model.js +61 -19
- package/src/api/object-layer/object-layer.service.js +4 -9
- package/src/cli/index.js +6 -0
- package/src/cli/run.js +30 -2
- package/src/client/Underpost.index.js +36 -0
- package/src/client/components/core/Modal.js +2 -0
- package/src/client/components/core/PublicProfile.js +3 -3
- package/src/client/components/core/Router.js +34 -1
- package/src/client/components/core/Worker.js +1 -1
- package/src/client/components/cryptokoyn/CssCryptokoyn.js +63 -1
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +145 -119
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +64 -6
- package/src/client/components/itemledger/CssItemledger.js +62 -0
- package/src/client/components/underpost/CommonUnderpost.js +29 -0
- package/src/client/components/underpost/CssUnderpost.js +222 -0
- package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +879 -0
- package/src/client/components/underpost/DocumentSearchProvider.js +448 -0
- package/src/client/components/underpost/ElementsUnderpost.js +38 -0
- package/src/client/components/underpost/LabGalleryUnderpost.js +82 -0
- package/src/client/components/underpost/LogInUnderpost.js +20 -0
- package/src/client/components/underpost/LogOutUnderpost.js +13 -0
- package/src/client/components/underpost/MenuUnderpost.js +605 -0
- package/src/client/components/underpost/RoutesUnderpost.js +45 -0
- package/src/client/components/underpost/SettingsUnderpost.js +16 -0
- package/src/client/components/underpost/SignUpUnderpost.js +9 -0
- package/src/client/components/underpost/SocketIoUnderpost.js +54 -0
- package/src/client/components/underpost/TranslateUnderpost.js +10 -0
- package/src/client/services/object-layer/object-layer.management.js +23 -4
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +83 -0
- package/src/client/ssr/head/UnderpostScripts.js +6 -0
- package/src/index.js +1 -1
- package/src/server/object-layer.js +13 -10
- package/src/server/semantic-layer-generator.js +1 -0
package/CLI-HELP.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
## underpost ci/cd cli v3.0.
|
|
1
|
+
## underpost ci/cd cli v3.0.3
|
|
2
2
|
|
|
3
3
|
### Usage: `underpost [options] [command]`
|
|
4
4
|
```
|
|
@@ -899,6 +899,7 @@ Options:
|
|
|
899
899
|
--monitor-status-max-attempts <attempts> Sets the maximum number of status check attempts (default: 600).
|
|
900
900
|
--dry-run Preview operations without executing them.
|
|
901
901
|
--create-job-now After applying cron manifests, immediately create a Job from each CronJob (forwarded to cron runner).
|
|
902
|
+
--host-aliases <host-aliases> Adds entries to the Pod /etc/hosts via hostAliases. Format: semicolon-separated entries of "ip=hostname1,hostname2" (e.g., "127.0.0.1=foo.local,bar.local;10.1.2.3=foo.remote,bar.remote").
|
|
902
903
|
-h, --help display help for command
|
|
903
904
|
|
|
904
905
|
```
|
package/bin/build.js
CHANGED
|
@@ -221,5 +221,4 @@ const { DefaultConf } = await import(`../conf.${confName}.js`);
|
|
|
221
221
|
fs.copySync(`./src/ws/${confName.split('-')[1]}`, `${basePath}/src/ws/${confName.split('-')[1]}`);
|
|
222
222
|
}
|
|
223
223
|
shellExec(`cd ${basePath} && npm install --ignore-scripts`);
|
|
224
|
-
shellExec(`cd ${basePath} && npm run fix`);
|
|
225
224
|
}
|
package/bin/cyberia.js
CHANGED
|
@@ -256,22 +256,60 @@ try {
|
|
|
256
256
|
md5: crypto.createHash('md5').update(buffer).digest('hex'),
|
|
257
257
|
}).save();
|
|
258
258
|
|
|
259
|
+
// Pin atlas PNG to IPFS
|
|
260
|
+
let importAtlasCid = '';
|
|
261
|
+
let importAtlasMetadataCid = '';
|
|
262
|
+
try {
|
|
263
|
+
const ipfsResult = await IpfsClient.addBufferToIpfs(
|
|
264
|
+
buffer,
|
|
265
|
+
`${itemKey}_atlas_sprite_sheet.png`,
|
|
266
|
+
`/object-layer/${itemKey}/${itemKey}_atlas_sprite_sheet.png`,
|
|
267
|
+
);
|
|
268
|
+
if (ipfsResult) {
|
|
269
|
+
importAtlasCid = ipfsResult.cid;
|
|
270
|
+
logger.info(`Atlas sprite sheet pinned to IPFS – CID: ${importAtlasCid}`);
|
|
271
|
+
}
|
|
272
|
+
} catch (ipfsError) {
|
|
273
|
+
logger.warn('Failed to add atlas sprite sheet to IPFS:', ipfsError.message);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Pin atlas metadata JSON to IPFS (fast-json-stable-stringify)
|
|
277
|
+
try {
|
|
278
|
+
const metadataIpfsResult = await IpfsClient.addJsonToIpfs(
|
|
279
|
+
metadata,
|
|
280
|
+
`${itemKey}_atlas_sprite_sheet_metadata.json`,
|
|
281
|
+
`/object-layer/${itemKey}/${itemKey}_atlas_sprite_sheet_metadata.json`,
|
|
282
|
+
);
|
|
283
|
+
if (metadataIpfsResult) {
|
|
284
|
+
importAtlasMetadataCid = metadataIpfsResult.cid;
|
|
285
|
+
logger.info(`Atlas metadata pinned to IPFS – CID: ${importAtlasMetadataCid}`);
|
|
286
|
+
}
|
|
287
|
+
} catch (ipfsError) {
|
|
288
|
+
logger.warn('Failed to add atlas metadata to IPFS:', ipfsError.message);
|
|
289
|
+
}
|
|
290
|
+
|
|
259
291
|
let atlasDoc = await AtlasSpriteSheet.findOne({ 'metadata.itemKey': itemKey });
|
|
260
292
|
|
|
261
293
|
if (atlasDoc) {
|
|
262
294
|
atlasDoc.fileId = fileDoc._id;
|
|
295
|
+
atlasDoc.cid = importAtlasCid;
|
|
263
296
|
atlasDoc.metadata = metadata;
|
|
264
297
|
await atlasDoc.save();
|
|
265
298
|
logger.info(`Updated existing AtlasSpriteSheet document: ${atlasDoc._id}`);
|
|
266
299
|
} else {
|
|
267
300
|
atlasDoc = await new AtlasSpriteSheet({
|
|
268
301
|
fileId: fileDoc._id,
|
|
302
|
+
cid: importAtlasCid,
|
|
269
303
|
metadata,
|
|
270
304
|
}).save();
|
|
271
305
|
logger.info(`Created new AtlasSpriteSheet document: ${atlasDoc._id}`);
|
|
272
306
|
}
|
|
273
307
|
|
|
274
308
|
populatedObjectLayer.atlasSpriteSheetId = atlasDoc._id;
|
|
309
|
+
if (!populatedObjectLayer.data.render) populatedObjectLayer.data.render = {};
|
|
310
|
+
populatedObjectLayer.data.render.cid = importAtlasCid;
|
|
311
|
+
populatedObjectLayer.data.render.metadataCid = importAtlasMetadataCid;
|
|
312
|
+
populatedObjectLayer.markModified('data.render');
|
|
275
313
|
await populatedObjectLayer.save();
|
|
276
314
|
|
|
277
315
|
logger.info(`Atlas sprite sheet completed for item: ${itemKey}`);
|
|
@@ -436,12 +474,45 @@ try {
|
|
|
436
474
|
|
|
437
475
|
logger.info(`File saved with ID: ${fileDoc._id}`);
|
|
438
476
|
|
|
477
|
+
// Pin atlas PNG to IPFS
|
|
478
|
+
let toAtlasCid = '';
|
|
479
|
+
let toAtlasMetadataCid = '';
|
|
480
|
+
try {
|
|
481
|
+
const ipfsResult = await IpfsClient.addBufferToIpfs(
|
|
482
|
+
buffer,
|
|
483
|
+
`${itemKey}_atlas_sprite_sheet.png`,
|
|
484
|
+
`/object-layer/${itemKey}/${itemKey}_atlas_sprite_sheet.png`,
|
|
485
|
+
);
|
|
486
|
+
if (ipfsResult) {
|
|
487
|
+
toAtlasCid = ipfsResult.cid;
|
|
488
|
+
logger.info(`Atlas sprite sheet pinned to IPFS – CID: ${toAtlasCid}`);
|
|
489
|
+
}
|
|
490
|
+
} catch (ipfsError) {
|
|
491
|
+
logger.warn('Failed to add atlas sprite sheet to IPFS:', ipfsError.message);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// Pin atlas metadata JSON to IPFS (fast-json-stable-stringify)
|
|
495
|
+
try {
|
|
496
|
+
const metadataIpfsResult = await IpfsClient.addJsonToIpfs(
|
|
497
|
+
metadata,
|
|
498
|
+
`${itemKey}_atlas_sprite_sheet_metadata.json`,
|
|
499
|
+
`/object-layer/${itemKey}/${itemKey}_atlas_sprite_sheet_metadata.json`,
|
|
500
|
+
);
|
|
501
|
+
if (metadataIpfsResult) {
|
|
502
|
+
toAtlasMetadataCid = metadataIpfsResult.cid;
|
|
503
|
+
logger.info(`Atlas metadata pinned to IPFS – CID: ${toAtlasMetadataCid}`);
|
|
504
|
+
}
|
|
505
|
+
} catch (ipfsError) {
|
|
506
|
+
logger.warn('Failed to add atlas metadata to IPFS:', ipfsError.message);
|
|
507
|
+
}
|
|
508
|
+
|
|
439
509
|
// Check if atlas sprite sheet already exists
|
|
440
510
|
let atlasDoc = await AtlasSpriteSheet.findOne({ 'metadata.itemKey': itemKey });
|
|
441
511
|
|
|
442
512
|
if (atlasDoc) {
|
|
443
513
|
// Update existing
|
|
444
514
|
atlasDoc.fileId = fileDoc._id;
|
|
515
|
+
atlasDoc.cid = toAtlasCid;
|
|
445
516
|
atlasDoc.metadata = metadata;
|
|
446
517
|
await atlasDoc.save();
|
|
447
518
|
logger.info(`Updated existing AtlasSpriteSheet document: ${atlasDoc._id}`);
|
|
@@ -449,13 +520,18 @@ try {
|
|
|
449
520
|
// Create new
|
|
450
521
|
atlasDoc = await new AtlasSpriteSheet({
|
|
451
522
|
fileId: fileDoc._id,
|
|
523
|
+
cid: toAtlasCid,
|
|
452
524
|
metadata,
|
|
453
525
|
}).save();
|
|
454
526
|
logger.info(`Created new AtlasSpriteSheet document: ${atlasDoc._id}`);
|
|
455
527
|
}
|
|
456
528
|
|
|
457
|
-
// Update ObjectLayer with reference to atlas sprite sheet
|
|
529
|
+
// Update ObjectLayer with reference to atlas sprite sheet and render CIDs
|
|
458
530
|
objectLayer.atlasSpriteSheetId = atlasDoc._id;
|
|
531
|
+
if (!objectLayer.data.render) objectLayer.data.render = {};
|
|
532
|
+
objectLayer.data.render.cid = toAtlasCid;
|
|
533
|
+
objectLayer.data.render.metadataCid = toAtlasMetadataCid;
|
|
534
|
+
objectLayer.markModified('data.render');
|
|
459
535
|
await objectLayer.save();
|
|
460
536
|
|
|
461
537
|
logger.info(`Atlas sprite sheet completed for item: ${itemKey}`);
|
|
@@ -618,6 +694,7 @@ try {
|
|
|
618
694
|
}).save();
|
|
619
695
|
|
|
620
696
|
// Pin atlas PNG to IPFS + copy into MFS
|
|
697
|
+
let atlasMetadataCid = '';
|
|
621
698
|
try {
|
|
622
699
|
const ipfsResult = await IpfsClient.addBufferToIpfs(
|
|
623
700
|
buffer,
|
|
@@ -632,6 +709,21 @@ try {
|
|
|
632
709
|
logger.warn('Failed to add atlas sprite sheet to IPFS:', ipfsError.message);
|
|
633
710
|
}
|
|
634
711
|
|
|
712
|
+
// Pin atlas metadata JSON to IPFS (fast-json-stable-stringify)
|
|
713
|
+
try {
|
|
714
|
+
const metadataIpfsResult = await IpfsClient.addJsonToIpfs(
|
|
715
|
+
metadata,
|
|
716
|
+
`${atlasItemKey}_atlas_sprite_sheet_metadata.json`,
|
|
717
|
+
`/object-layer/${atlasItemKey}/${atlasItemKey}_atlas_sprite_sheet_metadata.json`,
|
|
718
|
+
);
|
|
719
|
+
if (metadataIpfsResult) {
|
|
720
|
+
atlasMetadataCid = metadataIpfsResult.cid;
|
|
721
|
+
logger.info(`Atlas metadata pinned to IPFS – CID: ${atlasMetadataCid}`);
|
|
722
|
+
}
|
|
723
|
+
} catch (ipfsError) {
|
|
724
|
+
logger.warn('Failed to add atlas metadata to IPFS:', ipfsError.message);
|
|
725
|
+
}
|
|
726
|
+
|
|
635
727
|
// Upsert AtlasSpriteSheet document (with CID)
|
|
636
728
|
let atlasDoc = await AtlasSpriteSheet.findOne({ 'metadata.itemKey': atlasItemKey });
|
|
637
729
|
if (atlasDoc) {
|
|
@@ -649,10 +741,12 @@ try {
|
|
|
649
741
|
logger.info(`Created new AtlasSpriteSheet document: ${atlasDoc._id}`);
|
|
650
742
|
}
|
|
651
743
|
|
|
652
|
-
// Link atlas to ObjectLayer and set data.
|
|
744
|
+
// Link atlas to ObjectLayer and set data.render.cid + data.render.metadataCid
|
|
653
745
|
populatedObjectLayer.atlasSpriteSheetId = atlasDoc._id;
|
|
654
|
-
populatedObjectLayer.data.
|
|
655
|
-
populatedObjectLayer.
|
|
746
|
+
if (!populatedObjectLayer.data.render) populatedObjectLayer.data.render = {};
|
|
747
|
+
populatedObjectLayer.data.render.cid = atlasCid;
|
|
748
|
+
populatedObjectLayer.data.render.metadataCid = atlasMetadataCid;
|
|
749
|
+
populatedObjectLayer.markModified('data.render');
|
|
656
750
|
await populatedObjectLayer.save();
|
|
657
751
|
|
|
658
752
|
// Also write atlas PNG to both static asset directories
|
package/bin/index.js
CHANGED
|
@@ -256,22 +256,60 @@ try {
|
|
|
256
256
|
md5: crypto.createHash('md5').update(buffer).digest('hex'),
|
|
257
257
|
}).save();
|
|
258
258
|
|
|
259
|
+
// Pin atlas PNG to IPFS
|
|
260
|
+
let importAtlasCid = '';
|
|
261
|
+
let importAtlasMetadataCid = '';
|
|
262
|
+
try {
|
|
263
|
+
const ipfsResult = await IpfsClient.addBufferToIpfs(
|
|
264
|
+
buffer,
|
|
265
|
+
`${itemKey}_atlas_sprite_sheet.png`,
|
|
266
|
+
`/object-layer/${itemKey}/${itemKey}_atlas_sprite_sheet.png`,
|
|
267
|
+
);
|
|
268
|
+
if (ipfsResult) {
|
|
269
|
+
importAtlasCid = ipfsResult.cid;
|
|
270
|
+
logger.info(`Atlas sprite sheet pinned to IPFS – CID: ${importAtlasCid}`);
|
|
271
|
+
}
|
|
272
|
+
} catch (ipfsError) {
|
|
273
|
+
logger.warn('Failed to add atlas sprite sheet to IPFS:', ipfsError.message);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Pin atlas metadata JSON to IPFS (fast-json-stable-stringify)
|
|
277
|
+
try {
|
|
278
|
+
const metadataIpfsResult = await IpfsClient.addJsonToIpfs(
|
|
279
|
+
metadata,
|
|
280
|
+
`${itemKey}_atlas_sprite_sheet_metadata.json`,
|
|
281
|
+
`/object-layer/${itemKey}/${itemKey}_atlas_sprite_sheet_metadata.json`,
|
|
282
|
+
);
|
|
283
|
+
if (metadataIpfsResult) {
|
|
284
|
+
importAtlasMetadataCid = metadataIpfsResult.cid;
|
|
285
|
+
logger.info(`Atlas metadata pinned to IPFS – CID: ${importAtlasMetadataCid}`);
|
|
286
|
+
}
|
|
287
|
+
} catch (ipfsError) {
|
|
288
|
+
logger.warn('Failed to add atlas metadata to IPFS:', ipfsError.message);
|
|
289
|
+
}
|
|
290
|
+
|
|
259
291
|
let atlasDoc = await AtlasSpriteSheet.findOne({ 'metadata.itemKey': itemKey });
|
|
260
292
|
|
|
261
293
|
if (atlasDoc) {
|
|
262
294
|
atlasDoc.fileId = fileDoc._id;
|
|
295
|
+
atlasDoc.cid = importAtlasCid;
|
|
263
296
|
atlasDoc.metadata = metadata;
|
|
264
297
|
await atlasDoc.save();
|
|
265
298
|
logger.info(`Updated existing AtlasSpriteSheet document: ${atlasDoc._id}`);
|
|
266
299
|
} else {
|
|
267
300
|
atlasDoc = await new AtlasSpriteSheet({
|
|
268
301
|
fileId: fileDoc._id,
|
|
302
|
+
cid: importAtlasCid,
|
|
269
303
|
metadata,
|
|
270
304
|
}).save();
|
|
271
305
|
logger.info(`Created new AtlasSpriteSheet document: ${atlasDoc._id}`);
|
|
272
306
|
}
|
|
273
307
|
|
|
274
308
|
populatedObjectLayer.atlasSpriteSheetId = atlasDoc._id;
|
|
309
|
+
if (!populatedObjectLayer.data.render) populatedObjectLayer.data.render = {};
|
|
310
|
+
populatedObjectLayer.data.render.cid = importAtlasCid;
|
|
311
|
+
populatedObjectLayer.data.render.metadataCid = importAtlasMetadataCid;
|
|
312
|
+
populatedObjectLayer.markModified('data.render');
|
|
275
313
|
await populatedObjectLayer.save();
|
|
276
314
|
|
|
277
315
|
logger.info(`Atlas sprite sheet completed for item: ${itemKey}`);
|
|
@@ -436,12 +474,45 @@ try {
|
|
|
436
474
|
|
|
437
475
|
logger.info(`File saved with ID: ${fileDoc._id}`);
|
|
438
476
|
|
|
477
|
+
// Pin atlas PNG to IPFS
|
|
478
|
+
let toAtlasCid = '';
|
|
479
|
+
let toAtlasMetadataCid = '';
|
|
480
|
+
try {
|
|
481
|
+
const ipfsResult = await IpfsClient.addBufferToIpfs(
|
|
482
|
+
buffer,
|
|
483
|
+
`${itemKey}_atlas_sprite_sheet.png`,
|
|
484
|
+
`/object-layer/${itemKey}/${itemKey}_atlas_sprite_sheet.png`,
|
|
485
|
+
);
|
|
486
|
+
if (ipfsResult) {
|
|
487
|
+
toAtlasCid = ipfsResult.cid;
|
|
488
|
+
logger.info(`Atlas sprite sheet pinned to IPFS – CID: ${toAtlasCid}`);
|
|
489
|
+
}
|
|
490
|
+
} catch (ipfsError) {
|
|
491
|
+
logger.warn('Failed to add atlas sprite sheet to IPFS:', ipfsError.message);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// Pin atlas metadata JSON to IPFS (fast-json-stable-stringify)
|
|
495
|
+
try {
|
|
496
|
+
const metadataIpfsResult = await IpfsClient.addJsonToIpfs(
|
|
497
|
+
metadata,
|
|
498
|
+
`${itemKey}_atlas_sprite_sheet_metadata.json`,
|
|
499
|
+
`/object-layer/${itemKey}/${itemKey}_atlas_sprite_sheet_metadata.json`,
|
|
500
|
+
);
|
|
501
|
+
if (metadataIpfsResult) {
|
|
502
|
+
toAtlasMetadataCid = metadataIpfsResult.cid;
|
|
503
|
+
logger.info(`Atlas metadata pinned to IPFS – CID: ${toAtlasMetadataCid}`);
|
|
504
|
+
}
|
|
505
|
+
} catch (ipfsError) {
|
|
506
|
+
logger.warn('Failed to add atlas metadata to IPFS:', ipfsError.message);
|
|
507
|
+
}
|
|
508
|
+
|
|
439
509
|
// Check if atlas sprite sheet already exists
|
|
440
510
|
let atlasDoc = await AtlasSpriteSheet.findOne({ 'metadata.itemKey': itemKey });
|
|
441
511
|
|
|
442
512
|
if (atlasDoc) {
|
|
443
513
|
// Update existing
|
|
444
514
|
atlasDoc.fileId = fileDoc._id;
|
|
515
|
+
atlasDoc.cid = toAtlasCid;
|
|
445
516
|
atlasDoc.metadata = metadata;
|
|
446
517
|
await atlasDoc.save();
|
|
447
518
|
logger.info(`Updated existing AtlasSpriteSheet document: ${atlasDoc._id}`);
|
|
@@ -449,13 +520,18 @@ try {
|
|
|
449
520
|
// Create new
|
|
450
521
|
atlasDoc = await new AtlasSpriteSheet({
|
|
451
522
|
fileId: fileDoc._id,
|
|
523
|
+
cid: toAtlasCid,
|
|
452
524
|
metadata,
|
|
453
525
|
}).save();
|
|
454
526
|
logger.info(`Created new AtlasSpriteSheet document: ${atlasDoc._id}`);
|
|
455
527
|
}
|
|
456
528
|
|
|
457
|
-
// Update ObjectLayer with reference to atlas sprite sheet
|
|
529
|
+
// Update ObjectLayer with reference to atlas sprite sheet and render CIDs
|
|
458
530
|
objectLayer.atlasSpriteSheetId = atlasDoc._id;
|
|
531
|
+
if (!objectLayer.data.render) objectLayer.data.render = {};
|
|
532
|
+
objectLayer.data.render.cid = toAtlasCid;
|
|
533
|
+
objectLayer.data.render.metadataCid = toAtlasMetadataCid;
|
|
534
|
+
objectLayer.markModified('data.render');
|
|
459
535
|
await objectLayer.save();
|
|
460
536
|
|
|
461
537
|
logger.info(`Atlas sprite sheet completed for item: ${itemKey}`);
|
|
@@ -618,6 +694,7 @@ try {
|
|
|
618
694
|
}).save();
|
|
619
695
|
|
|
620
696
|
// Pin atlas PNG to IPFS + copy into MFS
|
|
697
|
+
let atlasMetadataCid = '';
|
|
621
698
|
try {
|
|
622
699
|
const ipfsResult = await IpfsClient.addBufferToIpfs(
|
|
623
700
|
buffer,
|
|
@@ -632,6 +709,21 @@ try {
|
|
|
632
709
|
logger.warn('Failed to add atlas sprite sheet to IPFS:', ipfsError.message);
|
|
633
710
|
}
|
|
634
711
|
|
|
712
|
+
// Pin atlas metadata JSON to IPFS (fast-json-stable-stringify)
|
|
713
|
+
try {
|
|
714
|
+
const metadataIpfsResult = await IpfsClient.addJsonToIpfs(
|
|
715
|
+
metadata,
|
|
716
|
+
`${atlasItemKey}_atlas_sprite_sheet_metadata.json`,
|
|
717
|
+
`/object-layer/${atlasItemKey}/${atlasItemKey}_atlas_sprite_sheet_metadata.json`,
|
|
718
|
+
);
|
|
719
|
+
if (metadataIpfsResult) {
|
|
720
|
+
atlasMetadataCid = metadataIpfsResult.cid;
|
|
721
|
+
logger.info(`Atlas metadata pinned to IPFS – CID: ${atlasMetadataCid}`);
|
|
722
|
+
}
|
|
723
|
+
} catch (ipfsError) {
|
|
724
|
+
logger.warn('Failed to add atlas metadata to IPFS:', ipfsError.message);
|
|
725
|
+
}
|
|
726
|
+
|
|
635
727
|
// Upsert AtlasSpriteSheet document (with CID)
|
|
636
728
|
let atlasDoc = await AtlasSpriteSheet.findOne({ 'metadata.itemKey': atlasItemKey });
|
|
637
729
|
if (atlasDoc) {
|
|
@@ -649,10 +741,12 @@ try {
|
|
|
649
741
|
logger.info(`Created new AtlasSpriteSheet document: ${atlasDoc._id}`);
|
|
650
742
|
}
|
|
651
743
|
|
|
652
|
-
// Link atlas to ObjectLayer and set data.
|
|
744
|
+
// Link atlas to ObjectLayer and set data.render.cid + data.render.metadataCid
|
|
653
745
|
populatedObjectLayer.atlasSpriteSheetId = atlasDoc._id;
|
|
654
|
-
populatedObjectLayer.data.
|
|
655
|
-
populatedObjectLayer.
|
|
746
|
+
if (!populatedObjectLayer.data.render) populatedObjectLayer.data.render = {};
|
|
747
|
+
populatedObjectLayer.data.render.cid = atlasCid;
|
|
748
|
+
populatedObjectLayer.data.render.metadataCid = atlasMetadataCid;
|
|
749
|
+
populatedObjectLayer.markModified('data.render');
|
|
656
750
|
await populatedObjectLayer.save();
|
|
657
751
|
|
|
658
752
|
// Also write atlas PNG to both static asset directories
|
package/conf.js
CHANGED
|
@@ -4,6 +4,138 @@ dotenv.config();
|
|
|
4
4
|
|
|
5
5
|
const DefaultConf = /**/ {
|
|
6
6
|
client: {
|
|
7
|
+
underpost: {
|
|
8
|
+
metadata: {
|
|
9
|
+
title: 'underpost.net - Technological and Cultural Lab',
|
|
10
|
+
description:
|
|
11
|
+
'Explore the intersection of technology and culture with in-depth articles, projects, and discussions.',
|
|
12
|
+
keywords: ['tech blog', 'cultural lab', 'technology', 'culture', 'innovation'],
|
|
13
|
+
author: 'https://github.com/underpostnet',
|
|
14
|
+
thumbnail: 'assets/banner/underpost-social.jpg',
|
|
15
|
+
themeColor: '#141414',
|
|
16
|
+
},
|
|
17
|
+
publicCopyNonExistingFiles: 'cyberia',
|
|
18
|
+
components: {
|
|
19
|
+
core: [
|
|
20
|
+
'CommonJs',
|
|
21
|
+
'VanillaJs',
|
|
22
|
+
'Responsive',
|
|
23
|
+
'Keyboard',
|
|
24
|
+
'Translate',
|
|
25
|
+
'Modal',
|
|
26
|
+
'SearchBox',
|
|
27
|
+
'BtnIcon',
|
|
28
|
+
'Logger',
|
|
29
|
+
'Css',
|
|
30
|
+
'NotificationManager',
|
|
31
|
+
'ToggleSwitch',
|
|
32
|
+
'DropDown',
|
|
33
|
+
'LoadingAnimation',
|
|
34
|
+
'EventsUI',
|
|
35
|
+
'AgGrid',
|
|
36
|
+
'Pagination',
|
|
37
|
+
'windowGetDimensions',
|
|
38
|
+
'Input',
|
|
39
|
+
'Validator',
|
|
40
|
+
'SignUp',
|
|
41
|
+
'LogIn',
|
|
42
|
+
'LogOut',
|
|
43
|
+
'Router',
|
|
44
|
+
'Account',
|
|
45
|
+
'PublicProfile',
|
|
46
|
+
'Scroll',
|
|
47
|
+
'Auth',
|
|
48
|
+
'FullScreen',
|
|
49
|
+
'RichText',
|
|
50
|
+
'CalendarCore',
|
|
51
|
+
'D3Chart',
|
|
52
|
+
'Stream',
|
|
53
|
+
'SocketIo',
|
|
54
|
+
'Docs',
|
|
55
|
+
'Content',
|
|
56
|
+
'FileExplorer',
|
|
57
|
+
'Chat',
|
|
58
|
+
'Worker',
|
|
59
|
+
'CssCore',
|
|
60
|
+
'Wallet',
|
|
61
|
+
'Badge',
|
|
62
|
+
'ToolTip',
|
|
63
|
+
'Webhook',
|
|
64
|
+
'Recover',
|
|
65
|
+
'Panel',
|
|
66
|
+
'PanelForm',
|
|
67
|
+
'Polyhedron',
|
|
68
|
+
],
|
|
69
|
+
underpost: [
|
|
70
|
+
'MenuUnderpost',
|
|
71
|
+
'RoutesUnderpost',
|
|
72
|
+
'ElementsUnderpost',
|
|
73
|
+
'CommonUnderpost',
|
|
74
|
+
'CssUnderpost',
|
|
75
|
+
'LogInUnderpost',
|
|
76
|
+
'LogOutUnderpost',
|
|
77
|
+
'SignUpUnderpost',
|
|
78
|
+
'LabGalleryUnderpost',
|
|
79
|
+
'CyberpunkBloggerUnderpost',
|
|
80
|
+
'TranslateUnderpost',
|
|
81
|
+
'SocketIoUnderpost',
|
|
82
|
+
'SettingsUnderpost',
|
|
83
|
+
'DocumentSearchProvider',
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
views: [
|
|
87
|
+
{ path: '/', title: 'Technological and Cultural Lab', client: 'Underpost', ssr: 'Underpost' },
|
|
88
|
+
{ path: '/lab-gallery', client: 'Underpost', ssr: 'Underpost' },
|
|
89
|
+
{ path: '/contracultura-cyberpunk', client: 'Underpost', ssr: 'Underpost' },
|
|
90
|
+
{ path: '/settings', client: 'Underpost', ssr: 'Underpost' },
|
|
91
|
+
{ path: '/log-in', client: 'Underpost', ssr: 'Underpost' },
|
|
92
|
+
{ path: '/sign-up', client: 'Underpost', ssr: 'Underpost' },
|
|
93
|
+
{ path: '/log-out', client: 'Underpost', ssr: 'Underpost' },
|
|
94
|
+
{ path: '/account', client: 'Underpost', ssr: 'Underpost' },
|
|
95
|
+
{ path: '/u', client: 'Underpost', ssr: 'Underpost' },
|
|
96
|
+
{ path: '/recover', client: 'Underpost', ssr: 'Underpost' },
|
|
97
|
+
{ path: '/polyhedron', client: 'Underpost', ssr: 'Underpost' },
|
|
98
|
+
],
|
|
99
|
+
dists: [
|
|
100
|
+
{
|
|
101
|
+
folder: './node_modules/@neodrag/vanilla/dist/min',
|
|
102
|
+
public_folder: '/dist/@neodrag-vanilla',
|
|
103
|
+
import_name: '@neodrag/vanilla',
|
|
104
|
+
import_name_build: '/dist/@neodrag-vanilla/index.js',
|
|
105
|
+
},
|
|
106
|
+
{ folder: './node_modules/@fortawesome/fontawesome-free', public_folder: '/dist/fontawesome' },
|
|
107
|
+
{
|
|
108
|
+
folder: './node_modules/sortablejs/modular',
|
|
109
|
+
public_folder: '/dist/sortablejs',
|
|
110
|
+
import_name: 'sortablejs',
|
|
111
|
+
import_name_build: '/dist/sortablejs/sortable.complete.esm.js',
|
|
112
|
+
},
|
|
113
|
+
{ folder: './node_modules/validator', public_folder: '/dist/validator' },
|
|
114
|
+
{
|
|
115
|
+
import_name: 'ag-grid-community',
|
|
116
|
+
import_name_build: '/dist/ag-grid-community/ag-grid-community.min.js',
|
|
117
|
+
folder: './node_modules/ag-grid-community/dist',
|
|
118
|
+
public_folder: '/dist/ag-grid-community',
|
|
119
|
+
styles: './node_modules/ag-grid-community/styles',
|
|
120
|
+
public_styles_folder: '/styles/ag-grid-community',
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
folder: './node_modules/socket.io/client-dist',
|
|
124
|
+
public_folder: '/dist/socket.io',
|
|
125
|
+
import_name: 'socket.io/client-dist/socket.io.esm.min.js',
|
|
126
|
+
import_name_build: '/dist/socket.io/socket.io.esm.min.js',
|
|
127
|
+
},
|
|
128
|
+
{ folder: './node_modules/peerjs/dist', public_folder: '/dist/peerjs' },
|
|
129
|
+
{ folder: './node_modules/easymde/dist', public_folder: '/dist/easymde' },
|
|
130
|
+
{
|
|
131
|
+
folder: './node_modules/marked/lib',
|
|
132
|
+
public_folder: '/dist/marked',
|
|
133
|
+
import_name: 'marked',
|
|
134
|
+
import_name_build: '/dist/marked/marked.esm.js',
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
services: ['core', 'user', 'file', 'test', 'document'],
|
|
138
|
+
},
|
|
7
139
|
'cyberia-portal': {
|
|
8
140
|
metadata: {
|
|
9
141
|
title: 'CYBERIA',
|
|
@@ -364,6 +496,16 @@ const DefaultConf = /**/ {
|
|
|
364
496
|
},
|
|
365
497
|
},
|
|
366
498
|
ssr: {
|
|
499
|
+
Underpost: {
|
|
500
|
+
head: ['Seo', 'Pwa', 'UnderpostScripts', 'Css'],
|
|
501
|
+
body: ['CacheControl', 'UnderpostDefaultSplashScreen'],
|
|
502
|
+
mailer: { userVerifyEmail: 'DefaultVerifyEmail', userRecoverEmail: 'DefaultRecoverEmail' },
|
|
503
|
+
offline: [
|
|
504
|
+
{ path: '/offline', title: 'No Network Connection', client: 'NoNetworkConnection', head: [], body: [] },
|
|
505
|
+
{ path: '/maintenance', title: 'Server Maintenance', client: 'Maintenance', head: [], body: [] },
|
|
506
|
+
],
|
|
507
|
+
pages: [{ path: '/test', title: 'Test', client: 'Test', head: [], body: [] }],
|
|
508
|
+
},
|
|
367
509
|
CyberiaPortal: {
|
|
368
510
|
head: ['Seo', 'Pwa', 'Microdata', 'CyberiaPortalScripts', 'Css'],
|
|
369
511
|
body: ['CacheControl', 'CyberiaDefaultSplashScreen'],
|
|
@@ -396,6 +538,56 @@ const DefaultConf = /**/ {
|
|
|
396
538
|
},
|
|
397
539
|
},
|
|
398
540
|
server: {
|
|
541
|
+
'underpost.net': {
|
|
542
|
+
'/': {
|
|
543
|
+
client: 'underpost',
|
|
544
|
+
runtime: 'nodejs',
|
|
545
|
+
apis: ['user', 'file', 'test', 'document'],
|
|
546
|
+
apiBaseProxyPath: null,
|
|
547
|
+
apiBaseHost: null,
|
|
548
|
+
origins: [],
|
|
549
|
+
minifyBuild: false,
|
|
550
|
+
liteBuild: true,
|
|
551
|
+
docsBuild: false,
|
|
552
|
+
ws: 'core',
|
|
553
|
+
peer: true,
|
|
554
|
+
proxy: [80, 443],
|
|
555
|
+
db: { provider: 'mongoose', host: 'mongodb://127.0.0.1:27017', name: 'default' },
|
|
556
|
+
valkey: { port: 6379, host: '127.0.0.1' },
|
|
557
|
+
mailer: {
|
|
558
|
+
sender: { email: 'noreply@default.net', name: 'Default' },
|
|
559
|
+
transport: {
|
|
560
|
+
host: 'smtp.default.com',
|
|
561
|
+
port: 465,
|
|
562
|
+
secure: true,
|
|
563
|
+
auth: { user: 'noreply@default.net', pass: '' },
|
|
564
|
+
},
|
|
565
|
+
},
|
|
566
|
+
},
|
|
567
|
+
},
|
|
568
|
+
'www.underpost.net': {
|
|
569
|
+
'/': {
|
|
570
|
+
client: null,
|
|
571
|
+
runtime: 'nodejs',
|
|
572
|
+
apis: [],
|
|
573
|
+
origins: [],
|
|
574
|
+
minifyBuild: false,
|
|
575
|
+
liteBuild: true,
|
|
576
|
+
docsBuild: false,
|
|
577
|
+
proxy: [80, 443],
|
|
578
|
+
redirect: 'https://underpost.net',
|
|
579
|
+
db: { provider: 'mongoose', host: 'mongodb://127.0.0.1:27017', name: 'default' },
|
|
580
|
+
mailer: {
|
|
581
|
+
sender: { email: 'noreply@default.net', name: 'Default' },
|
|
582
|
+
transport: {
|
|
583
|
+
host: 'smtp.default.com',
|
|
584
|
+
port: 465,
|
|
585
|
+
secure: true,
|
|
586
|
+
auth: { user: 'noreply@default.net', pass: '' },
|
|
587
|
+
},
|
|
588
|
+
},
|
|
589
|
+
},
|
|
590
|
+
},
|
|
399
591
|
'www.cyberiaonline.com': {
|
|
400
592
|
'/': {
|
|
401
593
|
client: 'cyberia-portal',
|