@effect-app/infra 2.0.2 → 2.1.1

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 (110) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/_cjs/api/internal/events.cjs +2 -2
  3. package/_cjs/api/internal/events.cjs.map +1 -1
  4. package/_cjs/fileUtil.cjs +48 -0
  5. package/_cjs/fileUtil.cjs.map +1 -0
  6. package/_cjs/services/CUPS.cjs +121 -0
  7. package/_cjs/services/CUPS.cjs.map +1 -0
  8. package/_cjs/services/QueueMaker/SQLQueue.cjs +1 -1
  9. package/_cjs/services/QueueMaker/SQLQueue.cjs.map +1 -1
  10. package/_cjs/services/QueueMaker/memQueue.cjs +1 -1
  11. package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
  12. package/_cjs/services/QueueMaker/sbqueue.cjs +1 -1
  13. package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
  14. package/_cjs/services/Store/Cosmos.cjs +1 -1
  15. package/_cjs/services/Store/Cosmos.cjs.map +1 -1
  16. package/_cjs/services/Store/Disk.cjs +1 -1
  17. package/_cjs/services/adapters/SQL/Model.cjs +500 -0
  18. package/_cjs/services/adapters/SQL/Model.cjs.map +1 -0
  19. package/_cjs/services/adapters/SQL.cjs +11 -0
  20. package/_cjs/services/adapters/SQL.cjs.map +1 -0
  21. package/_cjs/services/adapters/ServiceBus.cjs +76 -0
  22. package/_cjs/services/adapters/ServiceBus.cjs.map +1 -0
  23. package/_cjs/services/adapters/cosmos-client.cjs +18 -0
  24. package/_cjs/services/adapters/cosmos-client.cjs.map +1 -0
  25. package/_cjs/services/adapters/index.cjs +6 -0
  26. package/_cjs/services/adapters/index.cjs.map +1 -0
  27. package/_cjs/services/adapters/logger.cjs +9 -0
  28. package/_cjs/services/adapters/logger.cjs.map +1 -0
  29. package/_cjs/services/adapters/memQueue.cjs +31 -0
  30. package/_cjs/services/adapters/memQueue.cjs.map +1 -0
  31. package/_cjs/services/adapters/mongo-client.cjs +20 -0
  32. package/_cjs/services/adapters/mongo-client.cjs.map +1 -0
  33. package/_cjs/services/adapters/redis-client.cjs +83 -0
  34. package/_cjs/services/adapters/redis-client.cjs.map +1 -0
  35. package/dist/api/internal/events.d.ts.map +1 -1
  36. package/dist/api/internal/events.js +3 -3
  37. package/dist/fileUtil.d.ts +23 -0
  38. package/dist/fileUtil.d.ts.map +1 -0
  39. package/dist/fileUtil.js +41 -0
  40. package/dist/services/CUPS.d.ts +29 -0
  41. package/dist/services/CUPS.d.ts.map +1 -0
  42. package/dist/services/CUPS.js +116 -0
  43. package/dist/services/QueueMaker/SQLQueue.d.ts.map +1 -1
  44. package/dist/services/QueueMaker/SQLQueue.js +2 -2
  45. package/dist/services/QueueMaker/memQueue.d.ts +1 -1
  46. package/dist/services/QueueMaker/memQueue.d.ts.map +1 -1
  47. package/dist/services/QueueMaker/memQueue.js +2 -2
  48. package/dist/services/QueueMaker/sbqueue.d.ts +3 -3
  49. package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
  50. package/dist/services/QueueMaker/sbqueue.js +2 -2
  51. package/dist/services/Repository/ext.d.ts +11 -11
  52. package/dist/services/RepositoryBase.d.ts +6 -6
  53. package/dist/services/Store/Cosmos.d.ts.map +1 -1
  54. package/dist/services/Store/Cosmos.js +2 -2
  55. package/dist/services/Store/Disk.js +2 -2
  56. package/dist/services/adapters/SQL/Model.d.ts +538 -0
  57. package/dist/services/adapters/SQL/Model.d.ts.map +1 -0
  58. package/dist/services/adapters/SQL/Model.js +508 -0
  59. package/dist/services/adapters/SQL.d.ts +2 -0
  60. package/dist/services/adapters/SQL.d.ts.map +1 -0
  61. package/dist/services/adapters/SQL.js +2 -0
  62. package/dist/services/adapters/ServiceBus.d.ts +50 -0
  63. package/dist/services/adapters/ServiceBus.d.ts.map +1 -0
  64. package/dist/services/adapters/ServiceBus.js +73 -0
  65. package/dist/services/adapters/cosmos-client.d.ts +10 -0
  66. package/dist/services/adapters/cosmos-client.d.ts.map +1 -0
  67. package/dist/services/adapters/cosmos-client.js +8 -0
  68. package/dist/services/adapters/index.d.ts +2 -0
  69. package/dist/services/adapters/index.d.ts.map +1 -0
  70. package/dist/services/adapters/index.js +2 -0
  71. package/dist/services/adapters/logger.d.ts +8 -0
  72. package/dist/services/adapters/logger.d.ts.map +1 -0
  73. package/dist/services/adapters/logger.js +3 -0
  74. package/dist/services/adapters/memQueue.d.ts +34 -0
  75. package/dist/services/adapters/memQueue.d.ts.map +1 -0
  76. package/dist/services/adapters/memQueue.js +24 -0
  77. package/dist/services/adapters/mongo-client.d.ts +10 -0
  78. package/dist/services/adapters/mongo-client.d.ts.map +1 -0
  79. package/dist/services/adapters/mongo-client.js +12 -0
  80. package/dist/services/adapters/redis-client.d.ts +29 -0
  81. package/dist/services/adapters/redis-client.d.ts.map +1 -0
  82. package/dist/services/adapters/redis-client.js +93 -0
  83. package/package.json +128 -12
  84. package/src/api/internal/events.ts +2 -2
  85. package/src/fileUtil.ts +85 -0
  86. package/src/services/CUPS.ts +158 -0
  87. package/src/services/QueueMaker/SQLQueue.ts +1 -1
  88. package/src/services/QueueMaker/memQueue.ts +1 -1
  89. package/src/services/QueueMaker/sbqueue.ts +7 -7
  90. package/src/services/Store/Cosmos.ts +1 -1
  91. package/src/services/Store/Disk.ts +1 -1
  92. package/src/services/adapters/SQL/Model.ts +939 -0
  93. package/src/services/adapters/SQL.ts +1 -0
  94. package/src/services/adapters/ServiceBus.ts +140 -0
  95. package/src/services/adapters/cosmos-client.ts +16 -0
  96. package/src/services/adapters/index.ts +0 -0
  97. package/src/services/adapters/logger.ts +3 -0
  98. package/src/services/adapters/memQueue.ts +26 -0
  99. package/src/services/adapters/mongo-client.ts +23 -0
  100. package/src/services/adapters/redis-client.ts +123 -0
  101. package/tsconfig.src.json +0 -3
  102. package/src/services/Store/Redis.ts.bak +0 -88
  103. package/src/services/simpledb/cosmosdb.ts.bak +0 -149
  104. package/src/services/simpledb/diskdb.ts.bak +0 -165
  105. package/src/services/simpledb/index.ts.bak +0 -6
  106. package/src/services/simpledb/memdb.ts.bak +0 -78
  107. package/src/services/simpledb/mongodb.ts.bak +0 -107
  108. package/src/services/simpledb/redisdb.ts.bak +0 -202
  109. package/src/services/simpledb/shared.ts.bak +0 -117
  110. package/src/services/simpledb/simpledb.ts.bak +0 -121
@@ -0,0 +1,508 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
2
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
3
+ /* eslint-disable @typescript-eslint/no-empty-object-type */
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
6
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
7
+ /**
8
+ * @since 1.0.0
9
+ */
10
+ import * as RRX from "@effect/experimental/RequestResolver";
11
+ import * as VariantSchema from "@effect/experimental/VariantSchema";
12
+ import { SqlClient } from "@effect/sql/SqlClient";
13
+ import * as SqlResolver from "@effect/sql/SqlResolver";
14
+ import * as SqlSchema from "@effect/sql/SqlSchema";
15
+ import { randomUUID } from "crypto"; // TODO
16
+ import * as DateTime from "effect/DateTime";
17
+ import * as Effect from "effect/Effect";
18
+ import * as Option from "effect/Option";
19
+ import * as ParseResult from "effect/ParseResult";
20
+ import * as Schema from "effect/Schema";
21
+ const { Class, Field, FieldExcept, FieldOnly, Struct, Union, extract, fieldEvolve, fieldFromKey } = VariantSchema.make({
22
+ variants: ["select", "insert", "update", "json", "jsonCreate", "jsonUpdate"],
23
+ defaultVariant: "select"
24
+ });
25
+ export {
26
+ /**
27
+ * A base class used for creating domain model schemas.
28
+ *
29
+ * It supports common variants for database and JSON apis.
30
+ *
31
+ * @since 1.0.0
32
+ * @category constructors
33
+ * @example
34
+ * import { Schema } from "effect/Schema"
35
+ * import { Model } from "@effect/sql"
36
+ *
37
+ * export const GroupId = Schema.Number.pipe(Schema.brand("GroupId"))
38
+ *
39
+ * export class Group extends Model.Class<Group>("Group")({
40
+ * id: Model.Generated(GroupId),
41
+ * name: Schema.NonEmptyTrimmedString,
42
+ * createdAt: Model.DateTimeInsertFromDate,
43
+ * updatedAt: Model.DateTimeUpdateFromDate
44
+ * }) {}
45
+ *
46
+ * // schema used for selects
47
+ * Group
48
+ *
49
+ * // schema used for inserts
50
+ * Group.insert
51
+ *
52
+ * // schema used for updates
53
+ * Group.update
54
+ *
55
+ * // schema used for json api
56
+ * Group.json
57
+ * Group.jsonCreate
58
+ * Group.jsonUpdate
59
+ *
60
+ * // you can also turn them into classes
61
+ * class GroupJson extends Schema.Class<GroupJson>("GroupJson")(Group.json) {
62
+ * get upperName() {
63
+ * return this.name.toUpperCase()
64
+ * }
65
+ * }
66
+ */
67
+ Class,
68
+ /**
69
+ * @since 1.0.0
70
+ * @category extraction
71
+ */
72
+ extract,
73
+ /**
74
+ * @since 1.0.0
75
+ * @category fields
76
+ */
77
+ Field,
78
+ /**
79
+ * @since 1.0.0
80
+ * @category fields
81
+ */
82
+ fieldEvolve,
83
+ /**
84
+ * @since 1.0.0
85
+ * @category fields
86
+ */
87
+ FieldExcept,
88
+ /**
89
+ * @since 1.0.0
90
+ * @category fields
91
+ */
92
+ fieldFromKey,
93
+ /**
94
+ * @since 1.0.0
95
+ * @category fields
96
+ */
97
+ FieldOnly,
98
+ /**
99
+ * @since 1.0.0
100
+ * @category constructors
101
+ */
102
+ Struct,
103
+ /**
104
+ * @since 1.0.0
105
+ * @category constructors
106
+ */
107
+ Union };
108
+ /**
109
+ * @since 1.0.0
110
+ * @category fields
111
+ */
112
+ export const fields = VariantSchema.fields;
113
+ /**
114
+ * @since 1.0.0
115
+ * @category overrideable
116
+ */
117
+ export const Override = VariantSchema.Override;
118
+ /**
119
+ * A field that represents a column that is generated by the database.
120
+ *
121
+ * It is available for selection and update, but not for insertion.
122
+ *
123
+ * @since 1.0.0
124
+ * @category generated
125
+ */
126
+ export const Generated = (schema) => Field({
127
+ select: schema,
128
+ update: schema,
129
+ json: schema
130
+ });
131
+ /**
132
+ * A field that represents a column that is generated by the application.
133
+ *
134
+ * It is required by the database, but not by the JSON variants.
135
+ *
136
+ * @since 1.0.0
137
+ * @category generated
138
+ */
139
+ export const GeneratedByApp = (schema) => Field({
140
+ select: schema,
141
+ insert: schema,
142
+ update: schema,
143
+ json: schema
144
+ });
145
+ /**
146
+ * A field that represents a sensitive value that should not be exposed in the
147
+ * JSON variants.
148
+ *
149
+ * @since 1.0.0
150
+ * @category sensitive
151
+ */
152
+ export const Sensitive = (schema) => Field({
153
+ select: schema,
154
+ insert: schema,
155
+ update: schema
156
+ });
157
+ /**
158
+ * Convert a field to one that is optional for all variants.
159
+ *
160
+ * For the database variants, it will accept `null`able values.
161
+ * For the JSON variants, it will also accept missing keys.
162
+ *
163
+ * @since 1.0.0
164
+ * @category optional
165
+ */
166
+ export const FieldOption = fieldEvolve({
167
+ select: Schema.OptionFromNullOr,
168
+ insert: Schema.OptionFromNullOr,
169
+ update: Schema.OptionFromNullOr,
170
+ json: Schema.optionalWith({ as: "Option" }),
171
+ jsonCreate: Schema.optionalWith({ as: "Option", nullable: true }),
172
+ jsonUpdate: Schema.optionalWith({ as: "Option", nullable: true })
173
+ });
174
+ /**
175
+ * @since 1.0.0
176
+ * @category date & time
177
+ */
178
+ export const DateTimeFromDate = Schema.transform(Schema.ValidDateFromSelf, Schema.DateTimeUtcFromSelf, {
179
+ decode: DateTime.unsafeFromDate,
180
+ encode: DateTime.toDateUtc
181
+ });
182
+ /**
183
+ * A schema for a `DateTime.Utc` that is serialized as a date string in the
184
+ * format `YYYY-MM-DD`.
185
+ *
186
+ * @since 1.0.0
187
+ * @category date & time
188
+ */
189
+ export const Date = Schema.transformOrFail(Schema.String, Schema.DateTimeUtcFromSelf, {
190
+ decode: (s, _, ast) => DateTime.make(s).pipe(Option.map(DateTime.removeTime), Option.match({
191
+ onNone: () => ParseResult.fail(new ParseResult.Type(ast, s)),
192
+ onSome: (dt) => ParseResult.succeed(dt)
193
+ })),
194
+ encode: (dt) => ParseResult.succeed(DateTime.formatIsoDate(dt))
195
+ });
196
+ /**
197
+ * @since 1.0.0
198
+ * @category date & time
199
+ */
200
+ export const DateWithNow = VariantSchema.Overrideable(Date, Schema.DateTimeUtcFromSelf, {
201
+ generate: Option.match({
202
+ onNone: () => Effect.map(DateTime.now, DateTime.removeTime),
203
+ onSome: (dt) => Effect.succeed(DateTime.removeTime(dt))
204
+ })
205
+ });
206
+ /**
207
+ * @since 1.0.0
208
+ * @category date & time
209
+ */
210
+ export const DateTimeWithNow = VariantSchema.Overrideable(Schema.String, Schema.DateTimeUtcFromSelf, {
211
+ generate: Option.match({
212
+ onNone: () => Effect.map(DateTime.now, DateTime.formatIso),
213
+ onSome: (dt) => Effect.succeed(DateTime.formatIso(dt))
214
+ })
215
+ });
216
+ /**
217
+ * @since 1.0.0
218
+ * @category date & time
219
+ */
220
+ export const DateTimeFromDateWithNow = VariantSchema.Overrideable(Schema.DateFromSelf, Schema.DateTimeUtcFromSelf, {
221
+ generate: Option.match({
222
+ onNone: () => Effect.map(DateTime.now, DateTime.toDateUtc),
223
+ onSome: (dt) => Effect.succeed(DateTime.toDateUtc(dt))
224
+ })
225
+ });
226
+ /**
227
+ * @since 1.0.0
228
+ * @category date & time
229
+ */
230
+ export const DateTimeFromNumberWithNow = VariantSchema.Overrideable(Schema.Number, Schema.DateTimeUtcFromSelf, {
231
+ generate: Option.match({
232
+ onNone: () => Effect.map(DateTime.now, DateTime.toEpochMillis),
233
+ onSome: (dt) => Effect.succeed(DateTime.toEpochMillis(dt))
234
+ })
235
+ });
236
+ /**
237
+ * A field that represents a date-time value that is inserted as the current
238
+ * `DateTime.Utc`. It is serialized as a string for the database.
239
+ *
240
+ * It is omitted from updates and is available for selection.
241
+ *
242
+ * @since 1.0.0
243
+ * @category date & time
244
+ */
245
+ export const DateTimeInsert = Field({
246
+ select: Schema.DateTimeUtc,
247
+ insert: DateTimeWithNow,
248
+ json: Schema.DateTimeUtc
249
+ });
250
+ /**
251
+ * A field that represents a date-time value that is inserted as the current
252
+ * `DateTime.Utc`. It is serialized as a `Date` for the database.
253
+ *
254
+ * It is omitted from updates and is available for selection.
255
+ *
256
+ * @since 1.0.0
257
+ * @category date & time
258
+ */
259
+ export const DateTimeInsertFromDate = Field({
260
+ select: DateTimeFromDate,
261
+ insert: DateTimeFromDateWithNow,
262
+ json: Schema.DateTimeUtc
263
+ });
264
+ /**
265
+ * A field that represents a date-time value that is inserted as the current
266
+ * `DateTime.Utc`. It is serialized as a `number`.
267
+ *
268
+ * It is omitted from updates and is available for selection.
269
+ *
270
+ * @since 1.0.0
271
+ * @category date & time
272
+ */
273
+ export const DateTimeInsertFromNumber = Field({
274
+ select: Schema.DateTimeUtcFromNumber,
275
+ insert: DateTimeFromNumberWithNow,
276
+ json: Schema.DateTimeUtcFromNumber
277
+ });
278
+ /**
279
+ * A field that represents a date-time value that is updated as the current
280
+ * `DateTime.Utc`. It is serialized as a string for the database.
281
+ *
282
+ * It is set to the current `DateTime.Utc` on updates and inserts and is
283
+ * available for selection.
284
+ *
285
+ * @since 1.0.0
286
+ * @category date & time
287
+ */
288
+ export const DateTimeUpdate = Field({
289
+ select: Schema.DateTimeUtc,
290
+ insert: DateTimeWithNow,
291
+ update: DateTimeWithNow,
292
+ json: Schema.DateTimeUtc
293
+ });
294
+ /**
295
+ * A field that represents a date-time value that is updated as the current
296
+ * `DateTime.Utc`. It is serialized as a `Date` for the database.
297
+ *
298
+ * It is set to the current `DateTime.Utc` on updates and inserts and is
299
+ * available for selection.
300
+ *
301
+ * @since 1.0.0
302
+ * @category date & time
303
+ */
304
+ export const DateTimeUpdateFromDate = Field({
305
+ select: DateTimeFromDate,
306
+ insert: DateTimeFromDateWithNow,
307
+ update: DateTimeFromDateWithNow,
308
+ json: Schema.DateTimeUtc
309
+ });
310
+ /**
311
+ * A field that represents a date-time value that is updated as the current
312
+ * `DateTime.Utc`. It is serialized as a `number`.
313
+ *
314
+ * It is set to the current `DateTime.Utc` on updates and inserts and is
315
+ * available for selection.
316
+ *
317
+ * @since 1.0.0
318
+ * @category date & time
319
+ */
320
+ export const DateTimeUpdateFromNumber = Field({
321
+ select: Schema.DateTimeUtcFromNumber,
322
+ insert: DateTimeFromNumberWithNow,
323
+ update: DateTimeFromNumberWithNow,
324
+ json: Schema.DateTimeUtcFromNumber
325
+ });
326
+ /**
327
+ * A field that represents a JSON value stored as text in the database.
328
+ *
329
+ * The "json" variants will use the object schema directly.
330
+ *
331
+ * @since 1.0.0
332
+ * @category json
333
+ */
334
+ export const JsonFromString = (schema) => {
335
+ const parsed = Schema.parseJson(schema);
336
+ return Field({
337
+ select: parsed,
338
+ insert: parsed,
339
+ update: parsed,
340
+ json: schema,
341
+ jsonCreate: schema,
342
+ jsonUpdate: schema
343
+ });
344
+ };
345
+ /**
346
+ * Create a simple CRUD repository from a model.
347
+ *
348
+ * @since 1.0.0
349
+ * @category repository
350
+ */
351
+ export const makeRepository = (Model, options) => Effect.gen(function* () {
352
+ const sql = yield* SqlClient;
353
+ const idSchema = Model.fields[options.idColumn];
354
+ const idColumn = options.idColumn;
355
+ const versionColumn = options.versionColumn;
356
+ // TODO: insert version automatically...
357
+ // I guess we should hide the versionColumn and insert it in the schema instead
358
+ const insertSchema = SqlSchema.single({
359
+ Request: Model.insert,
360
+ Result: Model,
361
+ execute: (request) => sql.onDialectOrElse({
362
+ mysql: () => sql `insert into ${sql(options.tableName)} ${sql.insert(request)};
363
+ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID();`
364
+ .unprepared
365
+ .pipe(Effect.map(([, results]) => results)),
366
+ orElse: () => sql `insert into ${sql(options.tableName)} ${sql.insert(request).returning("*")}`
367
+ })
368
+ });
369
+ const insert = (insert) => insertSchema(insert).pipe(Effect.orDie, Effect.withSpan(`${options.spanPrefix}.insert`, {
370
+ captureStackTrace: false,
371
+ attributes: { insert }
372
+ }));
373
+ const insertVoidSchema = SqlSchema.void({
374
+ Request: Model.insert,
375
+ execute: (request) => sql `insert into ${sql(options.tableName)} ${sql.insert(request)}`
376
+ });
377
+ const insertVoid = (insert) => insertVoidSchema(insert).pipe(Effect.orDie, Effect.withSpan(`${options.spanPrefix}.insertVoid`, {
378
+ captureStackTrace: false,
379
+ attributes: { insert }
380
+ }));
381
+ const updateSchema = SqlSchema.single({
382
+ Request: Model.update,
383
+ Result: Model,
384
+ execute: versionColumn
385
+ ? (request) => sql.onDialectOrElse({
386
+ mysql: () => sql `update ${sql(options.tableName)} set ${sql.update({ ...request, [versionColumn]: randomUUID() }, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]} and ${sql(versionColumn)} = ${request[versionColumn]};
387
+ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idColumn]};`
388
+ .unprepared
389
+ .pipe(Effect.map(([, results]) => results)),
390
+ orElse: () => sql `update ${sql(options.tableName)} set ${sql.update({ ...request, [versionColumn]: randomUUID() }, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]} and ${sql(versionColumn)} = ${request[versionColumn]} returning *`
391
+ })
392
+ : (request) => sql.onDialectOrElse({
393
+ mysql: () => sql `update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]};
394
+ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idColumn]};`
395
+ .unprepared
396
+ .pipe(Effect.map(([, results]) => results)),
397
+ orElse: () => sql `update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]} returning *`
398
+ })
399
+ });
400
+ const update = (update) => updateSchema(update).pipe(Effect.orDie, Effect.withSpan(`${options.spanPrefix}.update`, {
401
+ captureStackTrace: false,
402
+ attributes: { update }
403
+ }));
404
+ const updateVoidSchema = SqlSchema.void({
405
+ Request: Model.update,
406
+ execute: versionColumn
407
+ ? (request) => sql `update ${sql(options.tableName)} set ${sql.update({ ...request, [versionColumn]: randomUUID() }, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]} and ${sql(versionColumn)} = ${request[versionColumn]}`
408
+ : (request) => sql `update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]}`
409
+ });
410
+ const updateVoid = (update) => updateVoidSchema(update).pipe(Effect.orDie, Effect.withSpan(`${options.spanPrefix}.updateVoid`, {
411
+ captureStackTrace: false,
412
+ attributes: { update }
413
+ }));
414
+ const findByIdSchema = SqlSchema.findOne({
415
+ Request: idSchema,
416
+ Result: Model,
417
+ execute: (id) => sql `select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
418
+ });
419
+ const findById = (id) => findByIdSchema(id).pipe(Effect.orDie, Effect.withSpan(`${options.spanPrefix}.findById`, {
420
+ captureStackTrace: false,
421
+ attributes: { id }
422
+ }));
423
+ const deleteSchema = SqlSchema.void({
424
+ Request: idSchema,
425
+ execute: (id) => sql `delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
426
+ });
427
+ const delete_ = (id) => deleteSchema(id).pipe(Effect.orDie, Effect.withSpan(`${options.spanPrefix}.delete`, {
428
+ captureStackTrace: false,
429
+ attributes: { id }
430
+ }));
431
+ return { insert, insertVoid, update, updateVoid, findById, delete: delete_ };
432
+ });
433
+ /**
434
+ * Create some simple data loaders from a model.
435
+ *
436
+ * @since 1.0.0
437
+ * @category repository
438
+ */
439
+ export const makeDataLoaders = (Model, options) => Effect.gen(function* () {
440
+ const sql = yield* SqlClient;
441
+ const idSchema = Model.fields[options.idColumn];
442
+ const idColumn = options.idColumn;
443
+ const insertResolver = yield* SqlResolver.ordered(`${options.spanPrefix}/insert`, {
444
+ Request: Model.insert,
445
+ Result: Model,
446
+ execute: (request) => sql.onDialectOrElse({
447
+ mysql: () => Effect.forEach(request, (request) => sql `insert into ${sql(options.tableName)} ${sql.insert(request)};
448
+ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID();`
449
+ .unprepared
450
+ .pipe(Effect.map(([, results]) => results)), { concurrency: 10 }),
451
+ orElse: () => sql `insert into ${sql(options.tableName)} ${sql.insert(request).returning("*")}`
452
+ })
453
+ });
454
+ const insertLoader = yield* RRX.dataLoader(insertResolver, {
455
+ window: options.window,
456
+ maxBatchSize: options.maxBatchSize
457
+ });
458
+ const insertExecute = insertResolver.makeExecute(insertLoader);
459
+ const insert = (insert) => insertExecute(insert).pipe(Effect.orDie, Effect.withSpan(`${options.spanPrefix}.insert`, {
460
+ captureStackTrace: false,
461
+ attributes: { insert }
462
+ }));
463
+ const insertVoidResolver = yield* SqlResolver.void(`${options.spanPrefix}/insertVoid`, {
464
+ Request: Model.insert,
465
+ execute: (request) => sql `insert into ${sql(options.tableName)} ${sql.insert(request)}`
466
+ });
467
+ const insertVoidLoader = yield* RRX.dataLoader(insertVoidResolver, {
468
+ window: options.window,
469
+ maxBatchSize: options.maxBatchSize
470
+ });
471
+ const insertVoidExecute = insertVoidResolver.makeExecute(insertVoidLoader);
472
+ const insertVoid = (insert) => insertVoidExecute(insert).pipe(Effect.orDie, Effect.withSpan(`${options.spanPrefix}.insertVoid`, {
473
+ captureStackTrace: false,
474
+ attributes: { insert }
475
+ }));
476
+ const findByIdResolver = yield* SqlResolver.findById(`${options.spanPrefix}/findById`, {
477
+ Id: idSchema,
478
+ Result: Model,
479
+ ResultId(request) {
480
+ return request[idColumn];
481
+ },
482
+ execute: (ids) => sql `select * from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
483
+ });
484
+ const findByIdLoader = yield* RRX.dataLoader(findByIdResolver, {
485
+ window: options.window,
486
+ maxBatchSize: options.maxBatchSize
487
+ });
488
+ const findByIdExecute = findByIdResolver.makeExecute(findByIdLoader);
489
+ const findById = (id) => findByIdExecute(id).pipe(Effect.orDie, Effect.withSpan(`${options.spanPrefix}.findById`, {
490
+ captureStackTrace: false,
491
+ attributes: { id }
492
+ }));
493
+ const deleteResolver = yield* SqlResolver.void(`${options.spanPrefix}/delete`, {
494
+ Request: idSchema,
495
+ execute: (ids) => sql `delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
496
+ });
497
+ const deleteLoader = yield* RRX.dataLoader(deleteResolver, {
498
+ window: options.window,
499
+ maxBatchSize: options.maxBatchSize
500
+ });
501
+ const deleteExecute = deleteResolver.makeExecute(deleteLoader);
502
+ const delete_ = (id) => deleteExecute(id).pipe(Effect.orDie, Effect.withSpan(`${options.spanPrefix}.delete`, {
503
+ captureStackTrace: false,
504
+ attributes: { id }
505
+ }));
506
+ return { insert, insertVoid, findById, delete: delete_ };
507
+ });
508
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvYWRhcHRlcnMvU1FML01vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCw0REFBNEQ7QUFDNUQsNERBQTREO0FBQzVELHVEQUF1RDtBQUN2RCwwREFBMEQ7QUFDMUQsd0RBQXdEO0FBQ3hEOztHQUVHO0FBQ0gsT0FBTyxLQUFLLEdBQUcsTUFBTSxzQ0FBc0MsQ0FBQTtBQUMzRCxPQUFPLEtBQUssYUFBYSxNQUFNLG9DQUFvQyxDQUFBO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNqRCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFBO0FBQ3RELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUE7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQSxDQUFDLE9BQU87QUFFM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQTtBQUUzQyxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQTtBQUN2QyxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQTtBQUN2QyxPQUFPLEtBQUssV0FBVyxNQUFNLG9CQUFvQixDQUFBO0FBQ2pELE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFBO0FBR3ZDLE1BQU0sRUFDSixLQUFLLEVBQ0wsS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFDTCxPQUFPLEVBQ1AsV0FBVyxFQUNYLFlBQVksRUFDYixHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUM7SUFDNUUsY0FBYyxFQUFFLFFBQVE7Q0FDekIsQ0FBQyxDQUFBO0FB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
@@ -0,0 +1,2 @@
1
+ export * as Model from "./SQL/Model.js";
2
+ //# sourceMappingURL=SQL.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQL.d.ts","sourceRoot":"","sources":["../../../src/services/adapters/SQL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * as Model from "./SQL/Model.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1FMLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2FkYXB0ZXJzL1NRTC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFBIn0=
@@ -0,0 +1,50 @@
1
+ import type { OperationOptionsBase, ProcessErrorArgs, ServiceBusMessage, ServiceBusMessageBatch, ServiceBusReceivedMessage, ServiceBusReceiver, ServiceBusSender } from "@azure/service-bus";
2
+ import { ServiceBusClient } from "@azure/service-bus";
3
+ import type { Scope } from "effect-app";
4
+ import { Context, Effect, Layer } from "effect-app";
5
+ export declare const LiveServiceBusClient: (url: string) => Layer.Layer<ServiceBusClient, never, never>;
6
+ export declare const Sender: Context.Tag<ServiceBusSender, ServiceBusSender>;
7
+ export declare function LiveSender(queueName: string): Layer.Layer<ServiceBusSender, never, ServiceBusClient>;
8
+ declare const ServiceBusReceiverFactory_base: (abstract new (service: {
9
+ make: (waitTillEmpty: Effect<void>) => Effect<ServiceBusReceiver, never, Scope>;
10
+ makeSession: (sessionId: string, waitTillEmpty: Effect<void>) => Effect<ServiceBusReceiver, never, Scope>;
11
+ }) => Readonly<{
12
+ make: (waitTillEmpty: Effect<void>) => Effect<ServiceBusReceiver, never, Scope>;
13
+ makeSession: (sessionId: string, waitTillEmpty: Effect<void>) => Effect<ServiceBusReceiver, never, Scope>;
14
+ }> & Context.TagClassShape<"ServiceBusReceiverFactory", {
15
+ make: (waitTillEmpty: Effect<void>) => Effect<ServiceBusReceiver, never, Scope>;
16
+ makeSession: (sessionId: string, waitTillEmpty: Effect<void>) => Effect<ServiceBusReceiver, never, Scope>;
17
+ }>) & {
18
+ toLayer: <E, R>(eff: Effect.Effect<Omit<ServiceBusReceiverFactory, keyof Context.TagClassShape<any, any>>, E, R>) => Layer.Layer<ServiceBusReceiverFactory, E, R>;
19
+ toLayerScoped: <E, R_1>(eff: Effect.Effect<Omit<ServiceBusReceiverFactory, keyof Context.TagClassShape<any, any>>, E, R_1>) => Layer.Layer<ServiceBusReceiverFactory, E, Exclude<R_1, Scope.Scope>>;
20
+ of: (service: Omit<ServiceBusReceiverFactory, keyof Context.TagClassShape<any, any>>) => ServiceBusReceiverFactory;
21
+ } & Context.Tag<ServiceBusReceiverFactory, ServiceBusReceiverFactory> & {
22
+ make: (waitTillEmpty: Effect<void>) => Effect.Effect<ServiceBusReceiver, never, Scope.Scope | ServiceBusReceiverFactory>;
23
+ makeSession: (sessionId: string, waitTillEmpty: Effect<void>) => Effect.Effect<ServiceBusReceiver, never, Scope.Scope | ServiceBusReceiverFactory>;
24
+ } & {
25
+ use: <X>(body: (_: {
26
+ make: (waitTillEmpty: Effect<void>) => Effect<ServiceBusReceiver, never, Scope>;
27
+ makeSession: (sessionId: string, waitTillEmpty: Effect<void>) => Effect<ServiceBusReceiver, never, Scope>;
28
+ }) => X) => X extends Effect.Effect<infer A_1, infer E_1, infer R_3> ? Effect.Effect<A_1, E_1, R_3 | ServiceBusReceiverFactory> : Effect.Effect<X, never, ServiceBusReceiverFactory>;
29
+ };
30
+ export declare class ServiceBusReceiverFactory extends ServiceBusReceiverFactory_base {
31
+ static readonly Live: (queueName: string) => Layer.Layer<ServiceBusReceiverFactory, never, ServiceBusClient>;
32
+ }
33
+ export declare function sendMessages(messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch, options?: OperationOptionsBase): Effect.Effect<void, never, ServiceBusSender>;
34
+ export declare function subscribe<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>, sessionId?: string): Effect.Effect<void, never, Scope.Scope | ServiceBusReceiverFactory | RMsg | RErr>;
35
+ export interface MessageHandlers<RMsg, RErr> {
36
+ /**
37
+ * Handler that processes messages from service bus.
38
+ *
39
+ * @param message - A message received from Service Bus.
40
+ */
41
+ processMessage(message: ServiceBusReceivedMessage): Effect<void, never, RMsg>;
42
+ /**
43
+ * Handler that processes errors that occur during receiving.
44
+ * @param args - The error and additional context to indicate where
45
+ * the error originated.
46
+ */
47
+ processError(args: ProcessErrorArgs): Effect<void, never, RErr>;
48
+ }
49
+ export {};
50
+ //# sourceMappingURL=ServiceBus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceBus.d.ts","sourceRoot":"","sources":["../../../src/services/adapters/ServiceBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAS,OAAO,EAAE,MAAM,EAAkB,KAAK,EAAE,MAAM,YAAY,CAAA;AAW1E,eAAO,MAAM,oBAAoB,QAAS,MAAM,gDAA0C,CAAA;AAY1F,eAAO,MAAM,MAAM,iDAA2D,CAAA;AAE9E,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,0DAG3C;;UAkBO,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC;iBAClE,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC;;UADnG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC;iBAClE,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC;;UADnG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC;iBAClE,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC;;;;;;;;;;cADnG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC;qBAClE,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC;;;AAJ3G,qBAAa,yBAA0B,SAAQ,8BAK3C;IACF,MAAM,CAAC,QAAQ,CAAC,IAAI,cAAe,MAAM,qEAMlC;CACR;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,GAAG,sBAAsB,EAC1E,OAAO,CAAC,EAAE,oBAAoB,gDAM/B;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,qFA6C3F;AAED,MAAM,WAAW,eAAe,CAAC,IAAI,EAAE,IAAI;IACzC;;;;OAIG;IACH,cAAc,CAAC,OAAO,EAAE,yBAAyB,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAC7E;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;CAChE"}