godprotocol 2.2.58 → 2.2.60

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "godprotocol",
3
- "version": "2.2.58",
3
+ "version": "2.2.60",
4
4
  "description": "A distributed computing environment for Web 4.0 — integrating AI, decentralisation, and virtual computation.",
5
5
  "main": "Index.js",
6
6
  "type": "module",
@@ -98,11 +98,11 @@ class Headers extends Services {
98
98
  // 🔹 1. Try cache
99
99
  const cached = await db.read_cache(query, "auth");
100
100
 
101
- if (cached?.payload) {
101
+ if (cached) {
102
102
  try {
103
103
  return {
104
104
  ok: true,
105
- data: JSON.parse(cached.payload),
105
+ data: cached,
106
106
  };
107
107
  } catch {
108
108
  // corrupted cache → ignore
@@ -111,7 +111,7 @@ class Headers extends Services {
111
111
 
112
112
  // 🔹 2. Call remote
113
113
  const headers = {
114
- "x-api-version": "v2",
114
+ "x-api-version": "v3",
115
115
  "x-api-key": api_key,
116
116
  };
117
117
 
@@ -124,7 +124,7 @@ class Headers extends Services {
124
124
  headers: {
125
125
  "Content-Type": "application/json",
126
126
  Accept: "application/json",
127
- "x-api-version": "v2",
127
+ "x-api-version": "v3",
128
128
  ...headers,
129
129
  },
130
130
  body: JSON.stringify({}),
@@ -152,11 +152,11 @@ class Headers extends Services {
152
152
  // 🔹 1. Try cache
153
153
  const cached = await db.read_cache(query, "auth");
154
154
 
155
- if (cached?.payload) {
155
+ if (cached) {
156
156
  try {
157
157
  return {
158
158
  ok: true,
159
- data: JSON.parse(cached.payload),
159
+ data: cached,
160
160
  };
161
161
  } catch {
162
162
  // corrupted cache → ignore
@@ -222,7 +222,9 @@ class Headers extends Services {
222
222
  return {
223
223
  ok: false,
224
224
  status: 401,
225
- message: "Unauthorized",
225
+ message:
226
+ "Unauthorized: Missing required authentication headers of type(s): " +
227
+ route.config.security.join(", "),
226
228
  };
227
229
  }
228
230
 
@@ -232,10 +234,13 @@ class Headers extends Services {
232
234
  if (authorisation) authorisation = authorisation.replace("Bearer ", "");
233
235
 
234
236
  let val;
235
- if (xplatform) {
236
- val = await this.validate_third_party(xplatform, authorisation);
237
- } else {
237
+ if (api_key) {
238
238
  val = await this.validate_api_key(api_key, authorisation);
239
+ } else if (authorisation) {
240
+ val = await this.validate_third_party(
241
+ xplatform || this.platform_uri,
242
+ authorisation,
243
+ );
239
244
  }
240
245
 
241
246
  // debug(val);
@@ -246,7 +251,8 @@ class Headers extends Services {
246
251
  if (!val) {
247
252
  return {
248
253
  ok: false,
249
- message: "malformed header validation",
254
+ message:
255
+ "Unauthorized: Invalid credentials provided in authentication headers",
250
256
  status: 403,
251
257
  };
252
258
  }
@@ -63,18 +63,24 @@ class Route_table extends Headers {
63
63
  };
64
64
 
65
65
  check_validation = async (rule, data) => {
66
- let { prop, type, required, default: is_default } = rule;
66
+ let { prop, type, required } = rule;
67
67
 
68
68
  let data_value = data[prop];
69
69
 
70
- data_value =
71
- data_value == null || data_value == undefined ? is_default : data_value;
72
-
73
- if (required && (data_value == null || data_value == is_default))
74
- return { ok: false, message: `Field '${prop}' is required` };
70
+ if (data_value === undefined && rule.hasOwnProperty("default_value")) {
71
+ data_value = rule.default_value;
72
+ data[prop] = data_value;
73
+ }
75
74
 
76
- if (data_value == null) {
77
- return { ok: true };
75
+ if (data_value === undefined || data_value === null) {
76
+ if (required) {
77
+ return {
78
+ ok: false,
79
+ message: `Field '${prop}' is required`,
80
+ };
81
+ } else {
82
+ return { ok: true };
83
+ }
78
84
  }
79
85
 
80
86
  if (type) {
@@ -41,7 +41,7 @@ class Services {
41
41
  headers: {
42
42
  "Content-Type": "application/json",
43
43
  Accept: "application/json",
44
- "x-api-version": "v2",
44
+ "x-api-version": "v3",
45
45
  "x-api-key": this.api_key,
46
46
  },
47
47
  body: JSON.stringify({ platform_uri: service.uri, ...id }),
@@ -63,7 +63,9 @@ class Services {
63
63
  return {
64
64
  ok: false,
65
65
  status: 500,
66
- message: e.message,
66
+ message:
67
+ e.message ||
68
+ `Error fetching ${service.uri} service token for profile`,
67
69
  };
68
70
  }
69
71
 
@@ -107,7 +109,8 @@ class Services {
107
109
  } catch (e) {
108
110
  return {
109
111
  ok: false,
110
- message: e.message,
112
+ message:
113
+ e.message || `Error calling ${service} service at path ${path}`,
111
114
  status: 500,
112
115
  };
113
116
  }
@@ -1,91 +1,133 @@
1
- const respond = async (result, res) => {
2
- let response = {
3
- ok: result?.ok,
4
- message: result.message,
5
- data: result.data,
1
+ const getBody = (req) => {
2
+ return new Promise((resolve, reject) => {
3
+ let data = "";
4
+
5
+ req.on("data", (chunk) => {
6
+ data += chunk;
7
+ });
8
+
9
+ req.on("end", () => {
10
+ try {
11
+ const parsed = data ? JSON.parse(data) : {};
12
+ resolve(parsed);
13
+ } catch (err) {
14
+ reject(new Error("Invalid JSON body"));
15
+ }
16
+ });
17
+
18
+ req.on("error", (err) => {
19
+ reject(err);
20
+ });
21
+ });
22
+ };
23
+
24
+ const respond = (result, res) => {
25
+ const response = {
26
+ ok: result?.ok ?? false,
27
+ message: result?.message ?? "",
28
+ data: result?.data,
6
29
  };
7
- if (result.pagination) response.pagination = result.pagination;
8
- if (result.token) response.token = result.token;
9
30
 
10
- if (!res) return response;
31
+ if (result?.pagination) response.pagination = result.pagination;
32
+ if (result?.token) response.token = result.token;
11
33
 
12
- res.status(result?.status || (result?.ok ? 200 : 403)).json(response);
34
+ const status = result?.status || (result?.ok ? 200 : 403);
35
+
36
+ res.statusCode = status;
37
+ res.setHeader("Content-Type", "application/json");
38
+ res.end(JSON.stringify(response));
39
+
40
+ return response;
13
41
  };
14
42
 
15
43
  const version_middleware = async (req, res, routers) => {
16
44
  try {
17
45
  const version = req.headers["x-api-version"] || "v1";
18
46
 
19
- let router = routers.get_version(version);
20
-
21
- if (router.config?.is_old) return router.routes(req, res);
22
-
23
- if (!router) {
24
- return res.status(400).json({
25
- error: "Invalid API version",
26
- version,
27
- });
47
+ const versionRouter = routers.get_version(version);
48
+ // ----------------------------
49
+ // BODY (STREAM PARSE)
50
+ // ----------------------------
51
+ const body = await getBody(req);
52
+
53
+ if (!versionRouter) {
54
+ res.statusCode = 400;
55
+ return res.end(
56
+ JSON.stringify({
57
+ ok: false,
58
+ error: "Invalid API version",
59
+ version,
60
+ }),
61
+ );
28
62
  }
29
63
 
30
- router = routers;
64
+ if (versionRouter.config?.is_old) {
65
+ req.body = body;
66
+ return versionRouter.routes(req, res);
67
+ }
31
68
 
32
- let name = req.path.slice(1),
33
- result;
69
+ const router = routers;
70
+ const name = req.url.replace(/^\//, "");
34
71
 
35
- try {
36
- result = await router.handle_security(name, req);
37
- // console.log("Security check result:", result);
72
+ const isWebhook = req.headers["is-webhook"];
38
73
 
39
- if (result !== true) {
40
- return await respond(result, res);
41
- }
42
- } catch (err) {
43
- console.error(err);
74
+ // ----------------------------
75
+ // SECURITY
76
+ // ----------------------------
77
+ const securityResult = await router.handle_security(name, req);
44
78
 
45
- throw new Error("Security check failed");
79
+ if (securityResult !== true) {
80
+ return respond(securityResult, res);
46
81
  }
47
82
 
48
- let db = await router.resolve_db(req);
49
- let is_webhook = req.headers["is-webhook"];
83
+ // ----------------------------
84
+ // DB
85
+ // ----------------------------
86
+ const db = await router.resolve_db(req);
50
87
 
51
- // console.log(req.headers);
52
- if (!is_webhook) {
53
- let web_prior = await router.handle_webhook_prior(req);
88
+ // ----------------------------
89
+ // WEBHOOK PRIOR
90
+ // ----------------------------
91
+ if (!isWebhook) {
92
+ const webPrior = await router.handle_webhook_prior(req);
54
93
 
55
- if (web_prior === false) {
56
- } else if (!web_prior?.ok) {
57
- return await respond(web_prior, res);
58
- } else {
59
- req.headers.webhook_prior = web_prior;
94
+ if (webPrior && webPrior.ok === false) {
95
+ return respond(webPrior, res);
60
96
  }
61
- }
62
-
63
- try {
64
- result = await router.execute(name, {
65
- body: req.body,
66
- headers: req.headers,
67
- db: db.db,
68
- gp: router.gp,
69
- services: router.get_service,
70
- });
71
97
 
72
- !is_webhook && (await router.handle_webhook_after(req, result));
73
-
74
- return await respond(result, res);
75
- } catch (err) {
76
- console.error(err);
98
+ if (webPrior?.ok) {
99
+ req.headers.webhook_prior = webPrior;
100
+ }
101
+ }
77
102
 
78
- throw new Error("Route execution failed");
103
+ // ----------------------------
104
+ // EXECUTE
105
+ // ----------------------------
106
+ const result = await router.execute(name, {
107
+ body,
108
+ headers: req.headers,
109
+ db: db.db,
110
+ gp: router.gp,
111
+ services: router.get_service,
112
+ });
113
+
114
+ // ----------------------------
115
+ // WEBHOOK AFTER
116
+ // ----------------------------
117
+ if (!isWebhook) {
118
+ await router.handle_webhook_after(req, result);
79
119
  }
120
+
121
+ return respond(result, res);
80
122
  } catch (err) {
81
123
  console.error("Version Middleware Error:", err);
82
124
 
83
- return (
84
- res &&
85
- res.status(500).json({
125
+ res.statusCode = 500;
126
+ res.end(
127
+ JSON.stringify({
86
128
  ok: false,
87
129
  message: "Internal server error",
88
- })
130
+ }),
89
131
  );
90
132
  }
91
133
  };