holosphere 1.1.5 → 1.1.7
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/FEDERATION.md +213 -0
- package/README.md +140 -0
- package/babel.config.js +5 -0
- package/examples/README-environmental.md +158 -0
- package/examples/environmentalData.js +380 -0
- package/examples/federation.js +154 -0
- package/examples/queryEnvironmentalData.js +147 -0
- package/examples/references.js +177 -0
- package/federation.js +988 -0
- package/holosphere.d.ts +445 -20
- package/holosphere.js +1083 -998
- package/package.json +3 -6
- package/services/environmentalApi.js +162 -0
- package/services/environmentalApi.test.js +0 -6
- package/test/ai.test.js +268 -76
- package/test/auth.test.js +241 -0
- package/test/delete.test.js +225 -0
- package/test/federation.test.js +163 -356
- package/test/holosphere.test.js +109 -955
- package/test/sea.html +33 -0
- package/test/jest.setup.js +0 -5
- package/test/spacesauth.test.js +0 -335
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "holosphere",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.7",
|
|
4
4
|
"description": "Holonic Geospatial Communication Infrastructure",
|
|
5
5
|
"main": "holosphere.js",
|
|
6
6
|
"types": "holosphere.d.ts",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"scripts": {
|
|
9
|
-
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js
|
|
9
|
+
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
10
10
|
"build": "",
|
|
11
11
|
"prepare": "npm run build"
|
|
12
12
|
},
|
|
@@ -30,9 +30,6 @@
|
|
|
30
30
|
"transform": {},
|
|
31
31
|
"moduleNameMapper": {
|
|
32
32
|
"^(\\.{1,2}/.*)\\.js$": "$1"
|
|
33
|
-
}
|
|
34
|
-
"setupFilesAfterEnv": [
|
|
35
|
-
"<rootDir>/test/jest.setup.js"
|
|
36
|
-
]
|
|
33
|
+
}
|
|
37
34
|
}
|
|
38
35
|
}
|
|
@@ -9,10 +9,79 @@ const logError = (service, error) => {
|
|
|
9
9
|
console.error(`${service} API Error:`, { status, message });
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
+
// Mock data responses (for testing without API keys)
|
|
13
|
+
const mockData = {
|
|
14
|
+
airQuality: {
|
|
15
|
+
coord: { lat: 41.9, lon: 12.5 },
|
|
16
|
+
list: [
|
|
17
|
+
{
|
|
18
|
+
main: { aqi: 2 },
|
|
19
|
+
components: {
|
|
20
|
+
co: 201.94,
|
|
21
|
+
no2: 0.78,
|
|
22
|
+
o3: 68.64,
|
|
23
|
+
pm2_5: 0.5,
|
|
24
|
+
pm10: 0.82,
|
|
25
|
+
so2: 0.52
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
carbonSequestration: {
|
|
31
|
+
properties: {
|
|
32
|
+
parameter: {
|
|
33
|
+
T2M: { '20230701': 28.5 },
|
|
34
|
+
PRECTOT: { '20230701': 1.2 },
|
|
35
|
+
PS: { '20230701': 1013.25 },
|
|
36
|
+
WS2M: { '20230701': 3.5 }
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
geometry: {
|
|
40
|
+
coordinates: [12.5, 41.9]
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
soilCarbon: {
|
|
44
|
+
properties: {
|
|
45
|
+
soilGrids: {
|
|
46
|
+
properties: {
|
|
47
|
+
soc: { mean: 78.4 }
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
soilType: 'Clay Loam'
|
|
51
|
+
},
|
|
52
|
+
geometry: {
|
|
53
|
+
coordinates: [12.5, 41.9]
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
biodiversity: {
|
|
57
|
+
results: [
|
|
58
|
+
{ scientificName: 'Quercus ilex', countryCode: 'ITA' },
|
|
59
|
+
{ scientificName: 'Pinus pinea', countryCode: 'ITA' },
|
|
60
|
+
{ scientificName: 'Olea europaea', countryCode: 'ITA' },
|
|
61
|
+
{ scientificName: 'Quercus ilex', countryCode: 'ITA' },
|
|
62
|
+
{ scientificName: 'Pinus pinea', countryCode: 'ITA' },
|
|
63
|
+
{ scientificName: 'Laurus nobilis', countryCode: 'ITA' },
|
|
64
|
+
{ scientificName: 'Quercus ilex', countryCode: 'ITA' },
|
|
65
|
+
{ scientificName: 'Platanus orientalis', countryCode: 'ITA' },
|
|
66
|
+
{ scientificName: 'Cupressus sempervirens', countryCode: 'ITA' },
|
|
67
|
+
{ scientificName: 'Cupressus sempervirens', countryCode: 'ITA' }
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// Flag to use mock data instead of making real API calls
|
|
73
|
+
const USE_MOCK_DATA = true;
|
|
74
|
+
|
|
12
75
|
/**
|
|
13
76
|
* Fetch Carbon Sequestration Data (Using NASA POWER API)
|
|
14
77
|
*/
|
|
15
78
|
export async function getCarbonSequestration(lat = 41.9, lon = 12.5) {
|
|
79
|
+
// Return mock data if flag is set
|
|
80
|
+
if (USE_MOCK_DATA) {
|
|
81
|
+
console.log('Using mock carbon sequestration data');
|
|
82
|
+
return mockData.carbonSequestration;
|
|
83
|
+
}
|
|
84
|
+
|
|
16
85
|
try {
|
|
17
86
|
const response = await axios.default.get(
|
|
18
87
|
`https://power.larc.nasa.gov/api/temporal/daily/point?parameters=T2M,PRECTOT,PS,WS2M&community=RE&longitude=${lon}&latitude=${lat}&start=20230101&end=20231231&format=JSON`
|
|
@@ -28,6 +97,12 @@ export async function getCarbonSequestration(lat = 41.9, lon = 12.5) {
|
|
|
28
97
|
* Fetch Soil Carbon Data (Using ISRIC World Soil Information)
|
|
29
98
|
*/
|
|
30
99
|
export async function getSoilCarbon(lat = 41.9, lon = 12.5) {
|
|
100
|
+
// Return mock data if flag is set
|
|
101
|
+
if (USE_MOCK_DATA) {
|
|
102
|
+
console.log('Using mock soil carbon data');
|
|
103
|
+
return mockData.soilCarbon;
|
|
104
|
+
}
|
|
105
|
+
|
|
31
106
|
try {
|
|
32
107
|
const response = await axios.default.get(
|
|
33
108
|
`https://rest.isric.org/soilgrids/v2.0/properties/query?lat=${lat}&lon=${lon}&property=soc&depth=0-30cm&value=mean`
|
|
@@ -43,6 +118,12 @@ export async function getSoilCarbon(lat = 41.9, lon = 12.5) {
|
|
|
43
118
|
* Fetch Biodiversity Data (GBIF API)
|
|
44
119
|
*/
|
|
45
120
|
export async function getBiodiversityData(countryCode = "ITA") {
|
|
121
|
+
// Return mock data if flag is set
|
|
122
|
+
if (USE_MOCK_DATA) {
|
|
123
|
+
console.log('Using mock biodiversity data');
|
|
124
|
+
return mockData.biodiversity;
|
|
125
|
+
}
|
|
126
|
+
|
|
46
127
|
try {
|
|
47
128
|
const response = await axios.default.get(`https://api.gbif.org/v1/occurrence/search?country=${countryCode}&limit=100`);
|
|
48
129
|
return response.data;
|
|
@@ -56,6 +137,12 @@ export async function getBiodiversityData(countryCode = "ITA") {
|
|
|
56
137
|
* Fetch Vegetation Cover Data (Using NASA MODIS Vegetation Index)
|
|
57
138
|
*/
|
|
58
139
|
export async function getVegetationCover(lat = 41.9, lon = 12.5) {
|
|
140
|
+
// Return mock data if flag is set
|
|
141
|
+
if (USE_MOCK_DATA) {
|
|
142
|
+
console.log('Using mock vegetation cover data');
|
|
143
|
+
return { ndvi: 0.75 };
|
|
144
|
+
}
|
|
145
|
+
|
|
59
146
|
try {
|
|
60
147
|
const response = await axios.default.get(
|
|
61
148
|
`https://modis.ornl.gov/rst/api/v1/MOD13Q1/subset?latitude=${lat}&longitude=${lon}&band=NDVI&startDate=2023-01-01&endDate=2023-12-31`,
|
|
@@ -76,6 +163,12 @@ export async function getVegetationCover(lat = 41.9, lon = 12.5) {
|
|
|
76
163
|
* Fetch Air Quality Data (OpenWeather API)
|
|
77
164
|
*/
|
|
78
165
|
export async function getAirQuality(lat = 41.9, lon = 12.5) {
|
|
166
|
+
// Return mock data if flag is set
|
|
167
|
+
if (USE_MOCK_DATA) {
|
|
168
|
+
console.log('Using mock air quality data');
|
|
169
|
+
return mockData.airQuality;
|
|
170
|
+
}
|
|
171
|
+
|
|
79
172
|
try {
|
|
80
173
|
const response = await axios.default.get(
|
|
81
174
|
`https://api.openweathermap.org/data/2.5/air_pollution?lat=${lat}&lon=${lon}&appid=${process.env.OPENWEATHER_API_KEY}`
|
|
@@ -91,6 +184,12 @@ export async function getAirQuality(lat = 41.9, lon = 12.5) {
|
|
|
91
184
|
* Fetch Water Retention Data (Using USGS Water Services)
|
|
92
185
|
*/
|
|
93
186
|
export async function getWaterRetention(lat = 41.9, lon = 12.5) {
|
|
187
|
+
// Return mock data if flag is set
|
|
188
|
+
if (USE_MOCK_DATA) {
|
|
189
|
+
console.log('Using mock water retention data');
|
|
190
|
+
return { waterRetention: 85.2 };
|
|
191
|
+
}
|
|
192
|
+
|
|
94
193
|
try {
|
|
95
194
|
const response = await axios.default.get(
|
|
96
195
|
`https://waterservices.usgs.gov/nwis/iv/?format=json&sites=11447650&siteStatus=active`,
|
|
@@ -111,6 +210,12 @@ export async function getWaterRetention(lat = 41.9, lon = 12.5) {
|
|
|
111
210
|
* Fetch Deforestation Data (Using World Bank Forest Data)
|
|
112
211
|
*/
|
|
113
212
|
export async function getDeforestationData(countryCode = "ITA") {
|
|
213
|
+
// Return mock data if flag is set
|
|
214
|
+
if (USE_MOCK_DATA) {
|
|
215
|
+
console.log('Using mock deforestation data');
|
|
216
|
+
return { forestAreaPercentage: 31.6, year: 2020 };
|
|
217
|
+
}
|
|
218
|
+
|
|
114
219
|
try {
|
|
115
220
|
const response = await axios.default.get(
|
|
116
221
|
`https://api.worldbank.org/v2/country/${countryCode}/indicator/AG.LND.FRST.ZS?format=json`
|
|
@@ -126,6 +231,12 @@ export async function getDeforestationData(countryCode = "ITA") {
|
|
|
126
231
|
* Fetch Flood Risk Data (Using USGS Water Services)
|
|
127
232
|
*/
|
|
128
233
|
export async function getFloodRisk(lat = 41.9, lon = 12.5) {
|
|
234
|
+
// Return mock data if flag is set
|
|
235
|
+
if (USE_MOCK_DATA) {
|
|
236
|
+
console.log('Using mock flood risk data');
|
|
237
|
+
return { floodRiskLevel: 'low', probability: 0.15 };
|
|
238
|
+
}
|
|
239
|
+
|
|
129
240
|
try {
|
|
130
241
|
const response = await axios.default.get(
|
|
131
242
|
`https://waterservices.usgs.gov/nwis/iv/?format=json&stateCd=CA¶meterCd=00065&siteStatus=active`,
|
|
@@ -146,6 +257,12 @@ export async function getFloodRisk(lat = 41.9, lon = 12.5) {
|
|
|
146
257
|
* Fetch Food Security Data (World Bank API)
|
|
147
258
|
*/
|
|
148
259
|
export async function getFoodSecurity(countryCode = "ITA") {
|
|
260
|
+
// Return mock data if flag is set
|
|
261
|
+
if (USE_MOCK_DATA) {
|
|
262
|
+
console.log('Using mock food security data');
|
|
263
|
+
return { prevalenceOfUndernourishment: 2.5, year: 2020 };
|
|
264
|
+
}
|
|
265
|
+
|
|
149
266
|
try {
|
|
150
267
|
const response = await axios.default.get(
|
|
151
268
|
`https://api.worldbank.org/v2/country/${countryCode}/indicator/SN.ITK.DEFC.ZS?format=json`
|
|
@@ -161,6 +278,12 @@ export async function getFoodSecurity(countryCode = "ITA") {
|
|
|
161
278
|
* Fetch Local Employment Rate (World Bank API)
|
|
162
279
|
*/
|
|
163
280
|
export async function getEmploymentRate(countryCode = "ITA") {
|
|
281
|
+
// Return mock data if flag is set
|
|
282
|
+
if (USE_MOCK_DATA) {
|
|
283
|
+
console.log('Using mock employment rate data');
|
|
284
|
+
return { employmentRate: 58.2, year: 2020 };
|
|
285
|
+
}
|
|
286
|
+
|
|
164
287
|
try {
|
|
165
288
|
const response = await axios.default.get(
|
|
166
289
|
`https://api.worldbank.org/v2/country/${countryCode}/indicator/SL.EMP.TOTL.SP.ZS?format=json`
|
|
@@ -176,6 +299,12 @@ export async function getEmploymentRate(countryCode = "ITA") {
|
|
|
176
299
|
* Fetch Governance Score (World Bank API)
|
|
177
300
|
*/
|
|
178
301
|
export async function getTransparencyScore(countryCode = "ITA") {
|
|
302
|
+
// Return mock data if flag is set
|
|
303
|
+
if (USE_MOCK_DATA) {
|
|
304
|
+
console.log('Using mock transparency score data');
|
|
305
|
+
return { governanceEffectivenessScore: 0.45, year: 2020 };
|
|
306
|
+
}
|
|
307
|
+
|
|
179
308
|
try {
|
|
180
309
|
const response = await axios.default.get(
|
|
181
310
|
`https://api.worldbank.org/v2/country/${countryCode}/indicator/GE.EST?format=json`
|
|
@@ -191,6 +320,17 @@ export async function getTransparencyScore(countryCode = "ITA") {
|
|
|
191
320
|
* Fetch Blockchain Transactions (Etherscan API)
|
|
192
321
|
*/
|
|
193
322
|
export async function getBlockchainTransactions(address = "0x0000000000000000000000000000000000000000") {
|
|
323
|
+
// Return mock data if flag is set
|
|
324
|
+
if (USE_MOCK_DATA) {
|
|
325
|
+
console.log('Using mock blockchain transactions data');
|
|
326
|
+
return {
|
|
327
|
+
result: [
|
|
328
|
+
{ hash: '0x123...', value: '0.5', timeStamp: '1620000000' },
|
|
329
|
+
{ hash: '0x456...', value: '1.2', timeStamp: '1620100000' }
|
|
330
|
+
]
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
|
|
194
334
|
try {
|
|
195
335
|
const response = await axios.default.get(
|
|
196
336
|
`https://api.etherscan.io/api?module=account&action=txlist&address=${address}&startblock=0&endblock=99999999&sort=desc&apikey=${process.env.ETHERSCAN_API_KEY}`
|
|
@@ -206,6 +346,12 @@ export async function getBlockchainTransactions(address = "0x0000000000000000000
|
|
|
206
346
|
* Fetch Circular Economy Data (Using World Bank Development Indicators)
|
|
207
347
|
*/
|
|
208
348
|
export async function getCircularEconomyData(countryCode = "ITA") {
|
|
349
|
+
// Return mock data if flag is set
|
|
350
|
+
if (USE_MOCK_DATA) {
|
|
351
|
+
console.log('Using mock circular economy data');
|
|
352
|
+
return { recyclingRate: 51.3, wasteGeneration: 499.0, year: 2020 };
|
|
353
|
+
}
|
|
354
|
+
|
|
209
355
|
try {
|
|
210
356
|
const response = await axios.default.get(
|
|
211
357
|
`https://api.worldbank.org/v2/country/${countryCode}/indicator/EN.ATM.GHGT.KT.CE?format=json`
|
|
@@ -221,6 +367,12 @@ export async function getCircularEconomyData(countryCode = "ITA") {
|
|
|
221
367
|
* Fetch Renewable Energy Data (World Bank API)
|
|
222
368
|
*/
|
|
223
369
|
export async function getRenewableEnergyData(countryCode = "ITA") {
|
|
370
|
+
// Return mock data if flag is set
|
|
371
|
+
if (USE_MOCK_DATA) {
|
|
372
|
+
console.log('Using mock renewable energy data');
|
|
373
|
+
return { renewableEnergyPercentage: 18.2, year: 2020 };
|
|
374
|
+
}
|
|
375
|
+
|
|
224
376
|
try {
|
|
225
377
|
const response = await axios.default.get(
|
|
226
378
|
`https://api.worldbank.org/v2/country/${countryCode}/indicator/EG.FEC.RNEW.ZS?format=json`
|
|
@@ -236,6 +388,16 @@ export async function getRenewableEnergyData(countryCode = "ITA") {
|
|
|
236
388
|
* Fetch Climate Change Data (NOAA Climate API)
|
|
237
389
|
*/
|
|
238
390
|
export async function getClimateChangeData(lat = 41.9, lon = 12.5) {
|
|
391
|
+
// Return mock data if flag is set
|
|
392
|
+
if (USE_MOCK_DATA) {
|
|
393
|
+
console.log('Using mock climate change data');
|
|
394
|
+
return {
|
|
395
|
+
temperatureTrend: '+1.2C over 50 years',
|
|
396
|
+
extremeWeatherEvents: 5,
|
|
397
|
+
year: 2020
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
|
|
239
401
|
try {
|
|
240
402
|
const response = await axios.default.get(
|
|
241
403
|
`https://www.ncdc.noaa.gov/cdo-web/api/v2/data?datasetid=GHCND&latitude=${lat}&longitude=${lon}&startdate=2023-01-01&enddate=2023-12-31&limit=1000`,
|