godprotocol 2.3.66 → 2.3.71

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/Godprotocol.js CHANGED
@@ -142,18 +142,31 @@ class GodProtocol {
142
142
  await version_middleware(req, res, this.route_table);
143
143
  };
144
144
 
145
- callback({ before, after, error } = {}) {
146
- if (before) {
147
- this.route_table.before(before);
148
- }
149
-
150
- if (after) {
151
- this.route_table.after(after);
152
- }
153
-
154
- if (error) {
155
- this.route_table.error(error);
156
- }
145
+ callback({
146
+ before,
147
+ after,
148
+ error,
149
+ on_service,
150
+ service_error,
151
+ after_service,
152
+ } = {}) {
153
+ const register = (callbacks, method) => {
154
+ if (Array.isArray(callbacks)) return callbacks.map(method);
155
+ if (callbacks) return method(callbacks);
156
+ };
157
+
158
+ register(before, (callback) => this.route_table.callbacks.before(callback));
159
+ register(after, (callback) => this.route_table.callbacks.after(callback));
160
+ register(service_error, (callback) =>
161
+ this.route_table.callbacks.service_error(callback),
162
+ );
163
+ register(error, (callback) => this.route_table.callbacks.error(callback));
164
+ register(on_service, (callback) =>
165
+ this.route_table.callbacks.on_service(callback),
166
+ );
167
+ register(after_service, (callback) =>
168
+ this.route_table.callbacks.after_service(callback),
169
+ );
157
170
  }
158
171
  }
159
172
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "godprotocol",
3
- "version": "2.3.66",
3
+ "version": "2.3.71",
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",
@@ -0,0 +1,94 @@
1
+ class Callbacks {
2
+ constructor(gp) {
3
+ this.gp = gp;
4
+
5
+ this.before_callbacks = new Array();
6
+ this.after_callbacks = new Array();
7
+ this.error_callbacks = new Array();
8
+ this.on_service_callbacks = new Array();
9
+ this.after_service_callbacks = new Array();
10
+ this.service_error_callbacks = new Array();
11
+ }
12
+
13
+ before(fn) {
14
+ this.before_callbacks.push(fn);
15
+ }
16
+
17
+ on_service(fn) {
18
+ this.on_service_callbacks.push(fn);
19
+ }
20
+
21
+ after_service(fn) {
22
+ this.after_service_callbacks.push(fn);
23
+ }
24
+
25
+ service_error(fn) {
26
+ this.service_error_callbacks.push(fn);
27
+ }
28
+
29
+ after(fn) {
30
+ this.after_callbacks.push(fn);
31
+ }
32
+
33
+ error(fn) {
34
+ this.error_callbacks.push(fn);
35
+ }
36
+
37
+ handle_before = async (payload) => {
38
+ for (const callback of this.before_callbacks) {
39
+ const result = await callback(payload, this.gp);
40
+
41
+ if (result && result.ok === false) {
42
+ return result;
43
+ }
44
+ }
45
+
46
+ return { ok: true };
47
+ };
48
+
49
+ handle_after = async (payload) => {
50
+ for (const callback of this.after_callbacks) {
51
+ await callback(payload, this.gp);
52
+ }
53
+
54
+ return { ok: true };
55
+ };
56
+
57
+ handle_error_callback = async (payload) => {
58
+ for (const callback of this.error_callbacks) {
59
+ await callback(payload, this.gp);
60
+ }
61
+
62
+ return { ok: true };
63
+ };
64
+
65
+ handle_on_service_callback = async (payload) => {
66
+ for (const callback of this.on_service_callbacks) {
67
+ const result = await callback(payload, this.gp);
68
+
69
+ if (result && result.ok === false) {
70
+ return result;
71
+ }
72
+ }
73
+
74
+ return { ok: true };
75
+ };
76
+
77
+ handle_after_service_callback = async (payload) => {
78
+ for (const callback of this.after_service_callbacks) {
79
+ await callback(payload, this.gp);
80
+ }
81
+
82
+ return { ok: true };
83
+ };
84
+
85
+ handle_error_service_callback = async (payload) => {
86
+ for (const callback of this.service_error_callbacks) {
87
+ await callback(payload, this.gp);
88
+ }
89
+
90
+ return { ok: true };
91
+ };
92
+ }
93
+
94
+ export default Callbacks;
@@ -1,3 +1,4 @@
1
+ import Callbacks from "./Callbacks.js";
1
2
  import Headers from "./Header.js";
2
3
 
3
4
  let securities = {
@@ -41,52 +42,11 @@ class Route_table extends Headers {
41
42
  this.platform_uri = gp.platform_uri;
42
43
  this.versions = {};
43
44
 
44
- this.before_callbacks = new Array();
45
- this.after_callbacks = new Array();
46
- this.error_callbacks = new Array();
47
45
  this.validators = {};
48
- }
49
-
50
- before(fn) {
51
- this.before_callbacks.push(fn);
52
- }
53
46
 
54
- after(fn) {
55
- this.after_callbacks.push(fn);
47
+ this.callbacks = new Callbacks(this.gp);
56
48
  }
57
49
 
58
- error(fn) {
59
- this.error_callbacks.push(fn);
60
- }
61
-
62
- handle_before = async (payload) => {
63
- for (const callback of this.before_callbacks) {
64
- const result = await callback(payload, this.gp);
65
-
66
- if (result && result.ok === false) {
67
- return result;
68
- }
69
- }
70
-
71
- return { ok: true };
72
- };
73
-
74
- handle_after = async (payload) => {
75
- for (const callback of this.after_callbacks) {
76
- await callback(payload, this.gp);
77
- }
78
-
79
- return { ok: true };
80
- };
81
-
82
- handle_error_callback = async (payload) => {
83
- for (const callback of this.error_callbacks) {
84
- await callback(payload, this.gp);
85
- }
86
-
87
- return { ok: true };
88
- };
89
-
90
50
  get_version = async (version = this.active_version) => {
91
51
  let resolved_version = version;
92
52
 
@@ -72,84 +72,122 @@ class Services {
72
72
 
73
73
  if (!servic) return;
74
74
 
75
- return {
76
- api_version: servic.api_version,
77
- uri: servic.uri,
78
- call: async (path, body, header) => {
79
- let headers = {
80
- "Content-Type": "application/json",
81
- Accept: "application/json",
82
- "x-api-version":
83
- servic.local && !header?.api_version?.startsWith(`${servic.local}:`)
84
- ? `${servic.local}:${header?.api_version || servic.api_version}`
85
- : header?.api_version || servic.api_version || "v1",
86
- };
75
+ let call = async (path, body, header) => {
76
+ let headers = {
77
+ "Content-Type": "application/json",
78
+ Accept: "application/json",
79
+ "x-api-version":
80
+ servic.local && !header?.api_version?.startsWith(`${servic.local}:`)
81
+ ? `${servic.local}:${header?.api_version || servic.api_version}`
82
+ : header?.api_version || servic.api_version || "v1",
83
+ };
84
+
85
+ if (header?.api_key) {
86
+ headers["x-api-key"] = header.api_key;
87
+ } else if (servic.api_key) {
88
+ headers["x-api-key"] = servic.api_key;
89
+ }
87
90
 
88
- if (header?.api_key) {
89
- headers["x-api-key"] = header.api_key;
90
- } else if (servic.api_key) {
91
- headers["x-api-key"] = servic.api_key;
91
+ if (header?.token) {
92
+ headers["Authorization"] = `Bearer ${header.token}`;
93
+ headers["x-platform"] = this.platform_uri;
94
+ } else if (servic.profile_key) {
95
+ headers["Authorization"] = `${servic.profile_key}`;
96
+ } else if (header?.profile) {
97
+ let token = await this.get_token(servic, header);
98
+
99
+ if (typeof token !== "string") {
100
+ if (token?.ok === false) return token;
92
101
  }
93
102
 
94
- if (header?.token) {
95
- headers["Authorization"] = `Bearer ${header.token}`;
96
- headers["x-platform"] = this.platform_uri;
97
- } else if (servic.profile_key) {
98
- headers["Authorization"] = `${servic.profile_key}`;
99
- } else if (header?.profile) {
100
- let token = await this.get_token(servic, header);
103
+ if (token) headers["Authorization"] = `Bearer ${token}`;
104
+ headers["x-platform"] = this.platform_uri;
105
+ }
106
+
107
+ if (header?.xplatform) headers["x-platform"] = header.xplatform;
108
+
109
+ if (
110
+ !headers["x-api-key"] &&
111
+ !headers["Authorization"] &&
112
+ !servic.opened
113
+ ) {
114
+ return {
115
+ ok: false,
116
+ status_code: "service_unauthorised",
117
+ message: "Service unauthorised",
118
+ };
119
+ }
101
120
 
102
- if (typeof token !== "string") {
103
- if (token?.ok === false) return token;
104
- }
121
+ let url = `${servic.local ? this.gp.server.domain : servic.url}/${path}`;
105
122
 
106
- if (token) headers["Authorization"] = `Bearer ${token}`;
107
- headers["x-platform"] = this.platform_uri;
108
- }
123
+ let request_payload = {
124
+ service: servic,
125
+ url,
126
+ path,
127
+ headers,
128
+ body,
129
+ };
130
+ await this.callbacks.handle_on_service_callback(request_payload);
109
131
 
110
- if (header?.xplatform) headers["x-platform"] = header.xplatform;
132
+ try {
133
+ let response = await fetch(url, {
134
+ method: "POST",
135
+ headers,
136
+ body: JSON.stringify(body || {}),
137
+ });
111
138
 
112
- if (
113
- !headers["x-api-key"] &&
114
- !headers["Authorization"] &&
115
- !servic.opened
116
- ) {
117
- return {
118
- ok: false,
119
- status_code: "service_unauthorised",
120
- meesage: "Service unauthorised",
121
- };
122
- }
139
+ let reply = await response.json();
123
140
 
124
- try {
125
- let response = await fetch(
126
- `${servic.local ? this.gp.server.domain : servic.url}/${path}`,
127
- {
128
- method: "POST",
129
- headers,
130
- body: JSON.stringify(body || {}),
131
- },
132
- );
133
-
134
- let reply = await response.json();
135
-
136
- if (typeof reply?.ok !== "boolean") {
137
- return {
138
- ok: false,
139
- message: `Response calling ${service} service at path ${path}`,
140
- data: reply,
141
- };
142
- }
143
- return reply;
144
- } catch (e) {
145
- return {
141
+ if (typeof reply?.ok !== "boolean") {
142
+ reply = {
146
143
  ok: false,
147
- message:
148
- e.message || `Error calling ${service} service at path ${path}`,
149
- status: 500,
144
+ message: `Response calling ${service} service at path ${path}`,
145
+ data: reply,
150
146
  };
151
147
  }
152
- },
148
+
149
+ await this.callbacks.handle_after_service_callback({
150
+ request_payload,
151
+ response: reply,
152
+ });
153
+
154
+ return reply;
155
+ } catch (e) {
156
+ let pload = {
157
+ ok: false,
158
+ message:
159
+ e.message || `Error calling ${service} service at path ${path}`,
160
+ status: 500,
161
+ };
162
+ await this.callbacks.handle_error_service_callback({
163
+ request_payload,
164
+ reply: pload,
165
+ error_object: e,
166
+ });
167
+
168
+ return pload;
169
+ }
170
+ };
171
+
172
+ let interface_;
173
+ if (servic.interface) {
174
+ interface_ = new servic.interface({
175
+ gp: this.gp,
176
+ call,
177
+ uri: servic.uri,
178
+ api_version: servic.api_version,
179
+ });
180
+ }
181
+
182
+ if (opts.interface) {
183
+ return interface_ || null;
184
+ }
185
+
186
+ return {
187
+ api_version: servic.api_version,
188
+ uri: servic.uri,
189
+ interface: interface_,
190
+ call,
153
191
  };
154
192
  };
155
193
 
@@ -198,50 +236,6 @@ class Services {
198
236
  return db;
199
237
  };
200
238
 
201
- handle_webhook_prior = async (req) => {
202
- let fn = this.gp.webhook_prior;
203
-
204
- if (typeof fn === "function") {
205
- let res = await fn(req);
206
- return res && Object.keys(res).hasOwnProperty("ok") ? res : { ok: false };
207
- }
208
- return {
209
- ok: true,
210
- };
211
- };
212
-
213
- handle_webhook_after = async (req, result) => {
214
- let { headers, body, route } = req;
215
- let { xplatform, third_party, platform } = headers;
216
-
217
- if (xplatform && xplatform.uri !== platform.uri) {
218
- let webhook = third_party?.webhook || xplatform.webhook;
219
-
220
- if (webhook?.enabled) {
221
- if (webhook?.routes?.length && !webhook?.routes?.includes(route))
222
- return;
223
-
224
- await fetch(webhook?.url, {
225
- method: "POST",
226
- headers: {
227
- "Content-Type": "application/json",
228
- Accept: "application/json",
229
- "x-api-version": webhook?.api_version || "v1",
230
- },
231
- body: JSON.stringify({
232
- me: xplatform,
233
- profile,
234
- platform,
235
- body,
236
- result,
237
- route,
238
- }),
239
- });
240
- }
241
- } else {
242
- }
243
- };
244
-
245
239
  resolve_db = async (req, opts = {}) => {
246
240
  let db = await this.platform_db(opts?.db_name);
247
241
 
package/server/utils.js CHANGED
@@ -1,4 +1,9 @@
1
- import crypto, { createHash, randomBytes, createCipheriv } from "crypto";
1
+ import crypto, {
2
+ createHash,
3
+ randomBytes,
4
+ createCipheriv,
5
+ createDecipheriv,
6
+ } from "crypto";
2
7
 
3
8
  const deriveKey = (secret) =>
4
9
  createHash("sha256").update(String(secret)).digest();
@@ -441,7 +441,7 @@ const version_middleware = async (req, res, routers) => {
441
441
  });
442
442
 
443
443
  // WEBHOOK PRIOR
444
- callback = await router.handle_before({
444
+ callback = await router?.callbacks.handle_before({
445
445
  req,
446
446
  body,
447
447
  query,
@@ -483,7 +483,7 @@ const version_middleware = async (req, res, routers) => {
483
483
  if (!isWebhook && version !== "*") {
484
484
  error_stage = "Webhook";
485
485
 
486
- await router.handle_after({
486
+ await router.callbacks.handle_after({
487
487
  req: payload,
488
488
  result,
489
489
  headers: req.headers,
@@ -499,7 +499,7 @@ const version_middleware = async (req, res, routers) => {
499
499
  console.error(`${error_stage} Error:`, err);
500
500
 
501
501
  try {
502
- await routers?.handle_error_callback?.({
502
+ await routers?.callbacks?.handle_error_callback?.({
503
503
  request_id: req?.request_id,
504
504
  stage: error_stage,
505
505
  timestamp: new Date().toISOString(),