jinaga-server 1.0.0

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.
Files changed (127) hide show
  1. package/LICENSE +22 -0
  2. package/dist/authentication/authentication-device.d.ts +20 -0
  3. package/dist/authentication/authentication-device.js +61 -0
  4. package/dist/authentication/authentication-device.js.map +1 -0
  5. package/dist/authentication/authentication-impl.d.ts +21 -0
  6. package/dist/authentication/authentication-impl.js +61 -0
  7. package/dist/authentication/authentication-impl.js.map +1 -0
  8. package/dist/authentication/authentication-session.d.ts +23 -0
  9. package/dist/authentication/authentication-session.js +85 -0
  10. package/dist/authentication/authentication-session.js.map +1 -0
  11. package/dist/authentication/authentication.d.ts +5 -0
  12. package/dist/authentication/authentication.js +3 -0
  13. package/dist/authentication/authentication.js.map +1 -0
  14. package/dist/authentication.d.ts +17 -0
  15. package/dist/authentication.js +52 -0
  16. package/dist/authentication.js.map +1 -0
  17. package/dist/authorization/authorization-keystore.d.ts +13 -0
  18. package/dist/authorization/authorization-keystore.js +61 -0
  19. package/dist/authorization/authorization-keystore.js.map +1 -0
  20. package/dist/http/node-http.d.ts +7 -0
  21. package/dist/http/node-http.js +126 -0
  22. package/dist/http/node-http.js.map +1 -0
  23. package/dist/http/router.d.ts +20 -0
  24. package/dist/http/router.js +223 -0
  25. package/dist/http/router.js.map +1 -0
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.js +6 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/jinaga-server.d.ts +18 -0
  30. package/dist/jinaga-server.js +101 -0
  31. package/dist/jinaga-server.js.map +1 -0
  32. package/dist/keystore.d.ts +9 -0
  33. package/dist/keystore.js +3 -0
  34. package/dist/keystore.js.map +1 -0
  35. package/dist/memory/memory-keystore.d.ts +16 -0
  36. package/dist/memory/memory-keystore.js +86 -0
  37. package/dist/memory/memory-keystore.js.map +1 -0
  38. package/dist/postgres/connection.d.ts +12 -0
  39. package/dist/postgres/connection.js +83 -0
  40. package/dist/postgres/connection.js.map +1 -0
  41. package/dist/postgres/edge-record.d.ts +9 -0
  42. package/dist/postgres/edge-record.js +30 -0
  43. package/dist/postgres/edge-record.js.map +1 -0
  44. package/dist/postgres/maps.d.ts +21 -0
  45. package/dist/postgres/maps.js +86 -0
  46. package/dist/postgres/maps.js.map +1 -0
  47. package/dist/postgres/postgres-keystore.d.ts +20 -0
  48. package/dist/postgres/postgres-keystore.js +168 -0
  49. package/dist/postgres/postgres-keystore.js.map +1 -0
  50. package/dist/postgres/postgres-store.d.ts +20 -0
  51. package/dist/postgres/postgres-store.js +717 -0
  52. package/dist/postgres/postgres-store.js.map +1 -0
  53. package/dist/postgres/query-description-builder.d.ts +13 -0
  54. package/dist/postgres/query-description-builder.js +104 -0
  55. package/dist/postgres/query-description-builder.js.map +1 -0
  56. package/dist/postgres/query-description.d.ts +71 -0
  57. package/dist/postgres/query-description.js +256 -0
  58. package/dist/postgres/query-description.js.map +1 -0
  59. package/dist/postgres/specification-result-sql.d.ts +41 -0
  60. package/dist/postgres/specification-result-sql.js +260 -0
  61. package/dist/postgres/specification-result-sql.js.map +1 -0
  62. package/dist/postgres/specification-sql.d.ts +3 -0
  63. package/dist/postgres/specification-sql.js +119 -0
  64. package/dist/postgres/specification-sql.js.map +1 -0
  65. package/dist/postgres/sql.d.ts +10 -0
  66. package/dist/postgres/sql.js +396 -0
  67. package/dist/postgres/sql.js.map +1 -0
  68. package/dist/util/fn.d.ts +6 -0
  69. package/dist/util/fn.js +81 -0
  70. package/dist/util/fn.js.map +1 -0
  71. package/dist/util/promise.d.ts +1 -0
  72. package/dist/util/promise.js +10 -0
  73. package/dist/util/promise.js.map +1 -0
  74. package/docs/registrations.sql +22 -0
  75. package/docs/specification.txt +41 -0
  76. package/docs/sql-generator.gv +25 -0
  77. package/integration-test/docker-compose.yaml +13 -0
  78. package/integration-test/jinaga-test/Dockerfile +12 -0
  79. package/integration-test/jinaga-test/jinaga.test.js +425 -0
  80. package/integration-test/jinaga-test/package-lock.json +6767 -0
  81. package/integration-test/jinaga-test/package.json +25 -0
  82. package/integration-test/postgres/0-init-app-db.sh +16 -0
  83. package/integration-test/postgres/1-setup.sql +219 -0
  84. package/integration-test/postgres/2-grant.sh +17 -0
  85. package/integration-test/postgres/Dockerfile +5 -0
  86. package/integration-test/run.sh +17 -0
  87. package/integration-test/start_db.sh +2 -0
  88. package/integration-test/stop_db.sh +3 -0
  89. package/integration-test/test.sh +8 -0
  90. package/interactive/index.js +56 -0
  91. package/jest.config.js +12 -0
  92. package/package.json +51 -0
  93. package/scripts/combined.sql +46 -0
  94. package/scripts/cte.sql +55 -0
  95. package/scripts/separate.sql +27 -0
  96. package/setup.sh +34 -0
  97. package/setup.sql +329 -0
  98. package/src/authentication/authentication-device.ts +68 -0
  99. package/src/authentication/authentication-impl.ts +59 -0
  100. package/src/authentication/authentication-session.ts +95 -0
  101. package/src/authentication/authentication.ts +6 -0
  102. package/src/authentication.ts +45 -0
  103. package/src/authorization/authorization-keystore.ts +67 -0
  104. package/src/http/node-http.ts +106 -0
  105. package/src/http/router.ts +237 -0
  106. package/src/index.ts +1 -0
  107. package/src/jinaga-server.ts +125 -0
  108. package/src/keystore.ts +10 -0
  109. package/src/memory/memory-keystore.ts +93 -0
  110. package/src/postgres/connection.ts +73 -0
  111. package/src/postgres/edge-record.ts +36 -0
  112. package/src/postgres/maps.ts +89 -0
  113. package/src/postgres/postgres-keystore.ts +167 -0
  114. package/src/postgres/postgres-store.ts +874 -0
  115. package/src/postgres/query-description-builder.ts +116 -0
  116. package/src/postgres/query-description.ts +385 -0
  117. package/src/postgres/specification-result-sql.ts +362 -0
  118. package/src/postgres/specification-sql.ts +138 -0
  119. package/src/postgres/sql.ts +482 -0
  120. package/src/util/fn.ts +63 -0
  121. package/src/util/promise.ts +5 -0
  122. package/test/authorization/authorizationSpec.ts +209 -0
  123. package/test/postgres/postgresSpec.ts +385 -0
  124. package/test/postgres/postgresSpecificationSpec.ts +742 -0
  125. package/test/reporter.js +25 -0
  126. package/tsconfig.json +25 -0
  127. package/upgrade.sh +21 -0
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.HttpRouter = void 0;
13
+ const express_1 = require("express");
14
+ const jinaga_1 = require("jinaga");
15
+ function get(method) {
16
+ return (req, res, next) => {
17
+ const user = req.user;
18
+ if (!user) {
19
+ res.sendStatus(401);
20
+ }
21
+ else {
22
+ method(user)
23
+ .then(response => {
24
+ res.setHeader('Content-Type', 'application/json');
25
+ res.send(JSON.stringify(response));
26
+ next();
27
+ })
28
+ .catch(error => {
29
+ jinaga_1.Trace.error(error);
30
+ res.sendStatus(500);
31
+ next();
32
+ });
33
+ }
34
+ };
35
+ }
36
+ function post(method) {
37
+ return (req, res, next) => {
38
+ const user = req.user;
39
+ const message = req.body;
40
+ if (!message) {
41
+ throw new Error('Ensure that you have called app.use(express.json()).');
42
+ }
43
+ method(user, message)
44
+ .then(response => {
45
+ res.setHeader('Content-Type', 'application/json');
46
+ res.send(JSON.stringify(response));
47
+ next();
48
+ })
49
+ .catch(error => {
50
+ if (error instanceof jinaga_1.Forbidden) {
51
+ jinaga_1.Trace.warn(error.message);
52
+ res.setHeader('Content-Type', 'text/plain');
53
+ res.status(403).send(error.message);
54
+ }
55
+ else {
56
+ jinaga_1.Trace.error(error);
57
+ res.setHeader('Content-Type', 'text/plain');
58
+ res.sendStatus(500).send(error.message);
59
+ }
60
+ next();
61
+ });
62
+ };
63
+ }
64
+ function postString(method) {
65
+ return (req, res, next) => {
66
+ const user = req.user;
67
+ const input = req.body;
68
+ if (!input || typeof (input) !== 'string') {
69
+ res.setHeader('Content-Type', 'text/plain');
70
+ res.status(500).send('Expected Content-Type text/plain. Ensure that you have called app.use(express.text()).');
71
+ }
72
+ else {
73
+ method(user, input)
74
+ .then(response => {
75
+ res.setHeader('Content-Type', 'application/json');
76
+ res.send(JSON.stringify(response, null, 2));
77
+ next();
78
+ })
79
+ .catch(error => {
80
+ if (error instanceof jinaga_1.Forbidden) {
81
+ jinaga_1.Trace.warn(error.message);
82
+ res.setHeader('Content-Type', 'text/plain');
83
+ res.status(403).send(error.message);
84
+ }
85
+ else {
86
+ jinaga_1.Trace.error(error);
87
+ res.setHeader('Content-Type', 'text/plain');
88
+ res.status(400).send(error.message);
89
+ }
90
+ next();
91
+ });
92
+ }
93
+ };
94
+ }
95
+ function serializeUserIdentity(user) {
96
+ if (!user) {
97
+ return null;
98
+ }
99
+ return {
100
+ provider: user.provider,
101
+ id: user.id
102
+ };
103
+ }
104
+ class HttpRouter {
105
+ constructor(authorization) {
106
+ this.authorization = authorization;
107
+ const router = (0, express_1.Router)();
108
+ router.get('/login', get(user => this.login(user)));
109
+ router.post('/query', post((user, queryMessage) => this.query(user, queryMessage)));
110
+ router.post('/load', post((user, loadMessage) => this.load(user, loadMessage)));
111
+ router.post('/save', post((user, saveMessage) => this.save(user, saveMessage)));
112
+ router.post('/read', postString((user, input) => this.read(user, input)));
113
+ router.post('/write', post((user, input) => this.write(user, input)));
114
+ router.post('/feed', post((user, input) => this.feed(user, input)));
115
+ this.handler = router;
116
+ }
117
+ login(user) {
118
+ return __awaiter(this, void 0, void 0, function* () {
119
+ const userFact = yield this.authorization.getOrCreateUserFact({
120
+ provider: user.provider,
121
+ id: user.id
122
+ });
123
+ return {
124
+ userFact: userFact,
125
+ profile: user.profile
126
+ };
127
+ });
128
+ }
129
+ query(user, queryMessage) {
130
+ return __awaiter(this, void 0, void 0, function* () {
131
+ const userIdentity = serializeUserIdentity(user);
132
+ const query = (0, jinaga_1.fromDescriptiveString)(queryMessage.query);
133
+ const result = yield this.authorization.query(userIdentity, queryMessage.start, query);
134
+ return {
135
+ results: result
136
+ };
137
+ });
138
+ }
139
+ load(user, loadMessage) {
140
+ return __awaiter(this, void 0, void 0, function* () {
141
+ const userIdentity = serializeUserIdentity(user);
142
+ const result = yield this.authorization.load(userIdentity, loadMessage.references);
143
+ return {
144
+ facts: result
145
+ };
146
+ });
147
+ }
148
+ save(user, saveMessage) {
149
+ return __awaiter(this, void 0, void 0, function* () {
150
+ const userIdentity = serializeUserIdentity(user);
151
+ yield this.authorization.save(userIdentity, saveMessage.facts);
152
+ return {};
153
+ });
154
+ }
155
+ read(user, input) {
156
+ return __awaiter(this, void 0, void 0, function* () {
157
+ const knownFacts = yield this.getKnownFacts(user);
158
+ const parser = new jinaga_1.SpecificationParser(input);
159
+ parser.skipWhitespace();
160
+ var declaration = parser.parseDeclaration(knownFacts);
161
+ var specification = parser.parseSpecification();
162
+ // Select starting facts that match the inputs
163
+ const start = specification.given.map(input => {
164
+ const declaredFact = declaration.find(d => d.name === input.name);
165
+ if (!declaredFact) {
166
+ throw new Error(`No fact named ${input.name} was declared`);
167
+ }
168
+ return declaredFact.declared.reference;
169
+ });
170
+ const userIdentity = serializeUserIdentity(user);
171
+ const results = yield this.authorization.read(userIdentity, start, specification);
172
+ return results;
173
+ });
174
+ }
175
+ write(user, input) {
176
+ return __awaiter(this, void 0, void 0, function* () {
177
+ const knownFacts = yield this.getKnownFacts(user);
178
+ const parser = new jinaga_1.SpecificationParser(input);
179
+ parser.skipWhitespace();
180
+ var declaration = parser.parseDeclaration(knownFacts);
181
+ const factRecords = [];
182
+ for (const value of declaration) {
183
+ if (!value.declared.fact) {
184
+ throw new Error("References are not allowed while saving.");
185
+ }
186
+ factRecords.push(value.declared.fact);
187
+ }
188
+ const userIdentity = serializeUserIdentity(user);
189
+ yield this.authorization.save(userIdentity, factRecords);
190
+ return {};
191
+ });
192
+ }
193
+ feed(user, input) {
194
+ throw new Error("Method not implemented.");
195
+ }
196
+ getKnownFacts(user) {
197
+ return __awaiter(this, void 0, void 0, function* () {
198
+ if (user) {
199
+ const userFact = yield this.authorization.getOrCreateUserFact({
200
+ provider: user.provider,
201
+ id: user.id
202
+ });
203
+ return [
204
+ {
205
+ name: "me",
206
+ declared: {
207
+ fact: userFact,
208
+ reference: {
209
+ type: userFact.type,
210
+ hash: userFact.hash
211
+ }
212
+ }
213
+ }
214
+ ];
215
+ }
216
+ else {
217
+ return [];
218
+ }
219
+ });
220
+ }
221
+ }
222
+ exports.HttpRouter = HttpRouter;
223
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/http/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { JinagaServer, JinagaServerConfig, JinagaServerInstance } from "./jinaga-server";
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JinagaServer = void 0;
4
+ var jinaga_server_1 = require("./jinaga-server");
5
+ Object.defineProperty(exports, "JinagaServer", { enumerable: true, get: function () { return jinaga_server_1.JinagaServer; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAyF;AAAhF,6GAAA,YAAY,OAAA"}
@@ -0,0 +1,18 @@
1
+ import { Handler, Request } from "express";
2
+ import { AuthorizationRules, Jinaga } from "jinaga";
3
+ export declare type JinagaServerConfig = {
4
+ pgStore?: string;
5
+ pgKeystore?: string;
6
+ httpEndpoint?: string;
7
+ authorization?: (a: AuthorizationRules) => AuthorizationRules;
8
+ httpTimeoutSeconds?: number;
9
+ };
10
+ export declare type JinagaServerInstance = {
11
+ handler: Handler;
12
+ j: Jinaga;
13
+ withSession: (req: Request, callback: ((j: Jinaga) => Promise<void>)) => Promise<void>;
14
+ close: () => Promise<void>;
15
+ };
16
+ export declare class JinagaServer {
17
+ static create(config: JinagaServerConfig): JinagaServerInstance;
18
+ }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.JinagaServer = void 0;
13
+ const jinaga_1 = require("jinaga");
14
+ const authentication_device_1 = require("./authentication/authentication-device");
15
+ const authentication_session_1 = require("./authentication/authentication-session");
16
+ const authorization_keystore_1 = require("./authorization/authorization-keystore");
17
+ const node_http_1 = require("./http/node-http");
18
+ const router_1 = require("./http/router");
19
+ const postgres_keystore_1 = require("./postgres/postgres-keystore");
20
+ const postgres_store_1 = require("./postgres/postgres-store");
21
+ const localDeviceIdentity = {
22
+ provider: 'jinaga',
23
+ id: 'local'
24
+ };
25
+ class JinagaServer {
26
+ static create(config) {
27
+ const syncStatusNotifier = new jinaga_1.SyncStatusNotifier();
28
+ const store = createStore(config);
29
+ const feed = new jinaga_1.FeedImpl(store);
30
+ const fork = createFork(config, feed, syncStatusNotifier);
31
+ const keystore = new postgres_keystore_1.PostgresKeystore(config.pgKeystore);
32
+ const authorizationRules = config.authorization ? config.authorization(new jinaga_1.AuthorizationRules()) : null;
33
+ const authorization = createAuthorization(authorizationRules, fork, keystore);
34
+ const router = new router_1.HttpRouter(authorization);
35
+ const authentication = new authentication_device_1.AuthenticationDevice(fork, keystore, localDeviceIdentity);
36
+ const memory = new jinaga_1.MemoryStore();
37
+ const j = new jinaga_1.Jinaga(authentication, memory, syncStatusNotifier);
38
+ function close() {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ yield keystore.close();
41
+ yield store.close();
42
+ });
43
+ }
44
+ return {
45
+ handler: router.handler,
46
+ j,
47
+ withSession: (req, callback) => {
48
+ return withSession(feed, keystore, authorizationRules, req, callback);
49
+ },
50
+ close
51
+ };
52
+ }
53
+ }
54
+ exports.JinagaServer = JinagaServer;
55
+ function createStore(config) {
56
+ if (config.pgStore) {
57
+ const store = new postgres_store_1.PostgresStore(config.pgStore);
58
+ const cache = new jinaga_1.Cache(store);
59
+ return cache;
60
+ }
61
+ else {
62
+ return new jinaga_1.MemoryStore();
63
+ }
64
+ }
65
+ function createFork(config, feed, syncStatusNotifier) {
66
+ if (config.httpEndpoint) {
67
+ const httpConnection = new node_http_1.NodeHttpConnection(config.httpEndpoint);
68
+ const httpTimeoutSeconds = config.httpTimeoutSeconds || 5;
69
+ const webClient = new jinaga_1.WebClient(httpConnection, syncStatusNotifier, {
70
+ timeoutSeconds: httpTimeoutSeconds
71
+ });
72
+ const fork = new jinaga_1.TransientFork(feed, webClient);
73
+ return fork;
74
+ }
75
+ else {
76
+ return new jinaga_1.PassThroughFork(feed);
77
+ }
78
+ }
79
+ function createAuthorization(authorizationRules, feed, keystore) {
80
+ if (keystore) {
81
+ const authorization = new authorization_keystore_1.AuthorizationKeystore(feed, keystore, authorizationRules);
82
+ return authorization;
83
+ }
84
+ else {
85
+ return new jinaga_1.AuthorizationNoOp(feed);
86
+ }
87
+ }
88
+ function withSession(feed, keystore, authorizationRules, req, callback) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ const user = req.user;
91
+ const userIdentity = {
92
+ provider: user.provider,
93
+ id: user.id
94
+ };
95
+ const authentication = new authentication_session_1.AuthenticationSession(feed, keystore, authorizationRules, userIdentity, user.profile.displayName, localDeviceIdentity);
96
+ const syncStatusNotifier = new jinaga_1.SyncStatusNotifier();
97
+ const j = new jinaga_1.Jinaga(authentication, new jinaga_1.MemoryStore(), syncStatusNotifier);
98
+ yield callback(j);
99
+ });
100
+ }
101
+ //# sourceMappingURL=jinaga-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jinaga-server.js","sourceRoot":"","sources":["../src/jinaga-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { FactEnvelope, FactRecord, UserIdentity } from "jinaga";
2
+ export interface Keystore {
3
+ close(): Promise<void>;
4
+ getOrCreateUserFact(userIdentity: UserIdentity): Promise<FactRecord>;
5
+ getOrCreateDeviceFact(userIdentity: UserIdentity): Promise<FactRecord>;
6
+ getUserFact(userIdentity: UserIdentity): Promise<FactRecord>;
7
+ getDeviceFact(userIdentity: UserIdentity): Promise<FactRecord>;
8
+ signFacts(userIdentity: UserIdentity, facts: FactRecord[]): Promise<FactEnvelope[]>;
9
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=keystore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keystore.js","sourceRoot":"","sources":["../src/keystore.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { FactEnvelope, FactRecord, UserIdentity } from "jinaga";
2
+ import { Keystore } from "../keystore";
3
+ export declare class MemoryKeystore implements Keystore {
4
+ private keyPairs;
5
+ close(): Promise<void>;
6
+ getOrCreateUserFact(userIdentity: UserIdentity): Promise<FactRecord>;
7
+ getOrCreateDeviceFact(userIdentity: UserIdentity): Promise<FactRecord>;
8
+ getUserFact(userIdentity: UserIdentity): Promise<FactRecord>;
9
+ getDeviceFact(userIdentity: UserIdentity): Promise<FactRecord>;
10
+ signFacts(userIdentity: UserIdentity, facts: FactRecord[]): Promise<FactEnvelope[]>;
11
+ private getOrCreateIdentityFact;
12
+ private getIdentityFact;
13
+ private getOrCreatePublicKey;
14
+ private getPublicKey;
15
+ private generateKeyPair;
16
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryKeystore = void 0;
4
+ const jinaga_1 = require("jinaga");
5
+ const node_forge_1 = require("node-forge");
6
+ class MemoryKeystore {
7
+ constructor() {
8
+ this.keyPairs = {};
9
+ }
10
+ close() {
11
+ return Promise.resolve();
12
+ }
13
+ getOrCreateUserFact(userIdentity) {
14
+ return Promise.resolve(this.getOrCreateIdentityFact('Jinaga.User', userIdentity));
15
+ }
16
+ getOrCreateDeviceFact(userIdentity) {
17
+ return Promise.resolve(this.getOrCreateIdentityFact('Jinaga.Device', userIdentity));
18
+ }
19
+ getUserFact(userIdentity) {
20
+ return Promise.resolve(this.getIdentityFact('Jinaga.User', userIdentity));
21
+ }
22
+ getDeviceFact(userIdentity) {
23
+ return Promise.resolve(this.getIdentityFact('Jinaga.Device', userIdentity));
24
+ }
25
+ signFacts(userIdentity, facts) {
26
+ return Promise.resolve(facts.map(fact => {
27
+ return {
28
+ fact,
29
+ signatures: []
30
+ };
31
+ }));
32
+ }
33
+ getOrCreateIdentityFact(type, identity) {
34
+ if (!identity) {
35
+ return null;
36
+ }
37
+ const publicKey = this.getOrCreatePublicKey(identity);
38
+ const predecessors = {};
39
+ const fields = {
40
+ publicKey: publicKey
41
+ };
42
+ const hash = (0, jinaga_1.computeHash)(fields, predecessors);
43
+ return { type, hash, predecessors, fields };
44
+ }
45
+ getIdentityFact(type, identity) {
46
+ if (!identity) {
47
+ return null;
48
+ }
49
+ const publicKey = this.getPublicKey(identity);
50
+ const predecessors = {};
51
+ const fields = {
52
+ publicKey: publicKey
53
+ };
54
+ const hash = (0, jinaga_1.computeHash)(fields, predecessors);
55
+ return { type, hash, predecessors, fields };
56
+ }
57
+ getOrCreatePublicKey(userIdentity) {
58
+ const key = `${userIdentity.provider}:${userIdentity.id}`;
59
+ const keyPair = this.keyPairs[key];
60
+ if (keyPair) {
61
+ return keyPair.publicKey;
62
+ }
63
+ else {
64
+ return this.generateKeyPair(key);
65
+ }
66
+ }
67
+ getPublicKey(userIdentity) {
68
+ const key = `${userIdentity.provider}:${userIdentity.id}`;
69
+ const keyPair = this.keyPairs[key];
70
+ if (keyPair) {
71
+ return keyPair.publicKey;
72
+ }
73
+ else {
74
+ throw new Error("Public key not found");
75
+ }
76
+ }
77
+ generateKeyPair(key) {
78
+ const keypair = node_forge_1.pki.rsa.generateKeyPair({ bits: 1024 });
79
+ const privateKey = node_forge_1.pki.privateKeyToPem(keypair.privateKey);
80
+ const publicKey = node_forge_1.pki.publicKeyToPem(keypair.publicKey);
81
+ this.keyPairs[key] = { publicKey, privateKey };
82
+ return publicKey;
83
+ }
84
+ }
85
+ exports.MemoryKeystore = MemoryKeystore;
86
+ //# sourceMappingURL=memory-keystore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-keystore.js","sourceRoot":"","sources":["../../src/memory/memory-keystore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { PoolClient } from 'pg';
2
+ export declare type Row = {
3
+ [key: string]: any;
4
+ };
5
+ export declare class ConnectionFactory {
6
+ private postgresPool;
7
+ constructor(postgresUri: string);
8
+ close(): Promise<void>;
9
+ withTransaction<T>(callback: (connection: PoolClient) => Promise<T>): Promise<T>;
10
+ with<T>(callback: (connection: PoolClient) => Promise<T>): Promise<T>;
11
+ private createClient;
12
+ }
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ConnectionFactory = void 0;
13
+ const pg_1 = require("pg");
14
+ const promise_1 = require("../util/promise");
15
+ class ConnectionFactory {
16
+ constructor(postgresUri) {
17
+ this.postgresPool = new pg_1.Pool({
18
+ connectionString: postgresUri
19
+ });
20
+ }
21
+ close() {
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ yield this.postgresPool.end();
24
+ });
25
+ }
26
+ withTransaction(callback) {
27
+ return this.with((connection) => __awaiter(this, void 0, void 0, function* () {
28
+ try {
29
+ yield connection.query('BEGIN');
30
+ const result = yield callback(connection);
31
+ yield connection.query('COMMIT');
32
+ return result;
33
+ }
34
+ catch (e) {
35
+ yield connection.query('ROLLBACK');
36
+ throw e;
37
+ }
38
+ }));
39
+ }
40
+ with(callback) {
41
+ return __awaiter(this, void 0, void 0, function* () {
42
+ let attempt = 0;
43
+ const pause = [0, 0, 1000, 5000, 15000, 30000];
44
+ while (attempt < pause.length) {
45
+ try {
46
+ const client = yield this.createClient();
47
+ try {
48
+ return yield callback(client);
49
+ }
50
+ finally {
51
+ client.release();
52
+ }
53
+ }
54
+ catch (e) {
55
+ if (!isTransientError(e)) {
56
+ throw e;
57
+ }
58
+ attempt++;
59
+ if (attempt === pause.length) {
60
+ throw e;
61
+ }
62
+ }
63
+ if (pause[attempt] > 0) {
64
+ yield (0, promise_1.delay)(pause[attempt]);
65
+ }
66
+ }
67
+ });
68
+ }
69
+ createClient() {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ return yield this.postgresPool.connect();
72
+ });
73
+ }
74
+ }
75
+ exports.ConnectionFactory = ConnectionFactory;
76
+ function isTransientError(e) {
77
+ if (e.code === 'ECONNREFUSED') {
78
+ return true;
79
+ }
80
+ console.error("Postgres error:", e);
81
+ return false;
82
+ }
83
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/postgres/connection.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2BAAsC;AACtC,6CAAwC;AAIxC,MAAa,iBAAiB;IAG1B,YAAa,WAAmB;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,SAAI,CAAC;YACzB,gBAAgB,EAAE,WAAW;SAChC,CAAC,CAAC;IACP,CAAC;IAEK,KAAK;;YACP,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QAClC,CAAC;KAAA;IAED,eAAe,CAAI,QAAgD;QAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,CAAM,UAAU,EAAC,EAAE;YAChC,IAAI;gBACA,MAAM,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC1C,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACjC,OAAO,MAAM,CAAC;aACjB;YACD,OAAO,CAAC,EAAE;gBACN,MAAM,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACnC,MAAM,CAAC,CAAC;aACX;QACL,CAAC,CAAA,CAAC,CAAA;IACN,CAAC;IAEK,IAAI,CAAI,QAAgD;;YAC1D,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE;gBAC3B,IAAI;oBACA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;oBACzC,IAAI;wBACA,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;qBACjC;4BACO;wBACJ,MAAM,CAAC,OAAO,EAAE,CAAC;qBACpB;iBACJ;gBACD,OAAO,CAAC,EAAE;oBACN,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;wBACtB,MAAM,CAAC,CAAC;qBACX;oBACD,OAAO,EAAE,CAAC;oBACV,IAAI,OAAO,KAAK,KAAK,CAAC,MAAM,EAAE;wBAC1B,MAAM,CAAC,CAAC;qBACX;iBACJ;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oBACpB,MAAM,IAAA,eAAK,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;iBAC/B;aACJ;QACL,CAAC;KAAA;IAEa,YAAY;;YACtB,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC7C,CAAC;KAAA;CACJ;AA3DD,8CA2DC;AAED,SAAS,gBAAgB,CAAC,CAAM;IAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,EAAE;QAC3B,OAAO,IAAI,CAAC;KACf;IACD,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC;AACjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { FactRecord } from "jinaga";
2
+ export declare type EdgeRecord = {
3
+ predecessor_hash: string;
4
+ predecessor_type: string;
5
+ successor_hash: string;
6
+ successor_type: string;
7
+ role: string;
8
+ };
9
+ export declare function makeEdgeRecords(fact: FactRecord): EdgeRecord[];
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeEdgeRecords = void 0;
4
+ function makeEdgeRecord(predecessor, successor, role) {
5
+ if (!predecessor.hash || !predecessor.type || !successor.hash || !successor.type) {
6
+ throw new Error('Attempting to save edge with null hash or type.');
7
+ }
8
+ return {
9
+ predecessor_hash: predecessor.hash,
10
+ predecessor_type: predecessor.type,
11
+ successor_hash: successor.hash,
12
+ successor_type: successor.type,
13
+ role
14
+ };
15
+ }
16
+ function makeEdgeRecords(fact) {
17
+ let records = [];
18
+ for (const role in fact.predecessors) {
19
+ const predecessor = fact.predecessors[role];
20
+ if (Array.isArray(predecessor)) {
21
+ records = records.concat(predecessor.map(p => makeEdgeRecord(p, fact, role)));
22
+ }
23
+ else {
24
+ records.push(makeEdgeRecord(predecessor, fact, role));
25
+ }
26
+ }
27
+ return records;
28
+ }
29
+ exports.makeEdgeRecords = makeEdgeRecords;
30
+ //# sourceMappingURL=edge-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-record.js","sourceRoot":"","sources":["../../src/postgres/edge-record.ts"],"names":[],"mappings":";;;AAUA,SAAS,cAAc,CAAC,WAA0B,EAAE,SAAqB,EAAE,IAAY;IACnF,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QAC9E,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;KACtE;IACD,OAAO;QACH,gBAAgB,EAAE,WAAW,CAAC,IAAI;QAClC,gBAAgB,EAAE,WAAW,CAAC,IAAI;QAClC,cAAc,EAAE,SAAS,CAAC,IAAI;QAC9B,cAAc,EAAE,SAAS,CAAC,IAAI;QAC9B,IAAI;KACP,CAAC;AACN,CAAC;AAED,SAAgB,eAAe,CAAC,IAAgB;IAC5C,IAAI,OAAO,GAAiB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;YAC5B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;SACjF;aACI;YACD,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;SACzD;KACJ;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AAZD,0CAYC"}