@flowerforce/flowerbase-client 0.1.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.
- package/CHANGELOG.md +0 -0
- package/LICENSE +3 -0
- package/README.md +209 -0
- package/dist/app.d.ts +85 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +461 -0
- package/dist/bson.d.ts +8 -0
- package/dist/bson.d.ts.map +1 -0
- package/dist/bson.js +10 -0
- package/dist/credentials.d.ts +8 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +30 -0
- package/dist/functions.d.ts +6 -0
- package/dist/functions.d.ts.map +1 -0
- package/dist/functions.js +47 -0
- package/dist/http.d.ts +35 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +170 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/mongo.d.ts +4 -0
- package/dist/mongo.d.ts.map +1 -0
- package/dist/mongo.js +106 -0
- package/dist/session.d.ts +18 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +105 -0
- package/dist/session.native.d.ts +14 -0
- package/dist/session.native.d.ts.map +1 -0
- package/dist/session.native.js +76 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/user.d.ts +37 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +125 -0
- package/dist/watch.d.ts +3 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +139 -0
- package/jest.config.ts +13 -0
- package/package.json +41 -0
- package/project.json +11 -0
- package/rollup.config.js +17 -0
- package/src/__tests__/auth.test.ts +213 -0
- package/src/__tests__/compat.test.ts +22 -0
- package/src/__tests__/functions.test.ts +312 -0
- package/src/__tests__/mongo.test.ts +83 -0
- package/src/__tests__/session.test.ts +597 -0
- package/src/__tests__/watch.test.ts +336 -0
- package/src/app.ts +562 -0
- package/src/bson.ts +6 -0
- package/src/credentials.ts +31 -0
- package/src/functions.ts +56 -0
- package/src/http.ts +221 -0
- package/src/index.ts +15 -0
- package/src/mongo.ts +112 -0
- package/src/session.native.ts +89 -0
- package/src/session.ts +114 -0
- package/src/types.ts +114 -0
- package/src/user.ts +150 -0
- package/src/watch.ts +156 -0
- package/tsconfig.json +34 -0
- package/tsconfig.spec.json +13 -0
package/dist/http.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requestStream = exports.requestJson = exports.FlowerbaseHttpError = exports.MongoDBRealmError = void 0;
|
|
4
|
+
const parsePayloadError = (payload) => {
|
|
5
|
+
if (!payload || typeof payload !== 'object')
|
|
6
|
+
return {};
|
|
7
|
+
const message = 'message' in payload && typeof payload.message === 'string' ? payload.message : undefined;
|
|
8
|
+
const error = 'error' in payload && typeof payload.error === 'string' ? payload.error : undefined;
|
|
9
|
+
const errorCode = 'error_code' in payload && typeof payload.error_code === 'string'
|
|
10
|
+
? payload.error_code
|
|
11
|
+
: 'errorCode' in payload && typeof payload.errorCode === 'string'
|
|
12
|
+
? payload.errorCode
|
|
13
|
+
: undefined;
|
|
14
|
+
const link = 'link' in payload && typeof payload.link === 'string' ? payload.link : undefined;
|
|
15
|
+
if (error) {
|
|
16
|
+
try {
|
|
17
|
+
const parsed = JSON.parse(error);
|
|
18
|
+
if (parsed && typeof parsed === 'object') {
|
|
19
|
+
const nestedMessage = 'message' in parsed && typeof parsed.message === 'string' ? parsed.message : undefined;
|
|
20
|
+
const nestedErrorCode = 'error_code' in parsed && typeof parsed.error_code === 'string'
|
|
21
|
+
? parsed.error_code
|
|
22
|
+
: 'errorCode' in parsed && typeof parsed.errorCode === 'string'
|
|
23
|
+
? parsed.errorCode
|
|
24
|
+
: undefined;
|
|
25
|
+
return {
|
|
26
|
+
message: nestedMessage ?? message ?? error,
|
|
27
|
+
error,
|
|
28
|
+
errorCode: nestedErrorCode ?? errorCode,
|
|
29
|
+
link
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Keep original error text if it isn't JSON.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
message: message ?? error,
|
|
39
|
+
error,
|
|
40
|
+
errorCode,
|
|
41
|
+
link
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
class MongoDBRealmError extends Error {
|
|
45
|
+
constructor(params) {
|
|
46
|
+
super(params.error || `${params.statusCode} ${params.statusText}`.trim());
|
|
47
|
+
this.name = 'MongoDBRealmError';
|
|
48
|
+
this.method = params.method;
|
|
49
|
+
this.url = params.url;
|
|
50
|
+
this.statusCode = params.statusCode;
|
|
51
|
+
this.statusText = params.statusText;
|
|
52
|
+
this.error = params.error;
|
|
53
|
+
this.errorCode = params.errorCode;
|
|
54
|
+
this.link = params.link;
|
|
55
|
+
this.payload = params.payload;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.MongoDBRealmError = MongoDBRealmError;
|
|
59
|
+
class FlowerbaseHttpError extends MongoDBRealmError {
|
|
60
|
+
constructor(params) {
|
|
61
|
+
super(params);
|
|
62
|
+
this.name = 'FlowerbaseHttpError';
|
|
63
|
+
this.status = params.statusCode;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.FlowerbaseHttpError = FlowerbaseHttpError;
|
|
67
|
+
const parseBody = async (response) => {
|
|
68
|
+
const text = await response.text();
|
|
69
|
+
if (!text)
|
|
70
|
+
return null;
|
|
71
|
+
try {
|
|
72
|
+
return JSON.parse(text);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return text;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const timeoutSignal = (timeout = 10000) => {
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
const timer = setTimeout(() => controller.abort(), timeout);
|
|
81
|
+
return {
|
|
82
|
+
signal: controller.signal,
|
|
83
|
+
clear: () => clearTimeout(timer)
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
const requestJson = async ({ url, method = 'GET', body, bearerToken, timeout }) => {
|
|
87
|
+
const { signal, clear } = timeoutSignal(timeout);
|
|
88
|
+
try {
|
|
89
|
+
const response = await fetch(url, {
|
|
90
|
+
method,
|
|
91
|
+
headers: {
|
|
92
|
+
...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),
|
|
93
|
+
...(bearerToken ? { Authorization: `Bearer ${bearerToken}` } : {})
|
|
94
|
+
},
|
|
95
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
96
|
+
signal
|
|
97
|
+
});
|
|
98
|
+
const payload = await parseBody(response);
|
|
99
|
+
if (!response.ok) {
|
|
100
|
+
const parsedError = parsePayloadError(payload);
|
|
101
|
+
throw new FlowerbaseHttpError({
|
|
102
|
+
method,
|
|
103
|
+
url,
|
|
104
|
+
statusCode: response.status,
|
|
105
|
+
statusText: response.statusText,
|
|
106
|
+
error: parsedError.message ?? `HTTP ${response.status}`,
|
|
107
|
+
errorCode: parsedError.errorCode,
|
|
108
|
+
link: parsedError.link,
|
|
109
|
+
payload
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return payload;
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
clear();
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
exports.requestJson = requestJson;
|
|
119
|
+
const requestStream = async ({ url, method = 'GET', body, bearerToken, timeout }) => {
|
|
120
|
+
const { signal, clear } = timeoutSignal(timeout);
|
|
121
|
+
try {
|
|
122
|
+
const response = await fetch(url, {
|
|
123
|
+
method,
|
|
124
|
+
headers: {
|
|
125
|
+
...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),
|
|
126
|
+
...(bearerToken ? { Authorization: `Bearer ${bearerToken}` } : {})
|
|
127
|
+
},
|
|
128
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
129
|
+
signal
|
|
130
|
+
});
|
|
131
|
+
if (!response.ok) {
|
|
132
|
+
const payload = await parseBody(response);
|
|
133
|
+
const parsedError = parsePayloadError(payload);
|
|
134
|
+
throw new FlowerbaseHttpError({
|
|
135
|
+
method,
|
|
136
|
+
url,
|
|
137
|
+
statusCode: response.status,
|
|
138
|
+
statusText: response.statusText,
|
|
139
|
+
error: parsedError.message ?? `HTTP ${response.status}`,
|
|
140
|
+
errorCode: parsedError.errorCode,
|
|
141
|
+
link: parsedError.link,
|
|
142
|
+
payload
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
if (!response.body) {
|
|
146
|
+
throw new Error('Response stream body is missing');
|
|
147
|
+
}
|
|
148
|
+
const reader = response.body.getReader();
|
|
149
|
+
return {
|
|
150
|
+
async *[Symbol.asyncIterator]() {
|
|
151
|
+
try {
|
|
152
|
+
while (true) {
|
|
153
|
+
const { done, value } = await reader.read();
|
|
154
|
+
if (done)
|
|
155
|
+
break;
|
|
156
|
+
if (value)
|
|
157
|
+
yield value;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
reader.releaseLock();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
clear();
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
exports.requestStream = requestStream;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BSON, EJSON, ObjectId, ObjectID } from './bson';
|
|
2
|
+
export { App } from './app';
|
|
3
|
+
export { User } from './user';
|
|
4
|
+
export { Credentials } from './credentials';
|
|
5
|
+
export { MongoDBRealmError } from './http';
|
|
6
|
+
export { BSON, EJSON, ObjectId, ObjectID };
|
|
7
|
+
export type { AppConfig, CredentialsLike, UserLike, MongoClientLike, CollectionLike, WatchAsyncIterator } from './types';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAExD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;AAC1C,YAAY,EACV,SAAS,EACT,eAAe,EACf,QAAQ,EACR,eAAe,EACf,cAAc,EACd,kBAAkB,EACnB,MAAM,SAAS,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ObjectID = exports.ObjectId = exports.EJSON = exports.BSON = exports.MongoDBRealmError = exports.Credentials = exports.User = exports.App = void 0;
|
|
4
|
+
const bson_1 = require("./bson");
|
|
5
|
+
Object.defineProperty(exports, "BSON", { enumerable: true, get: function () { return bson_1.BSON; } });
|
|
6
|
+
Object.defineProperty(exports, "EJSON", { enumerable: true, get: function () { return bson_1.EJSON; } });
|
|
7
|
+
Object.defineProperty(exports, "ObjectId", { enumerable: true, get: function () { return bson_1.ObjectId; } });
|
|
8
|
+
Object.defineProperty(exports, "ObjectID", { enumerable: true, get: function () { return bson_1.ObjectID; } });
|
|
9
|
+
var app_1 = require("./app");
|
|
10
|
+
Object.defineProperty(exports, "App", { enumerable: true, get: function () { return app_1.App; } });
|
|
11
|
+
var user_1 = require("./user");
|
|
12
|
+
Object.defineProperty(exports, "User", { enumerable: true, get: function () { return user_1.User; } });
|
|
13
|
+
var credentials_1 = require("./credentials");
|
|
14
|
+
Object.defineProperty(exports, "Credentials", { enumerable: true, get: function () { return credentials_1.Credentials; } });
|
|
15
|
+
var http_1 = require("./http");
|
|
16
|
+
Object.defineProperty(exports, "MongoDBRealmError", { enumerable: true, get: function () { return http_1.MongoDBRealmError; } });
|
package/dist/mongo.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongo.d.ts","sourceRoot":"","sources":["../src/mongo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAkB,eAAe,EAAE,MAAM,SAAS,CAAA;AAoBzD,eAAO,MAAM,iBAAiB,QAAS,GAAG,eAAe,MAAM,UAAU,MAAM,KAAG,eAyFhF,CAAA"}
|
package/dist/mongo.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMongoClient = void 0;
|
|
4
|
+
const bson_1 = require("./bson");
|
|
5
|
+
const watch_1 = require("./watch");
|
|
6
|
+
const serialize = (value) => bson_1.EJSON.serialize(value, { relaxed: false });
|
|
7
|
+
const deserialize = (value) => {
|
|
8
|
+
if (!value || typeof value !== 'object')
|
|
9
|
+
return value;
|
|
10
|
+
return bson_1.EJSON.deserialize(value);
|
|
11
|
+
};
|
|
12
|
+
const mapResult = (value) => {
|
|
13
|
+
if (typeof value === 'string') {
|
|
14
|
+
try {
|
|
15
|
+
return deserialize(JSON.parse(value));
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return deserialize(value);
|
|
22
|
+
};
|
|
23
|
+
const createMongoClient = (app, serviceName, userId) => ({
|
|
24
|
+
db: (database) => ({
|
|
25
|
+
collection: (collection) => {
|
|
26
|
+
const callService = async (name, args) => {
|
|
27
|
+
const result = await app.callService(name, [
|
|
28
|
+
{
|
|
29
|
+
database,
|
|
30
|
+
collection,
|
|
31
|
+
...serialize(args[0] ?? {}),
|
|
32
|
+
...(args[1] !== undefined ? { options: serialize(args[1]) } : {})
|
|
33
|
+
}
|
|
34
|
+
], serviceName, userId);
|
|
35
|
+
return mapResult(result);
|
|
36
|
+
};
|
|
37
|
+
const normalizeWatchInput = (input) => {
|
|
38
|
+
if (typeof input === 'undefined') {
|
|
39
|
+
return { filter: undefined, ids: undefined };
|
|
40
|
+
}
|
|
41
|
+
if (Array.isArray(input)) {
|
|
42
|
+
throw new Error('watch accepts only an options object with "filter" or "ids"');
|
|
43
|
+
}
|
|
44
|
+
if (!input || typeof input !== 'object') {
|
|
45
|
+
throw new Error('watch options must be an object');
|
|
46
|
+
}
|
|
47
|
+
const typed = input;
|
|
48
|
+
const keys = Object.keys(typed);
|
|
49
|
+
const hasOnlyAllowedKeys = keys.every((key) => key === 'ids' || key === 'filter');
|
|
50
|
+
if (!hasOnlyAllowedKeys) {
|
|
51
|
+
throw new Error('watch options support only "filter" or "ids"');
|
|
52
|
+
}
|
|
53
|
+
if (typed.ids || typed.filter) {
|
|
54
|
+
if (typed.ids && typed.filter) {
|
|
55
|
+
throw new Error('watch options cannot include both "ids" and "filter"');
|
|
56
|
+
}
|
|
57
|
+
const { ids, filter } = typed;
|
|
58
|
+
if (filter && typeof filter === 'object' && '$match' in filter) {
|
|
59
|
+
throw new Error('watch filter must be a query object, not a $match stage');
|
|
60
|
+
}
|
|
61
|
+
if (ids) {
|
|
62
|
+
if (!Array.isArray(ids)) {
|
|
63
|
+
throw new Error('watch ids must be an array');
|
|
64
|
+
}
|
|
65
|
+
return { filter: undefined, ids };
|
|
66
|
+
}
|
|
67
|
+
if (filter) {
|
|
68
|
+
return { filter, ids: undefined };
|
|
69
|
+
}
|
|
70
|
+
return { filter: undefined, ids: undefined };
|
|
71
|
+
}
|
|
72
|
+
throw new Error('watch options must include "filter" or "ids"');
|
|
73
|
+
};
|
|
74
|
+
return {
|
|
75
|
+
find: (query = {}, options = {}) => callService('find', [{ query, options }]),
|
|
76
|
+
findOne: (query = {}, options = {}) => callService('findOne', [{ query, options }]),
|
|
77
|
+
findOneAndUpdate: (filter, update, options = {}) => callService('findOneAndUpdate', [{ filter, update, options }]),
|
|
78
|
+
findOneAndReplace: (filter, replacement, options = {}) => callService('findOneAndReplace', [{ filter, replacement, options }]),
|
|
79
|
+
findOneAndDelete: (filter, options = {}) => callService('findOneAndDelete', [{ filter, options }]),
|
|
80
|
+
aggregate: (pipeline) => callService('aggregate', [{ pipeline }]),
|
|
81
|
+
count: (query = {}, options = {}) => callService('count', [{ query, options }]),
|
|
82
|
+
insertOne: (document, options = {}) => callService('insertOne', [{ document, options }]),
|
|
83
|
+
insertMany: (documents, options = {}) => callService('insertMany', [{ documents, options }]),
|
|
84
|
+
updateOne: (filter, update, options = {}) => callService('updateOne', [{ filter, update, options }]),
|
|
85
|
+
updateMany: (filter, update, options = {}) => callService('updateMany', [{ filter, update, options }]),
|
|
86
|
+
deleteOne: (filter, options = {}) => callService('deleteOne', [{ query: filter, options }]),
|
|
87
|
+
deleteMany: (filter, options = {}) => callService('deleteMany', [{ query: filter, options }]),
|
|
88
|
+
watch: (options) => {
|
|
89
|
+
const { filter, ids } = normalizeWatchInput(options);
|
|
90
|
+
const session = app.getSessionOrThrow(userId);
|
|
91
|
+
return (0, watch_1.createWatchIterator)({
|
|
92
|
+
appId: app.id,
|
|
93
|
+
baseUrl: app.baseUrl,
|
|
94
|
+
accessToken: session.accessToken,
|
|
95
|
+
database,
|
|
96
|
+
collection,
|
|
97
|
+
filter,
|
|
98
|
+
ids,
|
|
99
|
+
timeout: app.timeout
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
});
|
|
106
|
+
exports.createMongoClient = createMongoClient;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SessionData } from './types';
|
|
2
|
+
export declare class SessionManager {
|
|
3
|
+
private readonly key;
|
|
4
|
+
private readonly usersKey;
|
|
5
|
+
private readonly sessionsKey;
|
|
6
|
+
private readonly storage;
|
|
7
|
+
private session;
|
|
8
|
+
constructor(appId: string);
|
|
9
|
+
load(): SessionData | null;
|
|
10
|
+
get(): SessionData | null;
|
|
11
|
+
set(session: SessionData): void;
|
|
12
|
+
clear(): void;
|
|
13
|
+
getUsersOrder(): string[];
|
|
14
|
+
setUsersOrder(order: string[]): void;
|
|
15
|
+
getSessionsByUser(): Record<string, SessionData>;
|
|
16
|
+
setSessionsByUser(sessionsByUser: Record<string, SessionData>): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAwBrC,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,OAAO,CAA2B;gBAE9B,KAAK,EAAE,MAAM;IAOzB,IAAI,IAAI,WAAW,GAAG,IAAI;IAW1B,GAAG;IAIH,GAAG,CAAC,OAAO,EAAE,WAAW;IAKxB,KAAK;IAKL,aAAa;IAYb,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE;IAQ7B,iBAAiB;IAuBjB,iBAAiB,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;CAO9D"}
|
package/dist/session.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionManager = void 0;
|
|
4
|
+
const memoryStore = new Map();
|
|
5
|
+
const getStorage = () => {
|
|
6
|
+
if (typeof localStorage !== 'undefined') {
|
|
7
|
+
return {
|
|
8
|
+
getItem: (key) => localStorage.getItem(key),
|
|
9
|
+
setItem: (key, value) => localStorage.setItem(key, value),
|
|
10
|
+
removeItem: (key) => localStorage.removeItem(key)
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
getItem: (key) => memoryStore.get(key) ?? null,
|
|
15
|
+
setItem: (key, value) => {
|
|
16
|
+
memoryStore.set(key, value);
|
|
17
|
+
},
|
|
18
|
+
removeItem: (key) => {
|
|
19
|
+
memoryStore.delete(key);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
class SessionManager {
|
|
24
|
+
constructor(appId) {
|
|
25
|
+
this.storage = getStorage();
|
|
26
|
+
this.session = null;
|
|
27
|
+
this.key = `flowerbase:${appId}:session`;
|
|
28
|
+
this.usersKey = `flowerbase:${appId}:users`;
|
|
29
|
+
this.sessionsKey = `flowerbase:${appId}:sessions`;
|
|
30
|
+
this.session = this.load();
|
|
31
|
+
}
|
|
32
|
+
load() {
|
|
33
|
+
const raw = this.storage.getItem(this.key);
|
|
34
|
+
if (!raw)
|
|
35
|
+
return null;
|
|
36
|
+
try {
|
|
37
|
+
return JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
get() {
|
|
44
|
+
return this.session;
|
|
45
|
+
}
|
|
46
|
+
set(session) {
|
|
47
|
+
this.session = session;
|
|
48
|
+
this.storage.setItem(this.key, JSON.stringify(session));
|
|
49
|
+
}
|
|
50
|
+
clear() {
|
|
51
|
+
this.session = null;
|
|
52
|
+
this.storage.removeItem(this.key);
|
|
53
|
+
}
|
|
54
|
+
getUsersOrder() {
|
|
55
|
+
const raw = this.storage.getItem(this.usersKey);
|
|
56
|
+
if (!raw)
|
|
57
|
+
return [];
|
|
58
|
+
try {
|
|
59
|
+
const parsed = JSON.parse(raw);
|
|
60
|
+
if (!Array.isArray(parsed))
|
|
61
|
+
return [];
|
|
62
|
+
return parsed.filter((item) => typeof item === 'string');
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
setUsersOrder(order) {
|
|
69
|
+
if (order.length === 0) {
|
|
70
|
+
this.storage.removeItem(this.usersKey);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
this.storage.setItem(this.usersKey, JSON.stringify(order));
|
|
74
|
+
}
|
|
75
|
+
getSessionsByUser() {
|
|
76
|
+
const raw = this.storage.getItem(this.sessionsKey);
|
|
77
|
+
if (!raw)
|
|
78
|
+
return {};
|
|
79
|
+
try {
|
|
80
|
+
const parsed = JSON.parse(raw);
|
|
81
|
+
const normalized = {};
|
|
82
|
+
for (const [userId, session] of Object.entries(parsed)) {
|
|
83
|
+
if (session &&
|
|
84
|
+
typeof session === 'object' &&
|
|
85
|
+
typeof session.accessToken === 'string' &&
|
|
86
|
+
typeof session.refreshToken === 'string' &&
|
|
87
|
+
typeof session.userId === 'string') {
|
|
88
|
+
normalized[userId] = session;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return normalized;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
setSessionsByUser(sessionsByUser) {
|
|
98
|
+
if (Object.keys(sessionsByUser).length === 0) {
|
|
99
|
+
this.storage.removeItem(this.sessionsKey);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this.storage.setItem(this.sessionsKey, JSON.stringify(sessionsByUser));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.SessionManager = SessionManager;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SessionData } from './types';
|
|
2
|
+
export declare class SessionManager {
|
|
3
|
+
private readonly key;
|
|
4
|
+
private session;
|
|
5
|
+
private readonly asyncStorage;
|
|
6
|
+
private hydrationPromise;
|
|
7
|
+
constructor(appId: string);
|
|
8
|
+
private hydrateFromAsyncStorage;
|
|
9
|
+
load(): SessionData | null;
|
|
10
|
+
get(): SessionData | null;
|
|
11
|
+
set(session: SessionData): void;
|
|
12
|
+
clear(): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=session.native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.native.d.ts","sourceRoot":"","sources":["../src/session.native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAsBrC,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,gBAAgB,CAA6B;gBAEzC,KAAK,EAAE,MAAM;IAMzB,OAAO,CAAC,uBAAuB;IAwB/B,IAAI,IAAI,WAAW,GAAG,IAAI;IAI1B,GAAG;IAIH,GAAG,CAAC,OAAO,EAAE,WAAW;IAYxB,KAAK;CAUN"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SessionManager = void 0;
|
|
7
|
+
const async_storage_1 = __importDefault(require("@react-native-async-storage/async-storage"));
|
|
8
|
+
const memoryStore = new Map();
|
|
9
|
+
const getAsyncStorage = () => async_storage_1.default;
|
|
10
|
+
const parseSession = (raw) => {
|
|
11
|
+
if (!raw)
|
|
12
|
+
return null;
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(raw);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
class SessionManager {
|
|
21
|
+
constructor(appId) {
|
|
22
|
+
this.session = null;
|
|
23
|
+
this.asyncStorage = getAsyncStorage();
|
|
24
|
+
this.hydrationPromise = null;
|
|
25
|
+
this.key = `flowerbase:${appId}:session`;
|
|
26
|
+
this.session = this.load();
|
|
27
|
+
void this.hydrateFromAsyncStorage();
|
|
28
|
+
}
|
|
29
|
+
hydrateFromAsyncStorage() {
|
|
30
|
+
if (!this.asyncStorage) {
|
|
31
|
+
return Promise.resolve();
|
|
32
|
+
}
|
|
33
|
+
if (this.hydrationPromise) {
|
|
34
|
+
return this.hydrationPromise;
|
|
35
|
+
}
|
|
36
|
+
this.hydrationPromise = this.asyncStorage
|
|
37
|
+
.getItem(this.key)
|
|
38
|
+
.then((raw) => {
|
|
39
|
+
const parsed = parseSession(raw);
|
|
40
|
+
if (!parsed)
|
|
41
|
+
return;
|
|
42
|
+
this.session = parsed;
|
|
43
|
+
memoryStore.set(this.key, JSON.stringify(parsed));
|
|
44
|
+
})
|
|
45
|
+
.catch(() => {
|
|
46
|
+
// Ignore storage read failures and keep memory fallback.
|
|
47
|
+
});
|
|
48
|
+
return this.hydrationPromise;
|
|
49
|
+
}
|
|
50
|
+
load() {
|
|
51
|
+
return parseSession(memoryStore.get(this.key) ?? null);
|
|
52
|
+
}
|
|
53
|
+
get() {
|
|
54
|
+
return this.session;
|
|
55
|
+
}
|
|
56
|
+
set(session) {
|
|
57
|
+
this.session = session;
|
|
58
|
+
const raw = JSON.stringify(session);
|
|
59
|
+
memoryStore.set(this.key, raw);
|
|
60
|
+
if (this.asyncStorage) {
|
|
61
|
+
void this.asyncStorage.setItem(this.key, raw).catch(() => {
|
|
62
|
+
// Ignore write failures and keep memory fallback.
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
clear() {
|
|
67
|
+
this.session = null;
|
|
68
|
+
memoryStore.delete(this.key);
|
|
69
|
+
if (this.asyncStorage) {
|
|
70
|
+
void this.asyncStorage.removeItem(this.key).catch(() => {
|
|
71
|
+
// Ignore delete failures and keep memory fallback.
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.SessionManager = SessionManager;
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export type AppConfig = {
|
|
2
|
+
id: string;
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
timeout?: number;
|
|
5
|
+
};
|
|
6
|
+
export type CredentialsLike = {
|
|
7
|
+
provider: 'local-userpass';
|
|
8
|
+
email: string;
|
|
9
|
+
password: string;
|
|
10
|
+
} | {
|
|
11
|
+
provider: 'anon-user';
|
|
12
|
+
} | {
|
|
13
|
+
provider: 'custom-function';
|
|
14
|
+
payload: Record<string, unknown>;
|
|
15
|
+
} | {
|
|
16
|
+
provider: 'custom-token';
|
|
17
|
+
token: string;
|
|
18
|
+
};
|
|
19
|
+
export type SessionData = {
|
|
20
|
+
accessToken: string;
|
|
21
|
+
refreshToken: string;
|
|
22
|
+
userId: string;
|
|
23
|
+
};
|
|
24
|
+
export type ProfileData = {
|
|
25
|
+
_id?: string;
|
|
26
|
+
identities?: unknown[];
|
|
27
|
+
type?: string;
|
|
28
|
+
custom_data?: Record<string, unknown>;
|
|
29
|
+
data?: Record<string, unknown>;
|
|
30
|
+
};
|
|
31
|
+
export type FunctionCallPayload = {
|
|
32
|
+
name: string;
|
|
33
|
+
arguments: unknown[];
|
|
34
|
+
service?: string;
|
|
35
|
+
};
|
|
36
|
+
export type WatchConfig = {
|
|
37
|
+
appId: string;
|
|
38
|
+
baseUrl: string;
|
|
39
|
+
accessToken: string;
|
|
40
|
+
database: string;
|
|
41
|
+
collection: string;
|
|
42
|
+
filter?: Record<string, unknown>;
|
|
43
|
+
ids?: unknown[];
|
|
44
|
+
timeout?: number;
|
|
45
|
+
};
|
|
46
|
+
export type WatchAsyncIterator<TChange = unknown> = AsyncIterableIterator<TChange> & {
|
|
47
|
+
close: () => void;
|
|
48
|
+
};
|
|
49
|
+
export interface CollectionLike {
|
|
50
|
+
find: (query?: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
51
|
+
findOne: (query?: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
52
|
+
findOneAndUpdate: (filter: Record<string, unknown>, update: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
53
|
+
findOneAndReplace: (filter: Record<string, unknown>, replacement: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
54
|
+
findOneAndDelete: (filter: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
55
|
+
aggregate: (pipeline: Record<string, unknown>[]) => Promise<unknown>;
|
|
56
|
+
count: (filter?: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
57
|
+
insertOne: (document: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
58
|
+
insertMany: (documents: Record<string, unknown>[], options?: Record<string, unknown>) => Promise<unknown>;
|
|
59
|
+
updateOne: (filter: Record<string, unknown>, update: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
60
|
+
updateMany: (filter: Record<string, unknown>, update: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
61
|
+
deleteOne: (filter: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
62
|
+
deleteMany: (filter: Record<string, unknown>, options?: Record<string, unknown>) => Promise<unknown>;
|
|
63
|
+
watch: (options?: unknown) => WatchAsyncIterator<unknown>;
|
|
64
|
+
}
|
|
65
|
+
export interface MongoDbLike {
|
|
66
|
+
collection: (name: string) => CollectionLike;
|
|
67
|
+
}
|
|
68
|
+
export interface MongoClientLike {
|
|
69
|
+
db: (name: string) => MongoDbLike;
|
|
70
|
+
}
|
|
71
|
+
export interface UserLike {
|
|
72
|
+
id: string;
|
|
73
|
+
state: 'active' | 'logged-out' | 'removed';
|
|
74
|
+
isLoggedIn: boolean;
|
|
75
|
+
accessToken: string | null;
|
|
76
|
+
refreshToken: string | null;
|
|
77
|
+
providerType: string | null;
|
|
78
|
+
identities: unknown[];
|
|
79
|
+
customData: Record<string, unknown>;
|
|
80
|
+
profile?: {
|
|
81
|
+
email?: string;
|
|
82
|
+
[key: string]: unknown;
|
|
83
|
+
};
|
|
84
|
+
functions: Record<string, (...args: unknown[]) => Promise<unknown>> & {
|
|
85
|
+
callFunction: (name: string, ...args: unknown[]) => Promise<unknown>;
|
|
86
|
+
callFunctionStreaming: (name: string, ...args: unknown[]) => Promise<AsyncIterable<Uint8Array>>;
|
|
87
|
+
};
|
|
88
|
+
logOut: () => Promise<void>;
|
|
89
|
+
callFunction: (name: string, ...args: unknown[]) => Promise<unknown>;
|
|
90
|
+
refreshAccessToken: () => Promise<string>;
|
|
91
|
+
refreshCustomData: () => Promise<Record<string, unknown>>;
|
|
92
|
+
mongoClient: (serviceName: string) => MongoClientLike;
|
|
93
|
+
addListener: (callback: () => void) => void;
|
|
94
|
+
removeListener: (callback: () => void) => void;
|
|
95
|
+
removeAllListeners: () => void;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED