dfx 1.0.5 → 1.0.6

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 (237) hide show
  1. package/dist/version.js +1 -1
  2. package/package.json +5 -5
  3. package/src/version.ts +1 -1
  4. package/dist/Cache/driver.d.ts +0 -24
  5. package/dist/Cache/driver.d.ts.map +0 -1
  6. package/dist/Cache/memory.d.ts +0 -5
  7. package/dist/Cache/memory.d.ts.map +0 -1
  8. package/dist/Cache/memoryTTL.d.ts +0 -23
  9. package/dist/Cache/memoryTTL.d.ts.map +0 -1
  10. package/dist/Cache/prelude.d.ts +0 -32
  11. package/dist/Cache/prelude.d.ts.map +0 -1
  12. package/dist/Cache.d.ts +0 -81
  13. package/dist/Cache.d.ts.map +0 -1
  14. package/dist/DiscordConfig.d.ts +0 -35
  15. package/dist/DiscordConfig.d.ts.map +0 -1
  16. package/dist/DiscordGateway/DiscordWS.d.ts +0 -37
  17. package/dist/DiscordGateway/DiscordWS.d.ts.map +0 -1
  18. package/dist/DiscordGateway/Messaging.d.ts +0 -587
  19. package/dist/DiscordGateway/Messaging.d.ts.map +0 -1
  20. package/dist/DiscordGateway/Shard/StateStore.d.ts +0 -24
  21. package/dist/DiscordGateway/Shard/StateStore.d.ts.map +0 -1
  22. package/dist/DiscordGateway/Shard/heartbeats.d.ts +0 -8
  23. package/dist/DiscordGateway/Shard/heartbeats.d.ts.map +0 -1
  24. package/dist/DiscordGateway/Shard/identify.d.ts +0 -12
  25. package/dist/DiscordGateway/Shard/identify.d.ts.map +0 -1
  26. package/dist/DiscordGateway/Shard/sendEvents.d.ts +0 -8
  27. package/dist/DiscordGateway/Shard/sendEvents.d.ts.map +0 -1
  28. package/dist/DiscordGateway/Shard/utils.d.ts +0 -6
  29. package/dist/DiscordGateway/Shard/utils.d.ts.map +0 -1
  30. package/dist/DiscordGateway/Shard.d.ts +0 -29
  31. package/dist/DiscordGateway/Shard.d.ts.map +0 -1
  32. package/dist/DiscordGateway/ShardStore.d.ts +0 -19
  33. package/dist/DiscordGateway/ShardStore.d.ts.map +0 -1
  34. package/dist/DiscordGateway/Sharder.d.ts +0 -14
  35. package/dist/DiscordGateway/Sharder.d.ts.map +0 -1
  36. package/dist/DiscordGateway.d.ts +0 -33
  37. package/dist/DiscordGateway.d.ts.map +0 -1
  38. package/dist/DiscordREST/Generated.d.ts +0 -5577
  39. package/dist/DiscordREST/Generated.d.ts.map +0 -1
  40. package/dist/DiscordREST/utils.d.ts +0 -14
  41. package/dist/DiscordREST/utils.d.ts.map +0 -1
  42. package/dist/DiscordREST.d.ts +0 -22
  43. package/dist/DiscordREST.d.ts.map +0 -1
  44. package/dist/Helpers/flags.d.ts +0 -28
  45. package/dist/Helpers/flags.d.ts.map +0 -1
  46. package/dist/Helpers/intents.d.ts +0 -25
  47. package/dist/Helpers/intents.d.ts.map +0 -1
  48. package/dist/Helpers/interactions.d.ts +0 -116
  49. package/dist/Helpers/interactions.d.ts.map +0 -1
  50. package/dist/Helpers/members.d.ts +0 -10
  51. package/dist/Helpers/members.d.ts.map +0 -1
  52. package/dist/Helpers/permissions.d.ts +0 -42
  53. package/dist/Helpers/permissions.d.ts.map +0 -1
  54. package/dist/Helpers/ui.d.ts +0 -105
  55. package/dist/Helpers/ui.d.ts.map +0 -1
  56. package/dist/Interactions/builder.d.ts +0 -48
  57. package/dist/Interactions/builder.d.ts.map +0 -1
  58. package/dist/Interactions/commandHelper.d.ts +0 -83
  59. package/dist/Interactions/commandHelper.d.ts.map +0 -1
  60. package/dist/Interactions/context.d.ts +0 -53
  61. package/dist/Interactions/context.d.ts.map +0 -1
  62. package/dist/Interactions/definitions.d.ts +0 -43
  63. package/dist/Interactions/definitions.d.ts.map +0 -1
  64. package/dist/Interactions/error.d.ts +0 -2
  65. package/dist/Interactions/error.d.ts.map +0 -1
  66. package/dist/Interactions/gateway.d.ts +0 -20
  67. package/dist/Interactions/gateway.d.ts.map +0 -1
  68. package/dist/Interactions/handlers.d.ts +0 -15
  69. package/dist/Interactions/handlers.d.ts.map +0 -1
  70. package/dist/Interactions/index.d.ts +0 -17
  71. package/dist/Interactions/index.d.ts.map +0 -1
  72. package/dist/Interactions/utils.d.ts +0 -61
  73. package/dist/Interactions/utils.d.ts.map +0 -1
  74. package/dist/Interactions/webhook.d.ts +0 -71
  75. package/dist/Interactions/webhook.d.ts.map +0 -1
  76. package/dist/LICENSE +0 -21
  77. package/dist/README.md +0 -66
  78. package/dist/RateLimit/memory.d.ts +0 -3
  79. package/dist/RateLimit/memory.d.ts.map +0 -1
  80. package/dist/RateLimit/utils.d.ts +0 -3
  81. package/dist/RateLimit/utils.d.ts.map +0 -1
  82. package/dist/RateLimit.d.ts +0 -30
  83. package/dist/RateLimit.d.ts.map +0 -1
  84. package/dist/gateway.d.ts +0 -19
  85. package/dist/gateway.d.ts.map +0 -1
  86. package/dist/index.d.ts +0 -18
  87. package/dist/index.d.ts.map +0 -1
  88. package/dist/mjs/Cache/driver.mjs +0 -3
  89. package/dist/mjs/Cache/driver.mjs.map +0 -1
  90. package/dist/mjs/Cache/memory.mjs +0 -48
  91. package/dist/mjs/Cache/memory.mjs.map +0 -1
  92. package/dist/mjs/Cache/memoryTTL.mjs +0 -119
  93. package/dist/mjs/Cache/memoryTTL.mjs.map +0 -1
  94. package/dist/mjs/Cache/prelude.mjs +0 -131
  95. package/dist/mjs/Cache/prelude.mjs.map +0 -1
  96. package/dist/mjs/Cache.mjs +0 -90
  97. package/dist/mjs/Cache.mjs.map +0 -1
  98. package/dist/mjs/DiscordConfig.mjs +0 -32
  99. package/dist/mjs/DiscordConfig.mjs.map +0 -1
  100. package/dist/mjs/DiscordGateway/DiscordWS.mjs +0 -77
  101. package/dist/mjs/DiscordGateway/DiscordWS.mjs.map +0 -1
  102. package/dist/mjs/DiscordGateway/Messaging.mjs +0 -35
  103. package/dist/mjs/DiscordGateway/Messaging.mjs.map +0 -1
  104. package/dist/mjs/DiscordGateway/Shard/StateStore.mjs +0 -41
  105. package/dist/mjs/DiscordGateway/Shard/StateStore.mjs.map +0 -1
  106. package/dist/mjs/DiscordGateway/Shard/heartbeats.mjs +0 -25
  107. package/dist/mjs/DiscordGateway/Shard/heartbeats.mjs.map +0 -1
  108. package/dist/mjs/DiscordGateway/Shard/identify.mjs +0 -29
  109. package/dist/mjs/DiscordGateway/Shard/identify.mjs.map +0 -1
  110. package/dist/mjs/DiscordGateway/Shard/sendEvents.mjs +0 -26
  111. package/dist/mjs/DiscordGateway/Shard/sendEvents.mjs.map +0 -1
  112. package/dist/mjs/DiscordGateway/Shard/utils.mjs +0 -3
  113. package/dist/mjs/DiscordGateway/Shard/utils.mjs.map +0 -1
  114. package/dist/mjs/DiscordGateway/Shard.mjs +0 -147
  115. package/dist/mjs/DiscordGateway/Shard.mjs.map +0 -1
  116. package/dist/mjs/DiscordGateway/ShardStore.mjs +0 -24
  117. package/dist/mjs/DiscordGateway/ShardStore.mjs.map +0 -1
  118. package/dist/mjs/DiscordGateway/Sharder.mjs +0 -67
  119. package/dist/mjs/DiscordGateway/Sharder.mjs.map +0 -1
  120. package/dist/mjs/DiscordGateway.mjs +0 -21
  121. package/dist/mjs/DiscordGateway.mjs.map +0 -1
  122. package/dist/mjs/DiscordREST/Generated.mjs +0 -2471
  123. package/dist/mjs/DiscordREST/Generated.mjs.map +0 -1
  124. package/dist/mjs/DiscordREST/utils.mjs +0 -21
  125. package/dist/mjs/DiscordREST/utils.mjs.map +0 -1
  126. package/dist/mjs/DiscordREST.mjs +0 -119
  127. package/dist/mjs/DiscordREST.mjs.map +0 -1
  128. package/dist/mjs/Helpers/flags.mjs +0 -45
  129. package/dist/mjs/Helpers/flags.mjs.map +0 -1
  130. package/dist/mjs/Helpers/intents.mjs +0 -27
  131. package/dist/mjs/Helpers/intents.mjs.map +0 -1
  132. package/dist/mjs/Helpers/interactions.mjs +0 -115
  133. package/dist/mjs/Helpers/interactions.mjs.map +0 -1
  134. package/dist/mjs/Helpers/members.mjs +0 -9
  135. package/dist/mjs/Helpers/members.mjs.map +0 -1
  136. package/dist/mjs/Helpers/permissions.mjs +0 -84
  137. package/dist/mjs/Helpers/permissions.mjs.map +0 -1
  138. package/dist/mjs/Helpers/ui.mjs +0 -137
  139. package/dist/mjs/Helpers/ui.mjs.map +0 -1
  140. package/dist/mjs/Interactions/builder.mjs +0 -56
  141. package/dist/mjs/Interactions/builder.mjs.map +0 -1
  142. package/dist/mjs/Interactions/commandHelper.mjs +0 -49
  143. package/dist/mjs/Interactions/commandHelper.mjs.map +0 -1
  144. package/dist/mjs/Interactions/context.mjs +0 -28
  145. package/dist/mjs/Interactions/context.mjs.map +0 -1
  146. package/dist/mjs/Interactions/definitions.mjs +0 -51
  147. package/dist/mjs/Interactions/definitions.mjs.map +0 -1
  148. package/dist/mjs/Interactions/error.mjs +0 -2
  149. package/dist/mjs/Interactions/error.mjs.map +0 -1
  150. package/dist/mjs/Interactions/gateway.mjs +0 -82
  151. package/dist/mjs/Interactions/gateway.mjs.map +0 -1
  152. package/dist/mjs/Interactions/handlers.mjs +0 -64
  153. package/dist/mjs/Interactions/handlers.mjs.map +0 -1
  154. package/dist/mjs/Interactions/index.mjs +0 -11
  155. package/dist/mjs/Interactions/index.mjs.map +0 -1
  156. package/dist/mjs/Interactions/utils.mjs +0 -26
  157. package/dist/mjs/Interactions/utils.mjs.map +0 -1
  158. package/dist/mjs/Interactions/webhook.mjs +0 -75
  159. package/dist/mjs/Interactions/webhook.mjs.map +0 -1
  160. package/dist/mjs/RateLimit/memory.mjs +0 -39
  161. package/dist/mjs/RateLimit/memory.mjs.map +0 -1
  162. package/dist/mjs/RateLimit/utils.mjs +0 -18
  163. package/dist/mjs/RateLimit/utils.mjs.map +0 -1
  164. package/dist/mjs/RateLimit.mjs +0 -28
  165. package/dist/mjs/RateLimit.mjs.map +0 -1
  166. package/dist/mjs/gateway.mjs +0 -19
  167. package/dist/mjs/gateway.mjs.map +0 -1
  168. package/dist/mjs/index.mjs +0 -18
  169. package/dist/mjs/index.mjs.map +0 -1
  170. package/dist/mjs/types.mjs +0 -356
  171. package/dist/mjs/types.mjs.map +0 -1
  172. package/dist/mjs/utils/Effect.mjs +0 -44
  173. package/dist/mjs/utils/Effect.mjs.map +0 -1
  174. package/dist/mjs/version.mjs +0 -2
  175. package/dist/mjs/version.mjs.map +0 -1
  176. package/dist/mjs/webhooks.mjs +0 -6
  177. package/dist/mjs/webhooks.mjs.map +0 -1
  178. package/dist/package.json +0 -48
  179. package/dist/src/Cache/driver.ts +0 -37
  180. package/dist/src/Cache/memory.ts +0 -83
  181. package/dist/src/Cache/memoryTTL.ts +0 -225
  182. package/dist/src/Cache/prelude.ts +0 -279
  183. package/dist/src/Cache.ts +0 -261
  184. package/dist/src/DiscordConfig.ts +0 -67
  185. package/dist/src/DiscordGateway/DiscordWS.ts +0 -157
  186. package/dist/src/DiscordGateway/Messaging.ts +0 -71
  187. package/dist/src/DiscordGateway/Shard/StateStore.ts +0 -72
  188. package/dist/src/DiscordGateway/Shard/heartbeats.ts +0 -60
  189. package/dist/src/DiscordGateway/Shard/identify.ts +0 -50
  190. package/dist/src/DiscordGateway/Shard/sendEvents.ts +0 -43
  191. package/dist/src/DiscordGateway/Shard/utils.ts +0 -13
  192. package/dist/src/DiscordGateway/Shard.ts +0 -205
  193. package/dist/src/DiscordGateway/ShardStore.ts +0 -42
  194. package/dist/src/DiscordGateway/Sharder.ts +0 -118
  195. package/dist/src/DiscordGateway.ts +0 -79
  196. package/dist/src/DiscordREST/Generated.ts +0 -10832
  197. package/dist/src/DiscordREST/utils.ts +0 -42
  198. package/dist/src/DiscordREST.ts +0 -256
  199. package/dist/src/Helpers/flags.ts +0 -73
  200. package/dist/src/Helpers/intents.ts +0 -35
  201. package/dist/src/Helpers/interactions.ts +0 -317
  202. package/dist/src/Helpers/members.ts +0 -18
  203. package/dist/src/Helpers/permissions.ts +0 -145
  204. package/dist/src/Helpers/ui.ts +0 -253
  205. package/dist/src/Interactions/builder.ts +0 -171
  206. package/dist/src/Interactions/commandHelper.ts +0 -231
  207. package/dist/src/Interactions/context.ts +0 -104
  208. package/dist/src/Interactions/definitions.ts +0 -144
  209. package/dist/src/Interactions/error.ts +0 -3
  210. package/dist/src/Interactions/gateway.ts +0 -193
  211. package/dist/src/Interactions/handlers.ts +0 -108
  212. package/dist/src/Interactions/index.ts +0 -30
  213. package/dist/src/Interactions/utils.ts +0 -93
  214. package/dist/src/Interactions/webhook.ts +0 -204
  215. package/dist/src/RateLimit/memory.ts +0 -63
  216. package/dist/src/RateLimit/utils.ts +0 -28
  217. package/dist/src/RateLimit.ts +0 -90
  218. package/dist/src/gateway.ts +0 -50
  219. package/dist/src/index.ts +0 -44
  220. package/dist/src/types.ts +0 -3090
  221. package/dist/src/utils/Effect.ts +0 -65
  222. package/dist/src/version.ts +0 -1
  223. package/dist/src/webhooks.ts +0 -25
  224. package/dist/tsconfig.base.json +0 -54
  225. package/dist/tsconfig.build.json +0 -10
  226. package/dist/tsconfig.examples.json +0 -10
  227. package/dist/tsconfig.json +0 -14
  228. package/dist/tsconfig.madge.json +0 -12
  229. package/dist/tsconfig.test.json +0 -10
  230. package/dist/types.d.ts +0 -2458
  231. package/dist/types.d.ts.map +0 -1
  232. package/dist/utils/Effect.d.ts +0 -5
  233. package/dist/utils/Effect.d.ts.map +0 -1
  234. package/dist/version.d.ts +0 -2
  235. package/dist/version.d.ts.map +0 -1
  236. package/dist/webhooks.d.ts +0 -8
  237. package/dist/webhooks.d.ts.map +0 -1
@@ -1,225 +0,0 @@
1
- import type { CacheDriver, ParentCacheDriver } from "./driver.ts"
2
- import { createDriver, createParentDriver } from "./driver.ts"
3
- import * as Array from "effect/Array"
4
- import * as Duration from "effect/Duration"
5
- import * as Effect from "effect/Effect"
6
- import * as Option from "effect/Option"
7
-
8
- declare const global: typeof globalThis & {
9
- gc?: () => void
10
- }
11
-
12
- export interface MemoryTTLOpts {
13
- /** The approx. number of milliseconds to keep items */
14
- readonly ttl: Duration.Duration
15
-
16
- /**
17
- * How often items should be cleared.
18
- */
19
- readonly resolution?: Duration.Duration
20
-
21
- /**
22
- * What sweep strategy to use.
23
- *
24
- * "activity" means the TTL is reset for every `set` OR `get` operation
25
- * "usage" means the TTL is only reset for the `get` operation
26
- *
27
- * Defaults to "usage"
28
- */
29
- readonly strategy?: "activity" | "usage" | "expiry"
30
- }
31
-
32
- interface CacheItem<T> {
33
- resource: T
34
- }
35
-
36
- interface TTLBucket<T> {
37
- readonly expires: number
38
- readonly items: Array<CacheItem<T>>
39
- }
40
-
41
- const make = <T>({
42
- resolution = Duration.minutes(1),
43
- strategy = "usage",
44
- ttl,
45
- }: MemoryTTLOpts): CacheDriver<never, T> => {
46
- const resolutionMs = Duration.toMillis(resolution)
47
- const additionalMilliseconds =
48
- (Math.floor(Duration.toMillis(ttl) / resolutionMs) + 1) * resolutionMs
49
-
50
- const items = new Map<string, WeakRef<CacheItem<T>>>()
51
- const buckets: Array<TTLBucket<T>> = []
52
-
53
- const refreshTTL = (item: CacheItem<T>) => {
54
- const now = Date.now()
55
- const remainder = now % resolutionMs
56
- const expires = now - remainder + additionalMilliseconds
57
- let currentBucket = buckets[buckets.length - 1]
58
-
59
- if ((currentBucket?.expires || 0) < expires) {
60
- currentBucket = {
61
- expires,
62
- items: [],
63
- }
64
- buckets.push(currentBucket)
65
- }
66
-
67
- currentBucket.items.push(item)
68
- }
69
-
70
- const sweep = () => {
71
- const now = Date.now()
72
- const remainder = now % resolutionMs
73
- const currentExpires = now - remainder
74
-
75
- while (buckets.length && buckets[0].expires <= currentExpires) {
76
- buckets.shift()!
77
- }
78
-
79
- if (global.gc) {
80
- global.gc()
81
- }
82
- }
83
-
84
- const getSync = (resourceId: string) => {
85
- const ref = items.get(resourceId)
86
- if (!ref) return undefined
87
-
88
- const item = ref.deref()
89
- if (!item) {
90
- items.delete(resourceId)
91
- return undefined
92
- }
93
-
94
- if (strategy !== "expiry") {
95
- refreshTTL(item)
96
- }
97
-
98
- return item.resource
99
- }
100
-
101
- return createDriver({
102
- size: Effect.sync(() => items.size),
103
-
104
- get: resourceId =>
105
- Effect.sync(
106
- (): Option.Option<T> => Option.fromNullishOr(getSync(resourceId)),
107
- ),
108
-
109
- refreshTTL: id =>
110
- Effect.sync(() => {
111
- getSync(id)
112
- }),
113
-
114
- set: (resourceId, resource) =>
115
- Effect.sync(() => {
116
- const item = items.get(resourceId)?.deref()
117
-
118
- if (item && strategy !== "activity") {
119
- item.resource = resource
120
- } else {
121
- const newItem = { resource }
122
- refreshTTL(newItem)
123
- items.set(resourceId, new WeakRef(newItem))
124
- }
125
- }),
126
-
127
- delete: resourceId =>
128
- Effect.sync(() => {
129
- items.delete(resourceId)
130
- }),
131
-
132
- run: Effect.sync(sweep).pipe(
133
- Effect.delay(Duration.times(resolution, 0.5)),
134
- Effect.forever,
135
- ),
136
- })
137
- }
138
-
139
- export const create = <T>(
140
- opts: MemoryTTLOpts,
141
- ): Effect.Effect<CacheDriver<never, T>> => Effect.sync(() => make<T>(opts))
142
-
143
- export const createWithParent = <T>(
144
- opts: MemoryTTLOpts,
145
- ): Effect.Effect<ParentCacheDriver<never, T>> =>
146
- Effect.sync(() => {
147
- const store = make<T>(opts)
148
- const parentIds = new Map<string, Set<string>>()
149
-
150
- return createParentDriver({
151
- size: store.size,
152
- sizeForParent: parentId =>
153
- Effect.sync(() => parentIds.get(parentId)?.size ?? 0),
154
-
155
- refreshTTL: (_, id) => store.refreshTTL(id),
156
-
157
- get: (_, id) => store.get(id),
158
-
159
- getForParent: parentId =>
160
- Effect.fromNullishOr(parentIds.get(parentId)).pipe(
161
- Effect.flatMap(ids =>
162
- Effect.forEach(
163
- ids,
164
- id =>
165
- store.get(id).pipe(
166
- Effect.tap(item =>
167
- Effect.sync(() => {
168
- if (item._tag === "None") {
169
- ids.delete(id)
170
- }
171
- }),
172
- ),
173
- Effect.map(item => [id, item] as const),
174
- ),
175
- { concurrency: "unbounded" },
176
- ),
177
- ),
178
- Effect.map(
179
- Array.reduce(new Map<string, T>(), (acc, [id, item]) =>
180
- item._tag === "Some" ? acc.set(id, item.value) : acc,
181
- ),
182
- ),
183
- Effect.catchNoSuchElement,
184
- ),
185
-
186
- set: (parentId, resourceId, resource) =>
187
- Effect.andThen(
188
- store.set(resourceId, resource),
189
- Effect.sync(() => {
190
- if (!parentIds.has(parentId)) {
191
- parentIds.set(parentId, new Set())
192
- }
193
- parentIds.get(parentId)!.add(resourceId)
194
- }),
195
- ),
196
-
197
- delete: (parentId, resourceId) =>
198
- Effect.andThen(
199
- store.delete(resourceId),
200
- Effect.sync(() => {
201
- parentIds.get(parentId)?.delete(resourceId)
202
- }),
203
- ),
204
-
205
- parentDelete: parentId =>
206
- Effect.suspend(() => {
207
- const ids = parentIds.get(parentId)
208
- parentIds.delete(parentId)
209
-
210
- const effects: Array<Effect.Effect<void>> = []
211
- if (ids) {
212
- ids.forEach(id => {
213
- effects.push(store.delete(id))
214
- })
215
- }
216
-
217
- return Effect.all(effects, {
218
- concurrency: "unbounded",
219
- discard: true,
220
- })
221
- }),
222
-
223
- run: store.run,
224
- })
225
- })
@@ -1,279 +0,0 @@
1
- import * as Effect from "effect/Effect"
2
- import type * as Scope from "effect/Scope"
3
- import * as Stream from "effect/Stream"
4
- import type { DiscordRESTError } from "../DiscordREST.ts"
5
- import { DiscordREST } from "../DiscordREST.ts"
6
- import type {
7
- CacheDriver,
8
- CacheOp,
9
- ParentCacheDriver,
10
- ParentCacheOp,
11
- Cache,
12
- ParentCache,
13
- } from "../Cache.ts"
14
- import { CacheMissError, make, makeWithParent } from "../Cache.ts"
15
- import { DiscordGateway } from "../DiscordGateway.ts"
16
- import type * as Discord from "../types.ts"
17
-
18
- export interface OptsWithParentOptions<E, A> {
19
- readonly id: (a: A) => string
20
- readonly fromParent: Stream.Stream<
21
- [parentId: string, resources: ReadonlyArray<A>],
22
- E
23
- >
24
- readonly create: Stream.Stream<[parentId: string, resource: A], E>
25
- readonly update: Stream.Stream<[parentId: string, resource: A], E>
26
- readonly remove: Stream.Stream<[parentId: string, id: string], E>
27
- readonly parentRemove: Stream.Stream<string, E>
28
- }
29
-
30
- export const opsWithParent = <E, T>({
31
- create,
32
- fromParent,
33
- id,
34
- parentRemove,
35
- remove,
36
- update,
37
- }: OptsWithParentOptions<E, T>): Stream.Stream<ParentCacheOp<T>, E> => {
38
- const fromParentOps = Stream.flatMap(fromParent, ([parentId, a]) =>
39
- Stream.fromIterable(
40
- a.map(
41
- (resource): ParentCacheOp<T> => ({
42
- op: "create",
43
- parentId,
44
- resourceId: id(resource),
45
- resource,
46
- }),
47
- ),
48
- ),
49
- )
50
-
51
- const createOps = Stream.map(
52
- create,
53
- ([parentId, resource]): ParentCacheOp<T> => ({
54
- op: "create",
55
- parentId,
56
- resourceId: id(resource),
57
- resource,
58
- }),
59
- )
60
-
61
- const updateOps = Stream.map(
62
- update,
63
- ([parentId, resource]): ParentCacheOp<T> => ({
64
- op: "update",
65
- parentId,
66
- resourceId: id(resource),
67
- resource,
68
- }),
69
- )
70
-
71
- const removeOps = Stream.map(
72
- remove,
73
- ([parentId, resourceId]): ParentCacheOp<T> => ({
74
- op: "delete",
75
- parentId,
76
- resourceId,
77
- }),
78
- )
79
-
80
- const parentRemoveOps = Stream.map(
81
- parentRemove,
82
- (parentId): ParentCacheOp<T> => ({
83
- op: "parentDelete",
84
- parentId,
85
- }),
86
- )
87
-
88
- return Stream.merge(fromParentOps, createOps).pipe(
89
- Stream.merge(updateOps),
90
- Stream.merge(removeOps),
91
- Stream.merge(parentRemoveOps),
92
- )
93
- }
94
-
95
- export interface OpsOptions<E, A> {
96
- id: (a: A) => string
97
- create: Stream.Stream<A, E>
98
- update: Stream.Stream<A, E>
99
- remove: Stream.Stream<string, E>
100
- }
101
-
102
- export const ops = <E, T>({
103
- create,
104
- id,
105
- remove,
106
- update,
107
- }: OpsOptions<E, T>): Stream.Stream<CacheOp<T>, E> => {
108
- const createOps = Stream.map(
109
- create,
110
- (resource): CacheOp<T> => ({
111
- op: "create",
112
- resourceId: id(resource),
113
- resource,
114
- }),
115
- )
116
-
117
- const updateOps = Stream.map(
118
- update,
119
- (resource): CacheOp<T> => ({
120
- op: "update",
121
- resourceId: id(resource),
122
- resource,
123
- }),
124
- )
125
-
126
- const removeOps = Stream.map(
127
- remove,
128
- (resourceId): CacheOp<T> => ({
129
- op: "delete",
130
- resourceId,
131
- }),
132
- )
133
-
134
- return Stream.merge(createOps, updateOps).pipe(Stream.merge(removeOps))
135
- }
136
-
137
- export const guilds = <RM, EM, E>(
138
- makeDriver: Effect.Effect<CacheDriver<E, Discord.GuildResponse>, EM, RM>,
139
- ): Effect.Effect<
140
- Cache<E, DiscordRESTError, Discord.GuildResponse>,
141
- EM,
142
- RM | DiscordGateway | DiscordREST | Scope.Scope
143
- > =>
144
- Effect.gen(function* () {
145
- const driver = yield* makeDriver
146
- const gateway = yield* DiscordGateway
147
- const rest = yield* DiscordREST
148
-
149
- return yield* make({
150
- driver,
151
- id: _ => _.id,
152
- ops: ops({
153
- id: (g: Discord.GuildResponse) => g.id,
154
- create: Stream.map(gateway.fromDispatch("GUILD_CREATE"), g => ({
155
- ...g,
156
- channels: [],
157
- roles: [],
158
- emojis: [],
159
- members: [],
160
- })),
161
- update: gateway.fromDispatch("GUILD_UPDATE"),
162
- remove: Stream.map(gateway.fromDispatch("GUILD_DELETE"), a => a.id),
163
- }),
164
- onMiss: id => rest.getGuild(id, {}),
165
- })
166
- })
167
-
168
- export const channels = <RM, EM, E>(
169
- makeDriver: Effect.Effect<
170
- ParentCacheDriver<E, Discord.GetChannel200>,
171
- EM,
172
- RM
173
- >,
174
- ): Effect.Effect<
175
- ParentCache<E, DiscordRESTError, DiscordRESTError, Discord.GetChannel200>,
176
- EM,
177
- DiscordGateway | DiscordREST | RM | Scope.Scope
178
- > =>
179
- Effect.gen(function* () {
180
- const driver = yield* makeDriver
181
- const gateway = yield* DiscordGateway
182
- const rest = yield* DiscordREST
183
-
184
- return yield* makeWithParent({
185
- driver,
186
- id: _ =>
187
- Effect.succeed([(_ as Discord.GuildChannelResponse).guild_id, _.id]),
188
- ops: opsWithParent({
189
- id: (a: Discord.GetChannel200) => a.id,
190
- fromParent: Stream.map(gateway.fromDispatch("GUILD_CREATE"), g => [
191
- g.id,
192
- g.channels.concat(g.threads as any),
193
- ]),
194
- create: Stream.merge(
195
- gateway.fromDispatch("CHANNEL_CREATE"),
196
- gateway.fromDispatch("THREAD_CREATE"),
197
- ).pipe(Stream.map(c => [c.guild_id, c])),
198
- update: Stream.merge(
199
- gateway.fromDispatch("CHANNEL_UPDATE"),
200
- gateway.fromDispatch("THREAD_UPDATE"),
201
- ).pipe(Stream.map(c => [c.guild_id, c])),
202
- remove: Stream.merge(
203
- gateway.fromDispatch("CHANNEL_DELETE"),
204
- gateway.fromDispatch("THREAD_DELETE"),
205
- ).pipe(Stream.map(a => [a.guild_id, a.id])),
206
- parentRemove: Stream.map(
207
- gateway.fromDispatch("GUILD_DELETE"),
208
- g => g.id,
209
- ),
210
- }),
211
- onMiss: (_, id) => rest.getChannel(id),
212
- onParentMiss: guildId =>
213
- Effect.map(rest.listGuildChannels(guildId), guildChannels =>
214
- guildChannels.map(
215
- channel => [channel.id, channel as Discord.GetChannel200] as const,
216
- ),
217
- ),
218
- })
219
- })
220
-
221
- export const roles = <RM, EM, E>(
222
- makeDriver: Effect.Effect<
223
- ParentCacheDriver<E, Discord.GuildRoleResponse>,
224
- EM,
225
- RM
226
- >,
227
- ): Effect.Effect<
228
- ParentCache<E, CacheMissError, DiscordRESTError, Discord.GuildRoleResponse>,
229
- EM,
230
- DiscordGateway | DiscordREST | RM | Scope.Scope
231
- > =>
232
- Effect.gen(function* () {
233
- const driver = yield* makeDriver
234
- const gateway = yield* DiscordGateway
235
- const rest = yield* DiscordREST
236
-
237
- return yield* makeWithParent({
238
- driver,
239
- id: _ =>
240
- Effect.fail(
241
- new CacheMissError({ cacheName: "RolesCache/id", id: _.id }),
242
- ),
243
- ops: opsWithParent({
244
- id: (a: Discord.GuildRoleResponse) => a.id,
245
- fromParent: Stream.map(gateway.fromDispatch("GUILD_CREATE"), g => [
246
- g.id,
247
- g.roles,
248
- ]),
249
- create: Stream.map(
250
- gateway.fromDispatch("GUILD_ROLE_CREATE"),
251
- (r: Discord.GatewayGuildRoleCreateDispatchData) => [
252
- r.guild_id,
253
- r.role,
254
- ],
255
- ),
256
- update: Stream.map(
257
- gateway.fromDispatch("GUILD_ROLE_UPDATE"),
258
- (r: Discord.GatewayGuildRoleUpdateDispatchData) => [
259
- r.guild_id,
260
- r.role,
261
- ],
262
- ),
263
- remove: Stream.map(gateway.fromDispatch("GUILD_ROLE_DELETE"), r => [
264
- r.guild_id,
265
- r.role_id,
266
- ]),
267
- parentRemove: Stream.map(
268
- gateway.fromDispatch("GUILD_DELETE"),
269
- g => g.id,
270
- ),
271
- }),
272
- onMiss: (_, id) =>
273
- Effect.fail(new CacheMissError({ cacheName: "RolesCache", id })),
274
- onParentMiss: guildId =>
275
- rest
276
- .listGuildRoles(guildId)
277
- .pipe(Effect.map(_ => _.map(role => [role.id, role]))),
278
- })
279
- })