@mathrunet/masamune_cloudflare_turso 3.2.1 → 3.2.2
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 +1 -1
- package/README.md +160 -59
- package/dist/functions/turso.js +1 -0
- package/dist/functions/turso.js.map +1 -1
- package/dist/functions/turso_token.js +16 -9
- package/dist/functions/turso_token.js.map +1 -1
- package/dist/lib/request.d.ts +1 -1
- package/dist/lib/request.js +2 -5
- package/dist/lib/request.js.map +1 -1
- package/dist/lib/rules.d.ts +34 -1
- package/dist/lib/rules.js +294 -8
- package/dist/lib/rules.js.map +1 -1
- package/dist/lib/token.d.ts +4 -4
- package/dist/lib/token.js +11 -90
- package/dist/lib/token.js.map +1 -1
- package/dist/lib/turso_client.js +5 -15
- package/dist/lib/turso_client.js.map +1 -1
- package/dist/lib/types.d.ts +12 -10
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -49,55 +49,56 @@ Pass the return value of the `deploy` function to `export default`. It is define
|
|
|
49
49
|
```typescript
|
|
50
50
|
import * as m from "@mathrunet/masamune_cloudflare_turso";
|
|
51
51
|
|
|
52
|
-
export default m.deploy(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
)
|
|
52
|
+
export default m.deploy([
|
|
53
|
+
m.Functions.turso({
|
|
54
|
+
organizationName: TURSO_ORGANIZATION_NAME,
|
|
55
|
+
groupName: TURSO_GROUP_NAME,
|
|
56
|
+
platformApiToken: TURSO_PLATFORM_API_TOKEN,
|
|
57
|
+
autoCreateDatabase: true,
|
|
58
|
+
autoCreateTable: true,
|
|
59
|
+
autoMigrateAddColumns: true,
|
|
60
|
+
rules: {
|
|
61
|
+
version: "1",
|
|
62
|
+
rules: {
|
|
63
|
+
"database/*/table/*/*": {
|
|
64
|
+
read: "deny",
|
|
65
|
+
write: "deny",
|
|
66
|
+
},
|
|
67
|
+
"database/main/table/users/*": {
|
|
68
|
+
read: "authenticated",
|
|
69
|
+
write: "authenticated",
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
}),
|
|
74
|
+
m.Functions.tursoToken({
|
|
75
|
+
organizationName: TURSO_ORGANIZATION_NAME,
|
|
76
|
+
groupName: TURSO_GROUP_NAME,
|
|
77
|
+
platformApiToken: TURSO_PLATFORM_API_TOKEN,
|
|
78
|
+
rules: {
|
|
79
|
+
version: "1",
|
|
80
|
+
rules: {
|
|
81
|
+
"database/main": {
|
|
82
|
+
read: "authenticated",
|
|
83
|
+
write: "deny",
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
}),
|
|
88
|
+
]);
|
|
88
89
|
```
|
|
89
90
|
|
|
90
91
|
# Endpoints
|
|
91
92
|
|
|
92
93
|
The package exposes Turso through a single provider path.
|
|
93
94
|
|
|
94
|
-
| Method
|
|
95
|
-
|
|
96
|
-
| `GET`
|
|
97
|
-
| `POST`
|
|
98
|
-
| `PUT`
|
|
99
|
-
| `DELETE` | `/turso`
|
|
100
|
-
| `POST`
|
|
95
|
+
| Method | Path | Description |
|
|
96
|
+
| -------- | -------------- | --------------------------------- |
|
|
97
|
+
| `GET` | `/turso` | Read rows or count rows. |
|
|
98
|
+
| `POST` | `/turso` | Create a row. |
|
|
99
|
+
| `PUT` | `/turso` | Update rows. |
|
|
100
|
+
| `DELETE` | `/turso` | Delete rows. |
|
|
101
|
+
| `POST` | `/turso/token` | Issue a database-scoped short-lived token. |
|
|
101
102
|
|
|
102
103
|
`GET /turso` uses query parameters.
|
|
103
104
|
|
|
@@ -134,16 +135,22 @@ The worker can create Turso databases and tables automatically.
|
|
|
134
135
|
|
|
135
136
|
```typescript
|
|
136
137
|
m.Functions.turso({
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
autoMigrateAddColumns: true,
|
|
138
|
+
organizationName: TURSO_ORGANIZATION_NAME,
|
|
139
|
+
groupName: TURSO_GROUP_NAME,
|
|
140
|
+
platformApiToken: TURSO_PLATFORM_API_TOKEN,
|
|
141
|
+
autoCreateDatabase: true,
|
|
142
|
+
autoCreateTable: true,
|
|
143
|
+
autoMigrateAddColumns: true,
|
|
144
144
|
});
|
|
145
145
|
```
|
|
146
146
|
|
|
147
|
+
`groupName` must point to an existing Turso group. The region/location is set
|
|
148
|
+
when the group is created, not when each database is created.
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
turso group create my-group --location aws-ap-northeast-1
|
|
152
|
+
```
|
|
153
|
+
|
|
147
154
|
`groupName` can also be omitted when the runtime environment provides
|
|
148
155
|
`TURSO_GROUP_NAME`, such as through a local `.env` file or Cloudflare Worker
|
|
149
156
|
environment variables. When neither `groupName` nor `TURSO_GROUP_NAME` is
|
|
@@ -170,20 +177,83 @@ CREATE TABLE IF NOT EXISTS table_name (
|
|
|
170
177
|
|
|
171
178
|
Objects and arrays are stored as JSON strings.
|
|
172
179
|
|
|
173
|
-
#
|
|
180
|
+
# Database-scoped short-lived token
|
|
181
|
+
|
|
182
|
+
Use `/turso/token` to issue a Turso database token after resolving `read-only`
|
|
183
|
+
or `full-access` authorization through `rules`.
|
|
174
184
|
|
|
175
|
-
|
|
185
|
+
Token authorization is evaluated against the database path:
|
|
186
|
+
|
|
187
|
+
```json
|
|
188
|
+
{
|
|
189
|
+
"version": "1",
|
|
190
|
+
"rules": {
|
|
191
|
+
"database/main": {
|
|
192
|
+
"read": "authenticated",
|
|
193
|
+
"write": "deny"
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
If `read` is allowed and `write` is denied, the worker issues a `read-only`
|
|
200
|
+
token. If both `read` and all write operations are allowed, the worker issues a
|
|
201
|
+
`full-access` token. If `read` is denied, the token request returns `403`.
|
|
202
|
+
|
|
203
|
+
Named path parameters can be compared with the authenticated user ID:
|
|
204
|
+
|
|
205
|
+
```json
|
|
206
|
+
{
|
|
207
|
+
"version": "1",
|
|
208
|
+
"rules": {
|
|
209
|
+
"database/{uid}": {
|
|
210
|
+
"read": { "type": "pathParamMatch", "param": "uid" },
|
|
211
|
+
"write": { "type": "pathParamMatch", "param": "uid" }
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
With this rule, only the authenticated user whose `uid` is equal to the
|
|
218
|
+
database name can access that database.
|
|
219
|
+
|
|
220
|
+
Read and write operations can be restricted to the Workers endpoint while
|
|
221
|
+
issuing only the direct Turso token that is safe for the requested scope:
|
|
222
|
+
|
|
223
|
+
```json
|
|
224
|
+
{
|
|
225
|
+
"version": "1",
|
|
226
|
+
"rules": {
|
|
227
|
+
"database/{uid}": {
|
|
228
|
+
"read": { "type": "pathParamMatch", "param": "uid" },
|
|
229
|
+
"write": {
|
|
230
|
+
"type": "pathParamMatch",
|
|
231
|
+
"param": "uid",
|
|
232
|
+
"serverOnly": true
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
`serverOnly` can also be used with `read` and `fieldMatch` rules. A
|
|
240
|
+
server-only rule does not grant direct token access for that operation.
|
|
241
|
+
|
|
242
|
+
Table/document rules below the database path are also treated as server-side
|
|
243
|
+
rules for token issuance when they restrict `read` or `write`. This is
|
|
244
|
+
intentional because Turso Platform tokens are database-scoped and cannot enforce
|
|
245
|
+
document-level `fieldMatch` or `pathParamMatch` checks on the client.
|
|
176
246
|
|
|
177
247
|
```json
|
|
178
248
|
{
|
|
179
249
|
"database": "main",
|
|
250
|
+
"ttlSeconds": 600,
|
|
180
251
|
"scope": [
|
|
181
252
|
{
|
|
182
253
|
"table": "users",
|
|
183
|
-
"operations": ["read"]
|
|
254
|
+
"operations": ["read", "write"]
|
|
184
255
|
}
|
|
185
|
-
]
|
|
186
|
-
"ttlSeconds": 600
|
|
256
|
+
]
|
|
187
257
|
}
|
|
188
258
|
```
|
|
189
259
|
|
|
@@ -192,20 +262,51 @@ The response is:
|
|
|
192
262
|
```json
|
|
193
263
|
{
|
|
194
264
|
"token": "<jwt>",
|
|
195
|
-
"expiresAt": 1760000000
|
|
265
|
+
"expiresAt": 1760000000,
|
|
266
|
+
"url": "libsql://your-db.turso.io",
|
|
267
|
+
"readMode": "direct",
|
|
268
|
+
"writeMode": "functions",
|
|
269
|
+
"scopes": [
|
|
270
|
+
{
|
|
271
|
+
"table": "users",
|
|
272
|
+
"operations": ["read", "write"],
|
|
273
|
+
"readMode": "direct",
|
|
274
|
+
"writeMode": "functions"
|
|
275
|
+
}
|
|
276
|
+
]
|
|
196
277
|
}
|
|
197
278
|
```
|
|
198
279
|
|
|
280
|
+
If both read and write are functions-only, `/turso/token` does not return
|
|
281
|
+
`token`, `expiresAt`, or `url`; it returns only the resolved modes and scopes:
|
|
282
|
+
|
|
283
|
+
```json
|
|
284
|
+
{
|
|
285
|
+
"readMode": "functions",
|
|
286
|
+
"writeMode": "functions",
|
|
287
|
+
"scopes": [
|
|
288
|
+
{
|
|
289
|
+
"table": "users",
|
|
290
|
+
"operations": ["read", "write"],
|
|
291
|
+
"readMode": "functions",
|
|
292
|
+
"writeMode": "functions"
|
|
293
|
+
}
|
|
294
|
+
]
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
`url` is resolved by the Workers backend. This lets clients use direct libSQL
|
|
299
|
+
access for dynamically created databases without building the Turso hostname on
|
|
300
|
+
the client.
|
|
301
|
+
|
|
199
302
|
`ttlSeconds` defaults to 600 seconds and is capped by `maxTtlSeconds` (default: 3600 seconds).
|
|
200
303
|
|
|
201
|
-
|
|
304
|
+
Tokens are generated with the Turso Platform API:
|
|
202
305
|
|
|
203
306
|
```text
|
|
204
307
|
POST /v1/organizations/{organizationSlug}/databases/{databaseName}/auth/tokens
|
|
205
308
|
```
|
|
206
309
|
|
|
207
|
-
If Platform API settings are not available, the worker falls back to a local HS256 JWT signed with `tokenIssuer.secret` or `authToken`.
|
|
208
|
-
|
|
209
310
|
# GitHub Sponsors
|
|
210
311
|
|
|
211
312
|
Sponsors are always welcome. Thank you for your support!
|
package/dist/functions/turso.js
CHANGED
|
@@ -27,6 +27,7 @@ async function handleCrud(context, options, method) {
|
|
|
27
27
|
operation: (0, rules_1.normalizeHttpMethodToRulesOperation)(method),
|
|
28
28
|
authentication,
|
|
29
29
|
fetchDocument: async () => (0, crud_1.fetchDocumentForRules)(client, request),
|
|
30
|
+
server: true,
|
|
30
31
|
});
|
|
31
32
|
if (!result.allowed) {
|
|
32
33
|
return context.json({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turso.js","sourceRoot":"","sources":["../../src/functions/turso.ts"],"names":[],"mappings":";;AAMA,sCAAiE;AACjE,4CAA6D;AAC7D,wCAIsB;AACtB,sDAG6B;AAE7B,MAAM,CAAC,OAAO,GAAG,CACf,IAAU,EACV,OAA4B,EAC5B,IAAgC,EAChC,EAAE;IACF,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,KAAK,UAAU,UAAU,CACvB,OAAgB,EAChB,OAA4B,EAC5B,MAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAgB,EAAC,OAAO,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,MAAM,IAAA,wCAAyB,EAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,IAAA,gCAAiB,EAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAA,8BAAsB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAsC,CAAC;QAC1F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,IAAA,sBAAc,EAAC;gBACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,GAAG;aAClC,CAAC;YACF,SAAS,EAAE,IAAA,2CAAmC,EAAC,MAAM,CAAC;YACtD,cAAc;YACd,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,IAAA,4BAAqB,EAAC,MAAM,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"turso.js","sourceRoot":"","sources":["../../src/functions/turso.ts"],"names":[],"mappings":";;AAMA,sCAAiE;AACjE,4CAA6D;AAC7D,wCAIsB;AACtB,sDAG6B;AAE7B,MAAM,CAAC,OAAO,GAAG,CACf,IAAU,EACV,OAA4B,EAC5B,IAAgC,EAChC,EAAE;IACF,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,KAAK,UAAU,UAAU,CACvB,OAAgB,EAChB,OAA4B,EAC5B,MAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAgB,EAAC,OAAO,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,MAAM,IAAA,wCAAyB,EAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,IAAA,gCAAiB,EAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAA,8BAAsB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAsC,CAAC;QAC1F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,IAAA,sBAAc,EAAC;gBACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,GAAG;aAClC,CAAC;YACF,SAAS,EAAE,IAAA,2CAAmC,EAAC,MAAM,CAAC;YACtD,cAAc;YACd,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,IAAA,4BAAqB,EAAC,MAAM,EAAE,OAAO,CAAC;YACjE,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,IAAI,CAAC;gBAClB,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,MAAM,CAAC,QAAQ;aACtB,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAA,kBAAW,EAAC;YACjC,MAAM;YACN,MAAM;YACN,OAAO;YACP,eAAe,EAAE,OAAO,CAAC,eAAe,KAAK,KAAK;YAClD,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,KAAK,KAAK;SAC/D,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAA,mBAAS,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
|
|
@@ -11,27 +11,34 @@ module.exports = (hono, options, data) => {
|
|
|
11
11
|
async function handleToken(context, options) {
|
|
12
12
|
try {
|
|
13
13
|
const request = await (0, request_1.parseTokenRequest)(context);
|
|
14
|
-
await (0, turso_client_1.resolveDatabaseConnection)(request.database, options);
|
|
14
|
+
const connection = await (0, turso_client_1.resolveDatabaseConnection)(request.database, options);
|
|
15
15
|
const authentication = context.get("authentication");
|
|
16
16
|
const engine = (0, rules_1.createTursoRulesEngine)(options.rules);
|
|
17
|
-
const
|
|
17
|
+
const access = await (0, rules_1.resolveDatabaseTokenAccess)({
|
|
18
18
|
engine,
|
|
19
19
|
database: request.database,
|
|
20
20
|
scope: request.scope,
|
|
21
21
|
authentication,
|
|
22
22
|
});
|
|
23
|
-
if (
|
|
23
|
+
if (!access) {
|
|
24
24
|
return context.json({
|
|
25
25
|
error: "denied",
|
|
26
26
|
}, 403);
|
|
27
27
|
}
|
|
28
|
-
const token =
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
const token = access.authorization
|
|
29
|
+
? await (0, token_1.issueDatabaseToken)({
|
|
30
|
+
database: request.database,
|
|
31
|
+
authorization: access.authorization,
|
|
32
|
+
ttlSeconds: request.ttlSeconds,
|
|
33
|
+
options,
|
|
34
|
+
})
|
|
35
|
+
: undefined;
|
|
36
|
+
return context.json({
|
|
37
|
+
...(token ? { ...token, url: connection.url } : {}),
|
|
38
|
+
readMode: access.readMode,
|
|
39
|
+
writeMode: access.writeMode,
|
|
40
|
+
scopes: access.scopes,
|
|
33
41
|
});
|
|
34
|
-
return context.json(token);
|
|
35
42
|
}
|
|
36
43
|
catch (error) {
|
|
37
44
|
return (0, request_1.jsonError)(context, error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turso_token.js","sourceRoot":"","sources":["../../src/functions/turso_token.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"turso_token.js","sourceRoot":"","sources":["../../src/functions/turso_token.ts"],"names":[],"mappings":";;AAEA,4CAA8D;AAC9D,wCAGsB;AACtB,sDAAgE;AAChE,wCAAkD;AAElD,MAAM,CAAC,OAAO,GAAG,CACf,IAAU,EACV,OAA4B,EAC5B,IAAgC,EAChC,EAAE;IACF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,KAAK,UAAU,WAAW,CACxB,OAAgB,EAChB,OAA4B;IAE5B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAiB,EAAC,OAAO,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,MAAM,IAAA,wCAAyB,EAChD,OAAO,CAAC,QAAQ,EAChB,OAAO,CACR,CAAC;QACF,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAsC,CAAC;QAC1F,MAAM,MAAM,GAAG,IAAA,8BAAsB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,IAAA,kCAA0B,EAAC;YAC9C,MAAM;YACN,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,cAAc;SACf,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC,IAAI,CACjB;gBACE,KAAK,EAAE,QAAQ;aAChB,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa;YAChC,CAAC,CAAC,MAAM,IAAA,0BAAkB,EAAC;gBACvB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;aACR,CAAC;YACJ,CAAC,CAAC,SAAS,CAAC;QACd,OAAO,OAAO,CAAC,IAAI,CAAC;YAClB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAA,mBAAS,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
|
package/dist/lib/request.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export declare class HttpError extends Error {
|
|
|
5
5
|
constructor(status: number, message: string);
|
|
6
6
|
}
|
|
7
7
|
export declare function parseCrudRequest(context: Context): Promise<Required<Pick<TursoRequestBody, "database" | "table">> & TursoRequestBody>;
|
|
8
|
-
export declare function parseTokenRequest(context: Context): Promise<Required<Pick<TursoTokenRequestBody, "database"
|
|
8
|
+
export declare function parseTokenRequest(context: Context): Promise<Required<Pick<TursoTokenRequestBody, "database">> & TursoTokenRequestBody>;
|
|
9
9
|
export declare function validateIdentifier(value: string, label: string): string;
|
|
10
10
|
export declare function validateLogicalName(value: string, label: string): string;
|
|
11
11
|
export declare function validateIndexKey(value: string): string;
|
package/dist/lib/request.js
CHANGED
|
@@ -43,10 +43,7 @@ async function parseCrudRequest(context) {
|
|
|
43
43
|
async function parseTokenRequest(context) {
|
|
44
44
|
const body = await parseJsonBody(context);
|
|
45
45
|
const database = validateLogicalName(body.database ?? "main", "database");
|
|
46
|
-
|
|
47
|
-
throw new HttpError(400, "scope is required.");
|
|
48
|
-
}
|
|
49
|
-
const scope = body.scope.map((item) => {
|
|
46
|
+
const scope = body.scope?.map((item) => {
|
|
50
47
|
if (!item || typeof item !== "object") {
|
|
51
48
|
throw new HttpError(400, "scope item must be an object.");
|
|
52
49
|
}
|
|
@@ -75,7 +72,7 @@ async function parseTokenRequest(context) {
|
|
|
75
72
|
return {
|
|
76
73
|
...body,
|
|
77
74
|
database,
|
|
78
|
-
scope,
|
|
75
|
+
...(scope ? { scope } : {}),
|
|
79
76
|
};
|
|
80
77
|
}
|
|
81
78
|
function validateIdentifier(value, label) {
|
package/dist/lib/request.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/lib/request.ts"],"names":[],"mappings":";;;AAmBA,4CAuBC;AAED,
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/lib/request.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/rules.d.ts
CHANGED
|
@@ -1,19 +1,38 @@
|
|
|
1
|
-
import { AuthenticationContext, RulesAccessRule, RulesConfig, RulesOperation, RulesOperationKey, TursoTokenScopeInput } from "./types";
|
|
1
|
+
import { AuthenticationContext, RulesAccessRule, RulesConfig, RulesOperation, RulesOperationKey, TursoTokenAccessMode, TursoTokenScopeInput, TursoTokenScopeOutput } from "./types";
|
|
2
2
|
export interface RulesEvaluationInput {
|
|
3
3
|
path: string;
|
|
4
4
|
operation: RulesOperation | RulesOperationKey;
|
|
5
5
|
authentication?: AuthenticationContext | undefined;
|
|
6
6
|
fetchDocument?: (() => Promise<Record<string, unknown> | null | undefined>) | undefined;
|
|
7
|
+
server?: boolean | undefined;
|
|
7
8
|
}
|
|
8
9
|
export interface RulesEvaluationResult {
|
|
9
10
|
allowed: boolean;
|
|
10
11
|
rulePath?: string | undefined;
|
|
11
12
|
access?: RulesAccessRule | undefined;
|
|
13
|
+
params?: Record<string, string> | undefined;
|
|
14
|
+
}
|
|
15
|
+
export type TursoDatabaseTokenAuthorization = "read-only" | "full-access";
|
|
16
|
+
export interface TursoDatabaseTokenAccess {
|
|
17
|
+
authorization?: TursoDatabaseTokenAuthorization | undefined;
|
|
18
|
+
readMode: TursoTokenAccessMode;
|
|
19
|
+
writeMode: TursoTokenAccessMode;
|
|
20
|
+
scopes: TursoTokenScopeOutput[];
|
|
12
21
|
}
|
|
13
22
|
export declare class RulesEngine {
|
|
14
23
|
constructor(config?: RulesConfig | undefined);
|
|
15
24
|
private readonly config;
|
|
16
25
|
evaluate(input: RulesEvaluationInput): Promise<RulesEvaluationResult>;
|
|
26
|
+
hasScopedRestriction({ database, table, operation, }: {
|
|
27
|
+
database: string;
|
|
28
|
+
table: string;
|
|
29
|
+
operation: RulesOperation | RulesOperationKey;
|
|
30
|
+
}): boolean;
|
|
31
|
+
hasScopedDeny({ database, table, operation, }: {
|
|
32
|
+
database: string;
|
|
33
|
+
table: string;
|
|
34
|
+
operation: RulesOperation | RulesOperationKey;
|
|
35
|
+
}): boolean;
|
|
17
36
|
}
|
|
18
37
|
export declare function createTursoRulesEngine(config?: RulesConfig | undefined): RulesEngine;
|
|
19
38
|
export declare function buildRulesPath({ database, table, indexKey, }: {
|
|
@@ -21,6 +40,9 @@ export declare function buildRulesPath({ database, table, indexKey, }: {
|
|
|
21
40
|
table: string;
|
|
22
41
|
indexKey: string;
|
|
23
42
|
}): string;
|
|
43
|
+
export declare function buildDatabaseRulesPath({ database, }: {
|
|
44
|
+
database: string;
|
|
45
|
+
}): string;
|
|
24
46
|
export declare function normalizeHttpMethodToRulesOperation(method: string): RulesOperation;
|
|
25
47
|
export declare function normalizeRulesOperation(operation: RulesOperation | RulesOperationKey): RulesOperation;
|
|
26
48
|
export declare function expandRulesOperation(operation: RulesOperationKey): RulesOperation[];
|
|
@@ -30,3 +52,14 @@ export declare function filterAllowedScope({ engine, database, scope, authentica
|
|
|
30
52
|
scope: TursoTokenScopeInput[];
|
|
31
53
|
authentication?: AuthenticationContext | undefined;
|
|
32
54
|
}): Promise<TursoTokenScopeInput[]>;
|
|
55
|
+
export declare function resolveDatabaseTokenAccess({ engine, database, scope, authentication, }: {
|
|
56
|
+
engine: RulesEngine;
|
|
57
|
+
database: string;
|
|
58
|
+
scope?: TursoTokenScopeInput[] | undefined;
|
|
59
|
+
authentication?: AuthenticationContext | undefined;
|
|
60
|
+
}): Promise<TursoDatabaseTokenAccess | undefined>;
|
|
61
|
+
export declare function resolveDatabaseTokenAuthorization({ engine, database, authentication, }: {
|
|
62
|
+
engine: RulesEngine;
|
|
63
|
+
database: string;
|
|
64
|
+
authentication?: AuthenticationContext | undefined;
|
|
65
|
+
}): Promise<TursoDatabaseTokenAuthorization | undefined>;
|
package/dist/lib/rules.js
CHANGED
|
@@ -3,10 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.RulesEngine = void 0;
|
|
4
4
|
exports.createTursoRulesEngine = createTursoRulesEngine;
|
|
5
5
|
exports.buildRulesPath = buildRulesPath;
|
|
6
|
+
exports.buildDatabaseRulesPath = buildDatabaseRulesPath;
|
|
6
7
|
exports.normalizeHttpMethodToRulesOperation = normalizeHttpMethodToRulesOperation;
|
|
7
8
|
exports.normalizeRulesOperation = normalizeRulesOperation;
|
|
8
9
|
exports.expandRulesOperation = expandRulesOperation;
|
|
9
10
|
exports.filterAllowedScope = filterAllowedScope;
|
|
11
|
+
exports.resolveDatabaseTokenAccess = resolveDatabaseTokenAccess;
|
|
12
|
+
exports.resolveDatabaseTokenAuthorization = resolveDatabaseTokenAuthorization;
|
|
10
13
|
class RulesEngine {
|
|
11
14
|
constructor(config) {
|
|
12
15
|
this.config = normalizeRulesConfig(config);
|
|
@@ -24,20 +27,49 @@ class RulesEngine {
|
|
|
24
27
|
const resolved = resolveInheritedRule(matches.map((match) => ({
|
|
25
28
|
rulePath: match.rulePath,
|
|
26
29
|
entry: this.config.rules[match.rulePath],
|
|
30
|
+
params: match.params,
|
|
27
31
|
})));
|
|
28
|
-
const
|
|
29
|
-
if (!
|
|
32
|
+
const resolvedAccess = resolveAccessRule(resolved.entry, resolved.params, operation);
|
|
33
|
+
if (!resolvedAccess) {
|
|
30
34
|
return {
|
|
31
35
|
allowed: false,
|
|
32
36
|
rulePath: resolved.rulePath,
|
|
33
37
|
};
|
|
34
38
|
}
|
|
35
39
|
return {
|
|
36
|
-
allowed: await evaluateAccessRule(access, input.authentication, input.fetchDocument),
|
|
40
|
+
allowed: await evaluateAccessRule(resolvedAccess.access, input.authentication, input.fetchDocument, resolvedAccess.params, input.server === true),
|
|
37
41
|
rulePath: resolved.rulePath,
|
|
38
|
-
access,
|
|
42
|
+
access: resolvedAccess.access,
|
|
43
|
+
params: resolvedAccess.params,
|
|
39
44
|
};
|
|
40
45
|
}
|
|
46
|
+
hasScopedRestriction({ database, table, operation, }) {
|
|
47
|
+
const normalized = normalizeRulesOperation(operation);
|
|
48
|
+
for (const [rulePath, entry] of Object.entries(this.config.rules)) {
|
|
49
|
+
if (!isRulePathInTableScope(rulePath, database, table)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const access = resolveAccessRule(entry, {}, normalized)?.access;
|
|
53
|
+
if (!access || isDirectSafeScopeAccess(access)) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
hasScopedDeny({ database, table, operation, }) {
|
|
61
|
+
const normalized = normalizeRulesOperation(operation);
|
|
62
|
+
for (const [rulePath, entry] of Object.entries(this.config.rules)) {
|
|
63
|
+
if (!isRulePathInTableScope(rulePath, database, table)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const access = resolveAccessRule(entry, {}, normalized)?.access;
|
|
67
|
+
if (access === "deny") {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
41
73
|
}
|
|
42
74
|
exports.RulesEngine = RulesEngine;
|
|
43
75
|
function createTursoRulesEngine(config) {
|
|
@@ -52,6 +84,12 @@ function buildRulesPath({ database, table, indexKey, }) {
|
|
|
52
84
|
encodePathSegment(indexKey),
|
|
53
85
|
].join("/");
|
|
54
86
|
}
|
|
87
|
+
function buildDatabaseRulesPath({ database, }) {
|
|
88
|
+
return [
|
|
89
|
+
"database",
|
|
90
|
+
encodePathSegment(database),
|
|
91
|
+
].join("/");
|
|
92
|
+
}
|
|
55
93
|
function normalizeHttpMethodToRulesOperation(method) {
|
|
56
94
|
switch (method.toUpperCase()) {
|
|
57
95
|
case "GET":
|
|
@@ -122,6 +160,177 @@ async function filterAllowedScope({ engine, database, scope, authentication, })
|
|
|
122
160
|
}
|
|
123
161
|
return allowed;
|
|
124
162
|
}
|
|
163
|
+
async function resolveDatabaseTokenAccess({ engine, database, scope = [], authentication, }) {
|
|
164
|
+
const path = buildDatabaseRulesPath({ database });
|
|
165
|
+
const directRead = await engine.evaluate({
|
|
166
|
+
path,
|
|
167
|
+
operation: "read",
|
|
168
|
+
authentication,
|
|
169
|
+
server: false,
|
|
170
|
+
});
|
|
171
|
+
const serverRead = directRead.allowed
|
|
172
|
+
? directRead
|
|
173
|
+
: await engine.evaluate({
|
|
174
|
+
path,
|
|
175
|
+
operation: "read",
|
|
176
|
+
authentication,
|
|
177
|
+
server: true,
|
|
178
|
+
});
|
|
179
|
+
if (!serverRead.allowed) {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
const directDatabaseWrite = await evaluateDatabaseWrite({
|
|
183
|
+
engine,
|
|
184
|
+
path,
|
|
185
|
+
authentication,
|
|
186
|
+
server: false,
|
|
187
|
+
});
|
|
188
|
+
const serverDatabaseWrite = directDatabaseWrite
|
|
189
|
+
? true
|
|
190
|
+
: await evaluateDatabaseWrite({
|
|
191
|
+
engine,
|
|
192
|
+
path,
|
|
193
|
+
authentication,
|
|
194
|
+
server: true,
|
|
195
|
+
});
|
|
196
|
+
const scopes = await resolveScopeModes({
|
|
197
|
+
engine,
|
|
198
|
+
database,
|
|
199
|
+
scope,
|
|
200
|
+
authentication,
|
|
201
|
+
});
|
|
202
|
+
const readScopes = scopes.filter((item) => requiresRead(item.operations));
|
|
203
|
+
const writeScopes = scopes.filter((item) => requiresWrite(item.operations));
|
|
204
|
+
const readMode = resolveOverallMode(readScopes.map((item) => item.readMode ?? "none"), scope.length === 0 ? directRead.allowed ? "direct" : "functions" : "none");
|
|
205
|
+
let writeMode = resolveOverallMode(writeScopes.map((item) => item.writeMode ?? "none"), scope.length === 0 ? directDatabaseWrite ? "direct" : serverDatabaseWrite ? "functions" : "none" : "none");
|
|
206
|
+
if (readMode === "functions" && writeMode === "direct") {
|
|
207
|
+
writeMode = serverDatabaseWrite ? "functions" : "none";
|
|
208
|
+
}
|
|
209
|
+
const authorization = resolveTokenAuthorization(readMode, writeMode);
|
|
210
|
+
return {
|
|
211
|
+
authorization,
|
|
212
|
+
readMode,
|
|
213
|
+
writeMode,
|
|
214
|
+
scopes,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
async function resolveScopeModes({ engine, database, scope, authentication, }) {
|
|
218
|
+
const resolved = [];
|
|
219
|
+
for (const item of scope) {
|
|
220
|
+
const readMode = requiresRead(item.operations)
|
|
221
|
+
? await resolveScopedOperationMode({
|
|
222
|
+
engine,
|
|
223
|
+
database,
|
|
224
|
+
table: item.table,
|
|
225
|
+
operation: "read",
|
|
226
|
+
authentication,
|
|
227
|
+
})
|
|
228
|
+
: undefined;
|
|
229
|
+
const writeMode = requiresWrite(item.operations)
|
|
230
|
+
? await resolveScopedOperationMode({
|
|
231
|
+
engine,
|
|
232
|
+
database,
|
|
233
|
+
table: item.table,
|
|
234
|
+
operation: "write",
|
|
235
|
+
authentication,
|
|
236
|
+
})
|
|
237
|
+
: undefined;
|
|
238
|
+
resolved.push({
|
|
239
|
+
table: item.table,
|
|
240
|
+
operations: item.operations,
|
|
241
|
+
...(readMode ? { readMode } : {}),
|
|
242
|
+
...(writeMode ? { writeMode } : {}),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
return resolved;
|
|
246
|
+
}
|
|
247
|
+
async function resolveScopedOperationMode({ engine, database, table, operation, authentication, }) {
|
|
248
|
+
const path = buildRulesPath({
|
|
249
|
+
database,
|
|
250
|
+
table,
|
|
251
|
+
indexKey: "*",
|
|
252
|
+
});
|
|
253
|
+
const expanded = expandRulesOperation(operation);
|
|
254
|
+
const direct = await Promise.all(expanded.map((item) => engine.evaluate({
|
|
255
|
+
path,
|
|
256
|
+
operation: item,
|
|
257
|
+
authentication,
|
|
258
|
+
server: false,
|
|
259
|
+
})));
|
|
260
|
+
const directAllowed = direct.every((result) => result.allowed);
|
|
261
|
+
const restricted = expanded.some((item) => engine.hasScopedRestriction({
|
|
262
|
+
database,
|
|
263
|
+
table,
|
|
264
|
+
operation: item,
|
|
265
|
+
}));
|
|
266
|
+
if (directAllowed && !restricted) {
|
|
267
|
+
return "direct";
|
|
268
|
+
}
|
|
269
|
+
const denied = expanded.some((item) => engine.hasScopedDeny({
|
|
270
|
+
database,
|
|
271
|
+
table,
|
|
272
|
+
operation: item,
|
|
273
|
+
}));
|
|
274
|
+
if (restricted && !denied) {
|
|
275
|
+
return "functions";
|
|
276
|
+
}
|
|
277
|
+
const server = await Promise.all(expanded.map((item) => engine.evaluate({
|
|
278
|
+
path,
|
|
279
|
+
operation: item,
|
|
280
|
+
authentication,
|
|
281
|
+
server: true,
|
|
282
|
+
})));
|
|
283
|
+
return server.every((result) => result.allowed) ? "functions" : "none";
|
|
284
|
+
}
|
|
285
|
+
function resolveOverallMode(scopedModes, fallback) {
|
|
286
|
+
if (scopedModes.length === 0) {
|
|
287
|
+
return fallback;
|
|
288
|
+
}
|
|
289
|
+
if (scopedModes.every((mode) => mode === "direct")) {
|
|
290
|
+
return "direct";
|
|
291
|
+
}
|
|
292
|
+
if (scopedModes.some((mode) => mode === "none")) {
|
|
293
|
+
return "none";
|
|
294
|
+
}
|
|
295
|
+
return "functions";
|
|
296
|
+
}
|
|
297
|
+
function resolveTokenAuthorization(readMode, writeMode) {
|
|
298
|
+
if (writeMode === "direct") {
|
|
299
|
+
return "full-access";
|
|
300
|
+
}
|
|
301
|
+
if (readMode === "direct") {
|
|
302
|
+
return "read-only";
|
|
303
|
+
}
|
|
304
|
+
return undefined;
|
|
305
|
+
}
|
|
306
|
+
function requiresRead(operations) {
|
|
307
|
+
return operations.some((operation) => expandRulesOperation(operation).includes("get"));
|
|
308
|
+
}
|
|
309
|
+
function requiresWrite(operations) {
|
|
310
|
+
return operations.some((operation) => {
|
|
311
|
+
const expanded = expandRulesOperation(operation);
|
|
312
|
+
return expanded.includes("create") || expanded.includes("update") || expanded.includes("delete");
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
async function evaluateDatabaseWrite({ engine, path, authentication, server, }) {
|
|
316
|
+
const results = await Promise.all(expandRulesOperation("write").map((operation) => {
|
|
317
|
+
return engine.evaluate({
|
|
318
|
+
path,
|
|
319
|
+
operation,
|
|
320
|
+
authentication,
|
|
321
|
+
server,
|
|
322
|
+
});
|
|
323
|
+
}));
|
|
324
|
+
return results.every((result) => result.allowed);
|
|
325
|
+
}
|
|
326
|
+
async function resolveDatabaseTokenAuthorization({ engine, database, authentication, }) {
|
|
327
|
+
const access = await resolveDatabaseTokenAccess({
|
|
328
|
+
engine,
|
|
329
|
+
database,
|
|
330
|
+
authentication,
|
|
331
|
+
});
|
|
332
|
+
return access?.authorization;
|
|
333
|
+
}
|
|
125
334
|
function normalizeRulesConfig(config) {
|
|
126
335
|
if (!config) {
|
|
127
336
|
return {
|
|
@@ -146,7 +355,9 @@ function matchRulePath(rulePath, requestPath) {
|
|
|
146
355
|
validateRulePath(rulePath);
|
|
147
356
|
const ruleSegments = splitPath(rulePath);
|
|
148
357
|
const requestSegments = splitPath(requestPath);
|
|
358
|
+
const params = {};
|
|
149
359
|
let literalSegments = 0;
|
|
360
|
+
let namedWildcardSegments = 0;
|
|
150
361
|
let wildcardSegments = 0;
|
|
151
362
|
let deepWildcardSegments = 0;
|
|
152
363
|
for (let i = 0; i < ruleSegments.length; i++) {
|
|
@@ -156,7 +367,9 @@ function matchRulePath(rulePath, requestPath) {
|
|
|
156
367
|
return {
|
|
157
368
|
matched: true,
|
|
158
369
|
rulePath,
|
|
370
|
+
params,
|
|
159
371
|
literalSegments,
|
|
372
|
+
namedWildcardSegments,
|
|
160
373
|
wildcardSegments,
|
|
161
374
|
deepWildcardSegments,
|
|
162
375
|
matchedSegments: requestSegments.length,
|
|
@@ -170,6 +383,13 @@ function matchRulePath(rulePath, requestPath) {
|
|
|
170
383
|
wildcardSegments++;
|
|
171
384
|
continue;
|
|
172
385
|
}
|
|
386
|
+
const paramName = parseNamedPathParam(ruleSegment);
|
|
387
|
+
if (paramName) {
|
|
388
|
+
params[paramName] = requestSegment;
|
|
389
|
+
namedWildcardSegments++;
|
|
390
|
+
wildcardSegments++;
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
173
393
|
if (ruleSegment !== requestSegment) {
|
|
174
394
|
return createUnmatched(rulePath);
|
|
175
395
|
}
|
|
@@ -181,7 +401,9 @@ function matchRulePath(rulePath, requestPath) {
|
|
|
181
401
|
return {
|
|
182
402
|
matched: true,
|
|
183
403
|
rulePath,
|
|
404
|
+
params,
|
|
184
405
|
literalSegments,
|
|
406
|
+
namedWildcardSegments,
|
|
185
407
|
wildcardSegments,
|
|
186
408
|
deepWildcardSegments,
|
|
187
409
|
matchedSegments: requestSegments.length,
|
|
@@ -194,6 +416,9 @@ function compareRulePathMatch(a, b) {
|
|
|
194
416
|
if (a.deepWildcardSegments !== b.deepWildcardSegments) {
|
|
195
417
|
return a.deepWildcardSegments - b.deepWildcardSegments;
|
|
196
418
|
}
|
|
419
|
+
if (a.namedWildcardSegments !== b.namedWildcardSegments) {
|
|
420
|
+
return b.namedWildcardSegments - a.namedWildcardSegments;
|
|
421
|
+
}
|
|
197
422
|
if (a.wildcardSegments !== b.wildcardSegments) {
|
|
198
423
|
return a.wildcardSegments - b.wildcardSegments;
|
|
199
424
|
}
|
|
@@ -204,6 +429,7 @@ function compareRulePathMatch(a, b) {
|
|
|
204
429
|
}
|
|
205
430
|
function resolveInheritedRule(matches) {
|
|
206
431
|
const inherited = {};
|
|
432
|
+
const inheritedParams = {};
|
|
207
433
|
let rulePath = matches[0]?.rulePath ?? "";
|
|
208
434
|
for (const match of [...matches].reverse()) {
|
|
209
435
|
if (!match.entry) {
|
|
@@ -212,18 +438,23 @@ function resolveInheritedRule(matches) {
|
|
|
212
438
|
rulePath = match.rulePath;
|
|
213
439
|
for (const [operation, access] of Object.entries(match.entry)) {
|
|
214
440
|
inherited[operation] = access;
|
|
441
|
+
inheritedParams[operation] = match.params;
|
|
215
442
|
}
|
|
216
443
|
}
|
|
217
444
|
return {
|
|
218
445
|
rulePath,
|
|
219
446
|
entry: inherited,
|
|
447
|
+
params: inheritedParams,
|
|
220
448
|
};
|
|
221
449
|
}
|
|
222
|
-
function resolveAccessRule(entry, operation) {
|
|
450
|
+
function resolveAccessRule(entry, params, operation) {
|
|
223
451
|
for (const operationKey of resolveRulesOperation(operation)) {
|
|
224
452
|
const access = entry[operationKey];
|
|
225
453
|
if (access) {
|
|
226
|
-
return
|
|
454
|
+
return {
|
|
455
|
+
access,
|
|
456
|
+
params: params[operationKey] ?? {},
|
|
457
|
+
};
|
|
227
458
|
}
|
|
228
459
|
}
|
|
229
460
|
return undefined;
|
|
@@ -240,7 +471,7 @@ function resolveRulesOperation(operation) {
|
|
|
240
471
|
return ["delete", "write"];
|
|
241
472
|
}
|
|
242
473
|
}
|
|
243
|
-
async function evaluateAccessRule(access, authentication, fetchDocument) {
|
|
474
|
+
async function evaluateAccessRule(access, authentication, fetchDocument, params = {}, server = false) {
|
|
244
475
|
switch (access) {
|
|
245
476
|
case "deny":
|
|
246
477
|
return false;
|
|
@@ -248,7 +479,16 @@ async function evaluateAccessRule(access, authentication, fetchDocument) {
|
|
|
248
479
|
return true;
|
|
249
480
|
case "authenticated":
|
|
250
481
|
return !!authentication?.uid;
|
|
251
|
-
default:
|
|
482
|
+
default:
|
|
483
|
+
break;
|
|
484
|
+
}
|
|
485
|
+
if ("serverOnly" in access && access.serverOnly === true && !server) {
|
|
486
|
+
return false;
|
|
487
|
+
}
|
|
488
|
+
switch (access.type) {
|
|
489
|
+
case "serverOnly":
|
|
490
|
+
return server;
|
|
491
|
+
case "fieldMatch": {
|
|
252
492
|
const uid = authentication?.uid;
|
|
253
493
|
if (!uid || !fetchDocument) {
|
|
254
494
|
return false;
|
|
@@ -256,6 +496,10 @@ async function evaluateAccessRule(access, authentication, fetchDocument) {
|
|
|
256
496
|
const document = await fetchDocument();
|
|
257
497
|
return document?.[access.field] === uid;
|
|
258
498
|
}
|
|
499
|
+
case "pathParamMatch": {
|
|
500
|
+
const uid = authentication?.uid;
|
|
501
|
+
return !!uid && params[access.param] === uid;
|
|
502
|
+
}
|
|
259
503
|
}
|
|
260
504
|
}
|
|
261
505
|
function validateRulePath(path) {
|
|
@@ -266,11 +510,47 @@ function validateRulePath(path) {
|
|
|
266
510
|
if (segments.some((segment) => segment.length === 0)) {
|
|
267
511
|
throw new Error(`Invalid rule path: ${path}`);
|
|
268
512
|
}
|
|
513
|
+
const paramNames = new Set();
|
|
514
|
+
for (const segment of segments) {
|
|
515
|
+
if ((segment.startsWith("{") || segment.endsWith("}")) && !parseNamedPathParam(segment)) {
|
|
516
|
+
throw new Error(`Invalid path parameter segment '${segment}' in rule path: ${path}`);
|
|
517
|
+
}
|
|
518
|
+
const paramName = parseNamedPathParam(segment);
|
|
519
|
+
if (!paramName) {
|
|
520
|
+
continue;
|
|
521
|
+
}
|
|
522
|
+
if (paramNames.has(paramName)) {
|
|
523
|
+
throw new Error(`Duplicate path parameter '${paramName}' in rule path: ${path}`);
|
|
524
|
+
}
|
|
525
|
+
paramNames.add(paramName);
|
|
526
|
+
}
|
|
269
527
|
const deepWildcardIndex = segments.indexOf("**");
|
|
270
528
|
if (deepWildcardIndex >= 0 && deepWildcardIndex !== segments.length - 1) {
|
|
271
529
|
throw new Error(`'**' must be the last segment in rule path: ${path}`);
|
|
272
530
|
}
|
|
273
531
|
}
|
|
532
|
+
function isRulePathInTableScope(rulePath, database, table) {
|
|
533
|
+
const segments = splitPath(rulePath);
|
|
534
|
+
if (segments.length <= 4) {
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
return segmentMatches(segments[0], "database") &&
|
|
538
|
+
segmentMatches(segments[1], database) &&
|
|
539
|
+
segmentMatches(segments[2], "table") &&
|
|
540
|
+
segmentMatches(segments[3], table);
|
|
541
|
+
}
|
|
542
|
+
function segmentMatches(ruleSegment, value) {
|
|
543
|
+
if (!ruleSegment) {
|
|
544
|
+
return false;
|
|
545
|
+
}
|
|
546
|
+
if (ruleSegment === "**") {
|
|
547
|
+
return true;
|
|
548
|
+
}
|
|
549
|
+
return ruleSegment === "*" || !!parseNamedPathParam(ruleSegment) || ruleSegment === value;
|
|
550
|
+
}
|
|
551
|
+
function isDirectSafeScopeAccess(access) {
|
|
552
|
+
return access === "allow";
|
|
553
|
+
}
|
|
274
554
|
function splitPath(path) {
|
|
275
555
|
if (path.length === 0 || path.startsWith("/") || path.endsWith("/")) {
|
|
276
556
|
return [];
|
|
@@ -281,12 +561,18 @@ function createUnmatched(rulePath) {
|
|
|
281
561
|
return {
|
|
282
562
|
matched: false,
|
|
283
563
|
rulePath,
|
|
564
|
+
params: {},
|
|
284
565
|
literalSegments: 0,
|
|
566
|
+
namedWildcardSegments: 0,
|
|
285
567
|
wildcardSegments: 0,
|
|
286
568
|
deepWildcardSegments: 0,
|
|
287
569
|
matchedSegments: 0,
|
|
288
570
|
};
|
|
289
571
|
}
|
|
572
|
+
function parseNamedPathParam(segment) {
|
|
573
|
+
const match = /^\{([A-Za-z_][A-Za-z0-9_]*)\}$/.exec(segment);
|
|
574
|
+
return match?.[1];
|
|
575
|
+
}
|
|
290
576
|
function encodePathSegment(segment) {
|
|
291
577
|
if (segment.length === 0 || segment.includes("/")) {
|
|
292
578
|
throw new Error(`Invalid path segment: ${segment}`);
|
package/dist/lib/rules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lib/rules.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lib/rules.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/token.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TursoWorkersOptions } from "./types";
|
|
2
|
+
import type { TursoDatabaseTokenAuthorization } from "./rules";
|
|
2
3
|
export interface IssuedToken {
|
|
3
4
|
token: string;
|
|
4
5
|
expiresAt: number;
|
|
5
6
|
}
|
|
6
|
-
export declare function
|
|
7
|
+
export declare function issueDatabaseToken({ database, authorization, ttlSeconds, options, }: {
|
|
7
8
|
database: string;
|
|
8
|
-
|
|
9
|
+
authorization: TursoDatabaseTokenAuthorization;
|
|
9
10
|
ttlSeconds?: number | undefined;
|
|
10
11
|
options: TursoWorkersOptions;
|
|
11
12
|
}): Promise<IssuedToken>;
|
|
12
|
-
export declare function buildTursoPermissions(scope: TursoTokenScopeInput[]): Record<string, string[]>;
|
package/dist/lib/token.js
CHANGED
|
@@ -1,86 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
async function issueScopedToken({ database, scope, ttlSeconds, options, }) {
|
|
3
|
+
exports.issueDatabaseToken = issueDatabaseToken;
|
|
4
|
+
async function issueDatabaseToken({ database, authorization, ttlSeconds, options, }) {
|
|
6
5
|
const now = Math.floor(Date.now() / 1000);
|
|
7
6
|
const maxTtl = options.maxTtlSeconds ?? 3600;
|
|
8
7
|
const ttl = Math.max(1, Math.min(ttlSeconds ?? 600, maxTtl));
|
|
9
8
|
const expiresAt = now + ttl;
|
|
10
|
-
const
|
|
11
|
-
iss: options.tokenIssuer?.issuer ?? "masamune_cloudflare_turso",
|
|
12
|
-
aud: options.tokenIssuer?.audience ?? "turso",
|
|
13
|
-
iat: now,
|
|
14
|
-
exp: expiresAt,
|
|
9
|
+
const jwt = await issuePlatformDatabaseToken({
|
|
15
10
|
database,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const jwt = await issuePlatformDatabaseToken({
|
|
21
|
-
database,
|
|
22
|
-
ttlSeconds: ttl,
|
|
23
|
-
permissions: payload.permissions,
|
|
24
|
-
options,
|
|
25
|
-
});
|
|
26
|
-
return {
|
|
27
|
-
token: jwt,
|
|
28
|
-
expiresAt,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
const secret = options.tokenIssuer?.secret ?? options.authToken;
|
|
32
|
-
if (!secret) {
|
|
33
|
-
throw new Error("tokenIssuer.secret or authToken is required to issue scoped tokens.");
|
|
34
|
-
}
|
|
11
|
+
ttlSeconds: ttl,
|
|
12
|
+
authorization,
|
|
13
|
+
options,
|
|
14
|
+
});
|
|
35
15
|
return {
|
|
36
|
-
token:
|
|
16
|
+
token: jwt,
|
|
37
17
|
expiresAt,
|
|
38
18
|
};
|
|
39
19
|
}
|
|
40
|
-
function
|
|
41
|
-
const permissions = {};
|
|
42
|
-
for (const item of scope) {
|
|
43
|
-
const tablePermissions = permissions[item.table] ?? new Set();
|
|
44
|
-
for (const operation of item.operations) {
|
|
45
|
-
for (const permission of operationToPermissions(operation)) {
|
|
46
|
-
tablePermissions.add(permission);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
permissions[item.table] = tablePermissions;
|
|
50
|
-
}
|
|
51
|
-
return Object.fromEntries(Object.entries(permissions).map(([table, values]) => {
|
|
52
|
-
return [table, [...values].sort()];
|
|
53
|
-
}));
|
|
54
|
-
}
|
|
55
|
-
async function signHs256(payload, secret) {
|
|
56
|
-
const header = {
|
|
57
|
-
alg: "HS256",
|
|
58
|
-
typ: "JWT",
|
|
59
|
-
};
|
|
60
|
-
const unsigned = `${base64UrlEncodeJson(header)}.${base64UrlEncodeJson(payload)}`;
|
|
61
|
-
const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(secret), {
|
|
62
|
-
name: "HMAC",
|
|
63
|
-
hash: "SHA-256",
|
|
64
|
-
}, false, ["sign"]);
|
|
65
|
-
const signature = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(unsigned));
|
|
66
|
-
return `${unsigned}.${base64UrlEncode(signature)}`;
|
|
67
|
-
}
|
|
68
|
-
function operationToPermissions(operation) {
|
|
69
|
-
switch (operation) {
|
|
70
|
-
case "read":
|
|
71
|
-
case "get":
|
|
72
|
-
return ["data_read"];
|
|
73
|
-
case "create":
|
|
74
|
-
return ["data_add"];
|
|
75
|
-
case "update":
|
|
76
|
-
return ["data_update"];
|
|
77
|
-
case "delete":
|
|
78
|
-
return ["data_delete"];
|
|
79
|
-
case "write":
|
|
80
|
-
return ["data_add", "data_update", "data_delete"];
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
async function issuePlatformDatabaseToken({ database, ttlSeconds, permissions, options, }) {
|
|
20
|
+
async function issuePlatformDatabaseToken({ database, ttlSeconds, authorization, options, }) {
|
|
84
21
|
const databaseName = `${options.databaseNamePrefix ?? ""}${database}`;
|
|
85
22
|
const organizationName = options.organizationName;
|
|
86
23
|
const platformApiToken = options.platformApiToken;
|
|
@@ -89,35 +26,19 @@ async function issuePlatformDatabaseToken({ database, ttlSeconds, permissions, o
|
|
|
89
26
|
}
|
|
90
27
|
const response = await fetch("https://api.turso.tech/v1/organizations/" +
|
|
91
28
|
`${encodeURIComponent(organizationName)}/databases/${encodeURIComponent(databaseName)}` +
|
|
92
|
-
`/auth/tokens?expiration=${ttlSeconds}s&authorization
|
|
29
|
+
`/auth/tokens?expiration=${ttlSeconds}s&authorization=${authorization}`, {
|
|
93
30
|
method: "POST",
|
|
94
31
|
headers: {
|
|
95
32
|
Authorization: `Bearer ${platformApiToken}`,
|
|
96
|
-
"Content-Type": "application/json",
|
|
97
33
|
},
|
|
98
|
-
body: JSON.stringify({ permissions }),
|
|
99
34
|
});
|
|
100
35
|
if (!response.ok) {
|
|
101
36
|
throw new Error(`Failed to issue Turso token: ${response.status}`);
|
|
102
37
|
}
|
|
103
|
-
const body = await response.json();
|
|
38
|
+
const body = (await response.json());
|
|
104
39
|
if (!body.jwt) {
|
|
105
40
|
throw new Error("Turso token response did not include jwt.");
|
|
106
41
|
}
|
|
107
42
|
return body.jwt;
|
|
108
43
|
}
|
|
109
|
-
function base64UrlEncodeJson(value) {
|
|
110
|
-
return base64UrlEncode(new TextEncoder().encode(JSON.stringify(value)));
|
|
111
|
-
}
|
|
112
|
-
function base64UrlEncode(value) {
|
|
113
|
-
const bytes = value instanceof Uint8Array ? value : new Uint8Array(value);
|
|
114
|
-
let binary = "";
|
|
115
|
-
for (const byte of bytes) {
|
|
116
|
-
binary += String.fromCharCode(byte);
|
|
117
|
-
}
|
|
118
|
-
return btoa(binary)
|
|
119
|
-
.replace(/\+/g, "-")
|
|
120
|
-
.replace(/\//g, "_")
|
|
121
|
-
.replace(/=+$/g, "");
|
|
122
|
-
}
|
|
123
44
|
//# sourceMappingURL=token.js.map
|
package/dist/lib/token.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/lib/token.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/lib/token.ts"],"names":[],"mappings":";;AAQA,gDAyBC;AAzBM,KAAK,UAAU,kBAAkB,CAAC,EACvC,QAAQ,EACR,aAAa,EACb,UAAU,EACV,OAAO,GAMR;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC;QAC3C,QAAQ;QACR,UAAU,EAAE,GAAG;QACf,aAAa;QACb,OAAO;KACR,CAAC,CAAC;IACH,OAAO;QACL,KAAK,EAAE,GAAG;QACV,SAAS;KACV,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,EACxC,QAAQ,EACR,UAAU,EACV,aAAa,EACb,OAAO,GAMR;IACC,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,kBAAkB,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;IACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAClD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAClD,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,0CAA0C;QACxC,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,cAAc,kBAAkB,CAAC,YAAY,CAAC,EAAE;QACvF,2BAA2B,UAAU,mBAAmB,aAAa,EAAE,EACzE;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,gBAAgB,EAAE;SAC5C;KACF,CACF,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC;AAClB,CAAC"}
|
package/dist/lib/turso_client.js
CHANGED
|
@@ -13,24 +13,11 @@ function createTursoClient(connection) {
|
|
|
13
13
|
}
|
|
14
14
|
async function resolveDatabaseConnection(database, options) {
|
|
15
15
|
const normalizedDatabase = (0, request_1.validateLogicalName)(database, "database");
|
|
16
|
-
const configured = options.databases?.[normalizedDatabase];
|
|
17
|
-
if (configured) {
|
|
18
|
-
return configured;
|
|
19
|
-
}
|
|
20
|
-
if ((options.defaultDatabase ?? "main") === normalizedDatabase && options.url) {
|
|
21
|
-
return {
|
|
22
|
-
url: options.url,
|
|
23
|
-
authToken: options.authToken,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
16
|
const databaseName = `${options.databaseNamePrefix ?? ""}${normalizedDatabase}`;
|
|
27
17
|
const cached = connectionCache.get(databaseName);
|
|
28
18
|
if (cached) {
|
|
29
19
|
return cached;
|
|
30
20
|
}
|
|
31
|
-
if (options.autoCreateDatabase === false) {
|
|
32
|
-
throw new request_1.HttpError(404, `Database is not configured: ${normalizedDatabase}`);
|
|
33
|
-
}
|
|
34
21
|
const created = await ensurePlatformDatabase(databaseName, options);
|
|
35
22
|
connectionCache.set(databaseName, created);
|
|
36
23
|
return created;
|
|
@@ -51,6 +38,9 @@ async function ensurePlatformDatabase(databaseName, options) {
|
|
|
51
38
|
headers,
|
|
52
39
|
});
|
|
53
40
|
if (existing.status === 404) {
|
|
41
|
+
if (options.autoCreateDatabase === false) {
|
|
42
|
+
throw new request_1.HttpError(404, `Database was not found: ${databaseName}`);
|
|
43
|
+
}
|
|
54
44
|
const response = await fetch(`${baseUrl}/databases`, {
|
|
55
45
|
method: "POST",
|
|
56
46
|
headers,
|
|
@@ -72,7 +62,7 @@ async function ensurePlatformDatabase(databaseName, options) {
|
|
|
72
62
|
if (!infoResponse.ok) {
|
|
73
63
|
throw new request_1.HttpError(500, `Failed to resolve Turso database: ${infoResponse.status}`);
|
|
74
64
|
}
|
|
75
|
-
const info = await infoResponse.json();
|
|
65
|
+
const info = (await infoResponse.json());
|
|
76
66
|
const url = findDatabaseUrl(info);
|
|
77
67
|
if (!url) {
|
|
78
68
|
throw new request_1.HttpError(500, "Turso database URL was not found in Platform API response.");
|
|
@@ -92,7 +82,7 @@ async function createDatabaseToken(baseUrl, databaseName, headers) {
|
|
|
92
82
|
if (!response.ok) {
|
|
93
83
|
return undefined;
|
|
94
84
|
}
|
|
95
|
-
const body = await response.json();
|
|
85
|
+
const body = (await response.json());
|
|
96
86
|
const token = body.jwt ?? body.token;
|
|
97
87
|
return typeof token === "string" ? token : undefined;
|
|
98
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turso_client.js","sourceRoot":"","sources":["../../src/lib/turso_client.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"turso_client.js","sourceRoot":"","sources":["../../src/lib/turso_client.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -4,8 +4,15 @@ export type RulesOperation = "get" | "create" | "update" | "delete";
|
|
|
4
4
|
export type RulesOperationAlias = "read" | "write";
|
|
5
5
|
export type RulesOperationKey = RulesOperation | RulesOperationAlias;
|
|
6
6
|
export type RulesAccessRule = "deny" | "allow" | "authenticated" | {
|
|
7
|
+
type: "serverOnly";
|
|
8
|
+
} | {
|
|
7
9
|
type: "fieldMatch";
|
|
8
10
|
field: string;
|
|
11
|
+
serverOnly?: boolean | undefined;
|
|
12
|
+
} | {
|
|
13
|
+
type: "pathParamMatch";
|
|
14
|
+
param: string;
|
|
15
|
+
serverOnly?: boolean | undefined;
|
|
9
16
|
};
|
|
10
17
|
export type RulesEntry = Partial<Record<RulesOperationKey, RulesAccessRule>>;
|
|
11
18
|
export interface RulesConfig {
|
|
@@ -16,16 +23,7 @@ export interface TursoDatabaseConnection {
|
|
|
16
23
|
url: string;
|
|
17
24
|
authToken?: string | undefined;
|
|
18
25
|
}
|
|
19
|
-
export interface TursoTokenIssuerOptions {
|
|
20
|
-
secret?: string | undefined;
|
|
21
|
-
issuer?: string | undefined;
|
|
22
|
-
audience?: string | undefined;
|
|
23
|
-
}
|
|
24
26
|
export interface TursoWorkersOptions extends Omit<WorkersOptions, "rules"> {
|
|
25
|
-
url?: string | undefined;
|
|
26
|
-
authToken?: string | undefined;
|
|
27
|
-
databases?: Record<string, TursoDatabaseConnection> | undefined;
|
|
28
|
-
defaultDatabase?: string | undefined;
|
|
29
27
|
databaseNamePrefix?: string | undefined;
|
|
30
28
|
organizationName?: string | undefined;
|
|
31
29
|
groupName?: string | undefined;
|
|
@@ -35,7 +33,6 @@ export interface TursoWorkersOptions extends Omit<WorkersOptions, "rules"> {
|
|
|
35
33
|
autoMigrateAddColumns?: boolean | undefined;
|
|
36
34
|
maxTtlSeconds?: number | undefined;
|
|
37
35
|
rules?: RulesConfig | undefined;
|
|
38
|
-
tokenIssuer?: TursoTokenIssuerOptions | undefined;
|
|
39
36
|
}
|
|
40
37
|
export interface TursoRequestBody {
|
|
41
38
|
database?: string | undefined;
|
|
@@ -60,6 +57,11 @@ export interface TursoTokenScopeInput {
|
|
|
60
57
|
table: string;
|
|
61
58
|
operations: RulesOperationKey[];
|
|
62
59
|
}
|
|
60
|
+
export type TursoTokenAccessMode = "none" | "functions" | "direct";
|
|
61
|
+
export interface TursoTokenScopeOutput extends TursoTokenScopeInput {
|
|
62
|
+
readMode?: TursoTokenAccessMode | undefined;
|
|
63
|
+
writeMode?: TursoTokenAccessMode | undefined;
|
|
64
|
+
}
|
|
63
65
|
export interface TursoTokenRequestBody {
|
|
64
66
|
database?: string | undefined;
|
|
65
67
|
scope?: TursoTokenScopeInput[] | undefined;
|
package/package.json
CHANGED