@casual-simulation/aux-records 3.3.7 → 3.3.8-alpha.10185283421

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 (56) hide show
  1. package/AnthropicAIChatInterface.d.ts +18 -0
  2. package/AnthropicAIChatInterface.js +238 -0
  3. package/AnthropicAIChatInterface.js.map +1 -0
  4. package/AuthController.d.ts +2 -0
  5. package/AuthController.js +22 -12
  6. package/AuthController.js.map +1 -1
  7. package/FileRecordsStore.d.ts +4 -0
  8. package/GoogleAIChatInterface.js +5 -1
  9. package/GoogleAIChatInterface.js.map +1 -1
  10. package/InstrumentedHashHelpers.d.ts +28 -0
  11. package/InstrumentedHashHelpers.js +61 -0
  12. package/InstrumentedHashHelpers.js.map +1 -0
  13. package/MemoryModerationJobProvider.d.ts +15 -0
  14. package/MemoryModerationJobProvider.js +45 -0
  15. package/MemoryModerationJobProvider.js.map +1 -0
  16. package/MemoryStore.d.ts +9 -1
  17. package/MemoryStore.js +30 -0
  18. package/MemoryStore.js.map +1 -1
  19. package/ModerationConfiguration.d.ts +84 -0
  20. package/ModerationConfiguration.js +95 -0
  21. package/ModerationConfiguration.js.map +1 -1
  22. package/ModerationController.d.ts +59 -2
  23. package/ModerationController.js +171 -1
  24. package/ModerationController.js.map +1 -1
  25. package/ModerationJobProvider.d.ts +110 -0
  26. package/ModerationJobProvider.js +2 -0
  27. package/ModerationJobProvider.js.map +1 -0
  28. package/ModerationScanner.d.ts +1 -0
  29. package/ModerationScanner.js +1 -0
  30. package/ModerationScanner.js.map +1 -0
  31. package/ModerationStore.d.ts +90 -0
  32. package/NotificationMessenger.d.ts +42 -2
  33. package/NotificationMessenger.js +27 -0
  34. package/NotificationMessenger.js.map +1 -1
  35. package/RecordsController.d.ts +1 -0
  36. package/RecordsController.js +9 -3
  37. package/RecordsController.js.map +1 -1
  38. package/RecordsServer.d.ts +12 -0
  39. package/RecordsServer.js +82 -1
  40. package/RecordsServer.js.map +1 -1
  41. package/ServerConfig.d.ts +392 -16
  42. package/ServerConfig.js +126 -2
  43. package/ServerConfig.js.map +1 -1
  44. package/StabilityAIImageInterface.d.ts +9 -0
  45. package/StabilityAIImageInterface.js +156 -0
  46. package/StabilityAIImageInterface.js.map +1 -1
  47. package/Utils.js.map +1 -1
  48. package/index.d.ts +3 -0
  49. package/index.js +3 -0
  50. package/index.js.map +1 -1
  51. package/package.json +5 -4
  52. package/tracing/TracingDecorators.d.ts +51 -3
  53. package/tracing/TracingDecorators.js +41 -38
  54. package/tracing/TracingDecorators.js.map +1 -1
  55. package/websockets/WebsocketController.js +1 -1
  56. package/websockets/WebsocketController.js.map +1 -1
@@ -0,0 +1,18 @@
1
+ import { AIChatInterface, AIChatInterfaceRequest, AIChatInterfaceResponse, AIChatInterfaceStreamResponse } from './AIChatInterface';
2
+ export interface AnthropicAIChatOptions {
3
+ /**
4
+ * The API key to use.
5
+ */
6
+ apiKey: string;
7
+ }
8
+ /**
9
+ * Defines a class that implements {@link AIChatInterface} using the Anthropic Claude API.
10
+ */
11
+ export declare class AnthropicAIChatInterface implements AIChatInterface {
12
+ private _options;
13
+ private _ai;
14
+ constructor(options: AnthropicAIChatOptions);
15
+ chat(request: AIChatInterfaceRequest): Promise<AIChatInterfaceResponse>;
16
+ chatStream(request: AIChatInterfaceRequest): AsyncIterable<AIChatInterfaceStreamResponse>;
17
+ }
18
+ //# sourceMappingURL=AnthropicAIChatInterface.d.ts.map
@@ -0,0 +1,238 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
17
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
18
+ var m = o[Symbol.asyncIterator], i;
19
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
20
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
21
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
22
+ };
23
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
24
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
25
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
26
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
27
+ return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
28
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
29
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
30
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
31
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
32
+ function fulfill(value) { resume("next", value); }
33
+ function reject(value) { resume("throw", value); }
34
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
35
+ };
36
+ import { traced } from './tracing/TracingDecorators';
37
+ import { SpanKind, SpanStatusCode, trace, } from '@opentelemetry/api';
38
+ import Anthropic from '@anthropic-ai/sdk';
39
+ const TRACE_NAME = 'AnthropicAIChatInterface';
40
+ const SPAN_OPTIONS = {
41
+ kind: SpanKind.CLIENT,
42
+ attributes: {
43
+ 'peer.service': 'anthropic',
44
+ 'service.name': 'anthropic',
45
+ },
46
+ };
47
+ /**
48
+ * Defines a class that implements {@link AIChatInterface} using the Anthropic Claude API.
49
+ */
50
+ export class AnthropicAIChatInterface {
51
+ constructor(options) {
52
+ this._options = options;
53
+ this._ai = new Anthropic({
54
+ apiKey: options.apiKey,
55
+ });
56
+ }
57
+ chat(request) {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ try {
60
+ let maxTokens = Math.min(request.maxTokens, 4096);
61
+ // TODO: Support 8192 tokens for sonnet
62
+ // See https://docs.anthropic.com/en/docs/about-claude/models
63
+ // if (/claude-3-5-sonnet/.test(request.model)) {
64
+ // maxTokens = Math.min(request.maxTokens, 8192);
65
+ // }
66
+ const response = yield this._ai.messages.create({
67
+ max_tokens: maxTokens,
68
+ top_p: request.topP,
69
+ temperature: request.temperature,
70
+ stop_sequences: request.stopWords,
71
+ model: request.model,
72
+ messages: request.messages.map((m) => mapMessage(m)),
73
+ });
74
+ return {
75
+ choices: [
76
+ {
77
+ content: mapOutputContent(response.content),
78
+ role: response.role,
79
+ },
80
+ ],
81
+ totalTokens: response.usage.input_tokens + response.usage.output_tokens,
82
+ };
83
+ }
84
+ catch (err) {
85
+ const span = trace.getActiveSpan();
86
+ span === null || span === void 0 ? void 0 : span.recordException(err);
87
+ span === null || span === void 0 ? void 0 : span.setStatus({ code: SpanStatusCode.ERROR });
88
+ if (err instanceof Error) {
89
+ console.error('[AnthropicAIChatInterface] Error occurred while generating content.', err);
90
+ return {
91
+ choices: [
92
+ {
93
+ role: 'system',
94
+ content: `Error: ${err.message}`,
95
+ },
96
+ ],
97
+ totalTokens: 0,
98
+ };
99
+ }
100
+ throw err;
101
+ }
102
+ });
103
+ }
104
+ chatStream(request) {
105
+ return __asyncGenerator(this, arguments, function* chatStream_1() {
106
+ var _a, e_1, _b, _c;
107
+ try {
108
+ let maxTokens = Math.min(request.maxTokens, 4096);
109
+ // TODO: Support 8192 tokens for sonnet
110
+ // See https://docs.anthropic.com/en/docs/about-claude/models
111
+ // if (/claude-3-5-sonnet/.test(request.model)) {
112
+ // maxTokens = Math.min(request.maxTokens, 8192);
113
+ // }
114
+ const response = this._ai.messages.stream({
115
+ max_tokens: maxTokens,
116
+ top_p: request.topP,
117
+ temperature: request.temperature,
118
+ stop_sequences: request.stopWords,
119
+ model: request.model,
120
+ messages: request.messages.map((m) => mapMessage(m)),
121
+ });
122
+ try {
123
+ for (var _d = true, response_1 = __asyncValues(response), response_1_1; response_1_1 = yield __await(response_1.next()), _a = response_1_1.done, !_a; _d = true) {
124
+ _c = response_1_1.value;
125
+ _d = false;
126
+ const chunk = _c;
127
+ if (chunk.type === 'message_start') {
128
+ yield yield __await({
129
+ choices: [],
130
+ totalTokens: chunk.message.usage.input_tokens +
131
+ chunk.message.usage.output_tokens,
132
+ });
133
+ }
134
+ else if (chunk.type === 'content_block_delta') {
135
+ if (chunk.delta.type === 'text_delta') {
136
+ yield yield __await({
137
+ choices: [
138
+ {
139
+ content: chunk.delta.text,
140
+ role: 'assistant',
141
+ },
142
+ ],
143
+ totalTokens: 0,
144
+ });
145
+ }
146
+ }
147
+ }
148
+ }
149
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
150
+ finally {
151
+ try {
152
+ if (!_d && !_a && (_b = response_1.return)) yield __await(_b.call(response_1));
153
+ }
154
+ finally { if (e_1) throw e_1.error; }
155
+ }
156
+ return yield __await({
157
+ choices: [],
158
+ totalTokens: 0,
159
+ });
160
+ }
161
+ catch (err) {
162
+ const span = trace.getActiveSpan();
163
+ span === null || span === void 0 ? void 0 : span.recordException(err);
164
+ span === null || span === void 0 ? void 0 : span.setStatus({ code: SpanStatusCode.ERROR });
165
+ if (err instanceof Error) {
166
+ console.error('[AnthropicAIChatInterface] Error occurred while generating content.', err);
167
+ yield yield __await({
168
+ choices: [
169
+ {
170
+ role: 'system',
171
+ content: `Error: ${err.message}`,
172
+ },
173
+ ],
174
+ totalTokens: 0,
175
+ });
176
+ return yield __await({
177
+ choices: [],
178
+ totalTokens: 0,
179
+ });
180
+ }
181
+ throw err;
182
+ }
183
+ });
184
+ }
185
+ }
186
+ __decorate([
187
+ traced(TRACE_NAME, SPAN_OPTIONS)
188
+ ], AnthropicAIChatInterface.prototype, "chat", null);
189
+ __decorate([
190
+ traced(TRACE_NAME, SPAN_OPTIONS)
191
+ ], AnthropicAIChatInterface.prototype, "chatStream", null);
192
+ function mapMessage(message) {
193
+ return {
194
+ role: message.role === 'user' || message.role === 'system'
195
+ ? 'user'
196
+ : 'assistant',
197
+ content: mapContent(message.content),
198
+ };
199
+ }
200
+ function mapContent(content) {
201
+ if (typeof content === 'string') {
202
+ return content;
203
+ }
204
+ return content.map((c) => {
205
+ if ('text' in c) {
206
+ return {
207
+ type: 'text',
208
+ text: c.text,
209
+ };
210
+ }
211
+ else if ('base64' in c) {
212
+ return {
213
+ type: 'image',
214
+ source: {
215
+ data: c.base64,
216
+ media_type: c.mimeType,
217
+ type: 'base64',
218
+ },
219
+ };
220
+ }
221
+ throw new Error('URL content is not supported for Anthropic Claude models');
222
+ });
223
+ }
224
+ function mapOutputContent(content) {
225
+ if (content.length === 1 && content[0].type === 'text') {
226
+ return content[0].text;
227
+ }
228
+ return content
229
+ .map((c) => {
230
+ if (c.type === 'text') {
231
+ return {
232
+ text: c.text,
233
+ };
234
+ }
235
+ })
236
+ .filter((c) => !!c);
237
+ }
238
+ //# sourceMappingURL=AnthropicAIChatInterface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnthropicAIChatInterface.js","sourceRoot":"","sources":["AnthropicAIChatInterface.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EACH,QAAQ,EAER,cAAc,EACd,KAAK,GACR,MAAM,oBAAoB,CAAC;AAC5B,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAO1C,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC9C,MAAM,YAAY,GAAgB;IAC9B,IAAI,EAAE,QAAQ,CAAC,MAAM;IACrB,UAAU,EAAE;QACR,cAAc,EAAE,WAAW;QAC3B,cAAc,EAAE,WAAW;KAC9B;CACJ,CAAC;AASF;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAIjC,YAAY,OAA+B;QACvC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;SACzB,CAAC,CAAC;IACP,CAAC;IAGK,IAAI,CACN,OAA+B;;YAE/B,IAAI,CAAC;gBACD,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAElD,uCAAuC;gBACvC,6DAA6D;gBAC7D,iDAAiD;gBACjD,qDAAqD;gBACrD,IAAI;gBAEJ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC5C,UAAU,EAAE,SAAS;oBACrB,KAAK,EAAE,OAAO,CAAC,IAAI;oBACnB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,cAAc,EAAE,OAAO,CAAC,SAAS;oBACjC,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;iBACvD,CAAC,CAAC;gBAEH,OAAO;oBACH,OAAO,EAAE;wBACL;4BACI,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC;4BAC3C,IAAI,EAAE,QAAQ,CAAC,IAAI;yBACtB;qBACJ;oBACD,WAAW,EACP,QAAQ,CAAC,KAAK,CAAC,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa;iBACjE,CAAC;YACN,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;gBACnC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,eAAe,CAAC,GAAG,CAAC,CAAC;gBAC3B,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;gBAEhD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;oBACvB,OAAO,CAAC,KAAK,CACT,qEAAqE,EACrE,GAAG,CACN,CAAC;oBACF,OAAO;wBACH,OAAO,EAAE;4BACL;gCACI,IAAI,EAAE,QAAQ;gCACd,OAAO,EAAE,UAAU,GAAG,CAAC,OAAO,EAAE;6BACnC;yBACJ;wBACD,WAAW,EAAE,CAAC;qBACjB,CAAC;gBACN,CAAC;gBACD,MAAM,GAAG,CAAC;YACd,CAAC;QACL,CAAC;KAAA;IAGM,UAAU,CACb,OAA+B;;;YAE/B,IAAI,CAAC;gBACD,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAElD,uCAAuC;gBACvC,6DAA6D;gBAC7D,iDAAiD;gBACjD,qDAAqD;gBACrD,IAAI;gBAEJ,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACtC,UAAU,EAAE,SAAS;oBACrB,KAAK,EAAE,OAAO,CAAC,IAAI;oBACnB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,cAAc,EAAE,OAAO,CAAC,SAAS;oBACjC,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;iBACvD,CAAC,CAAC;;oBAEH,KAA0B,eAAA,aAAA,cAAA,QAAQ,CAAA,cAAA,2FAAE,CAAC;wBAAX,wBAAQ;wBAAR,WAAQ;wBAAvB,MAAM,KAAK,KAAA,CAAA;wBAClB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;4BACjC,oBAAM;gCACF,OAAO,EAAE,EAAE;gCACX,WAAW,EACP,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY;oCAChC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa;6BACxC,CAAA,CAAC;wBACN,CAAC;6BAAM,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;4BAC9C,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gCACpC,oBAAM;oCACF,OAAO,EAAE;wCACL;4CACI,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;4CACzB,IAAI,EAAE,WAAW;yCACpB;qCACJ;oCACD,WAAW,EAAE,CAAC;iCACjB,CAAA,CAAC;4BACN,CAAC;wBACL,CAAC;oBACL,CAAC;;;;;;;;;gBAED,qBAAO;oBACH,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,CAAC;iBACjB,EAAC;YACN,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;gBACnC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,eAAe,CAAC,GAAG,CAAC,CAAC;gBAC3B,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;gBAEhD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;oBACvB,OAAO,CAAC,KAAK,CACT,qEAAqE,EACrE,GAAG,CACN,CAAC;oBACF,oBAAM;wBACF,OAAO,EAAE;4BACL;gCACI,IAAI,EAAE,QAAQ;gCACd,OAAO,EAAE,UAAU,GAAG,CAAC,OAAO,EAAE;6BACnC;yBACJ;wBACD,WAAW,EAAE,CAAC;qBACjB,CAAA,CAAC;oBACF,qBAAO;wBACH,OAAO,EAAE,EAAE;wBACX,WAAW,EAAE,CAAC;qBACjB,EAAC;gBACN,CAAC;gBACD,MAAM,GAAG,CAAC;YACd,CAAC;QACL,CAAC;KAAA;CACJ;AAnIS;IADL,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC;oDAsDhC;AAGM;IADN,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC;0DA2EhC;AAGL,SAAS,UAAU,CAAC,OAAsB;IACtC,OAAO;QACH,IAAI,EACA,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;YAChD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,WAAW;QACrB,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC;KACvC,CAAC;AACN,CAAC;AAED,SAAS,UAAU,CACf,OAAiC;IAEjC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrB,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YACd,OAAO;gBACH,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;aACf,CAAC;QACN,CAAC;aAAM,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO;gBACH,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE;oBACJ,IAAI,EAAE,CAAC,CAAC,MAAM;oBACd,UAAU,EAAE,CAAC,CAAC,QAAe;oBAC7B,IAAI,EAAE,QAAQ;iBACjB;aACJ,CAAC;QACN,CAAC;QAED,MAAM,IAAI,KAAK,CACX,0DAA0D,CAC7D,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,gBAAgB,CACrB,OAA2B;IAE3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACrD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,OAAO,OAAO;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACP,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO;gBACH,IAAI,EAAE,CAAC,CAAC,IAAI;aACf,CAAC;QACN,CAAC;IACL,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC"}
@@ -100,6 +100,7 @@ export declare class AuthController {
100
100
  set relyingParties(value: RelyingParty[]);
101
101
  constructor(authStore: AuthStore, messenger: AuthMessenger, configStore: ConfigurationStore, forceAllowSubscriptionFeatures?: boolean, privoClient?: PrivoClientInterface, relyingParties?: RelyingParty[]);
102
102
  createAccount(request: CreateAccountRequest): Promise<CreateAccountResult>;
103
+ hashHighEntropyPasswordWithSalt(sessionSecret: string, sessionId: string): string;
103
104
  requestLogin(request: LoginRequest): Promise<LoginRequestResult>;
104
105
  private _validateAddress;
105
106
  completeLogin(request: CompleteLoginRequest): Promise<CompleteLoginResult>;
@@ -114,6 +115,7 @@ export declare class AuthController {
114
115
  listUserAuthenticators(userId: string): Promise<ListUserAuthenticatorsResult>;
115
116
  deleteUserAuthenticator(userId: string, authenticatorId: string): Promise<DeleteUserAuthenticatorResult>;
116
117
  validateSessionKey(key: string): Promise<ValidateSessionKeyResult>;
118
+ verifyPasswordAgainstHashes(sessionSecret: string, sessionId: string, hashes: string[]): boolean;
117
119
  validateConnectionToken(token: string): Promise<ValidateConnectionTokenResult>;
118
120
  revokeSession(request: RevokeSessionRequest): Promise<RevokeSessionResult>;
119
121
  /**
package/AuthController.js CHANGED
@@ -15,7 +15,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
15
15
  };
16
16
  import { v4 as uuid } from 'uuid';
17
17
  import { randomBytes } from 'tweetnacl';
18
- import { hashHighEntropyPasswordWithSalt, hashPasswordWithSalt, verifyPasswordAgainstHashes, } from '@casual-simulation/crypto';
18
+ import { hashHighEntropyPasswordWithSalt, hashLowEntropyPasswordWithSalt, verifyPasswordAgainstHashes, } from './InstrumentedHashHelpers';
19
19
  import { fromByteArray } from 'base64-js';
20
20
  import { cleanupObject, isActiveSubscription, isStringValid, } from './Utils';
21
21
  import { formatV1ConnectionKey, formatV1SessionKey, isSuperUserRole, parseSessionKey, randomCode, verifyConnectionToken, } from './AuthUtils';
@@ -141,7 +141,7 @@ export class AuthController {
141
141
  requestId: null,
142
142
  // sessionSecret and sessionId are high-entropy (128 bits of random data)
143
143
  // so we should use a hash that is optimized for high-entropy inputs.
144
- secretHash: hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
144
+ secretHash: this.hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
145
145
  connectionSecret: connectionSecret,
146
146
  grantedTimeMs: now,
147
147
  revokeTimeMs: null,
@@ -173,6 +173,9 @@ export class AuthController {
173
173
  }
174
174
  });
175
175
  }
176
+ hashHighEntropyPasswordWithSalt(sessionSecret, sessionId) {
177
+ return hashHighEntropyPasswordWithSalt(sessionSecret, sessionId);
178
+ }
176
179
  requestLogin(request) {
177
180
  return __awaiter(this, void 0, void 0, function* () {
178
181
  if (typeof request.address !== 'string' || request.address === '') {
@@ -263,7 +266,7 @@ export class AuthController {
263
266
  const requestTime = Date.now();
264
267
  const requestId = fromByteArray(randomBytes(LOGIN_REQUEST_ID_BYTE_LENGTH));
265
268
  const code = randomCode();
266
- const hash = hashPasswordWithSalt(code, requestId);
269
+ const hash = hashLowEntropyPasswordWithSalt(code, requestId);
267
270
  const loginRequest = {
268
271
  userId: user.id,
269
272
  requestId: requestId,
@@ -407,7 +410,7 @@ export class AuthController {
407
410
  }
408
411
  let validCode = false;
409
412
  try {
410
- if (verifyPasswordAgainstHashes(request.code, loginRequest.requestId, [loginRequest.secretHash])) {
413
+ if (this.verifyPasswordAgainstHashes(request.code, loginRequest.requestId, [loginRequest.secretHash])) {
411
414
  validCode = true;
412
415
  }
413
416
  }
@@ -447,7 +450,7 @@ export class AuthController {
447
450
  requestId: loginRequest.requestId,
448
451
  // sessionSecret and sessionId are high-entropy (128 bits of random data)
449
452
  // so we should use a hash that is optimized for high-entropy inputs.
450
- secretHash: hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
453
+ secretHash: this.hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
451
454
  connectionSecret: connectionSecret,
452
455
  grantedTimeMs: now,
453
456
  revokeTimeMs: null,
@@ -735,7 +738,7 @@ export class AuthController {
735
738
  oidRequestId: loginRequest.requestId,
736
739
  // sessionSecret and sessionId are high-entropy (128 bits of random data)
737
740
  // so we should use a hash that is optimized for high-entropy inputs.
738
- secretHash: hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
741
+ secretHash: this.hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
739
742
  connectionSecret: connectionSecret,
740
743
  grantedTimeMs: now,
741
744
  revokeTimeMs: null,
@@ -906,7 +909,7 @@ export class AuthController {
906
909
  userId: userId,
907
910
  sessionId: newSessionId,
908
911
  requestId: null,
909
- secretHash: hashPasswordWithSalt(newSessionSecret, newSessionId),
912
+ secretHash: hashHighEntropyPasswordWithSalt(newSessionSecret, newSessionId),
910
913
  connectionSecret: newConnectionSecret,
911
914
  grantedTimeMs: nowMs,
912
915
  revokeTimeMs: null,
@@ -1247,7 +1250,7 @@ export class AuthController {
1247
1250
  webauthnRequestId: loginRequest.requestId,
1248
1251
  // sessionSecret and sessionId are high-entropy (128 bits of random data)
1249
1252
  // so we should use a hash that is optimized for high-entropy inputs.
1250
- secretHash: hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
1253
+ secretHash: this.hashHighEntropyPasswordWithSalt(sessionSecret, sessionId),
1251
1254
  connectionSecret: connectionSecret,
1252
1255
  grantedTimeMs: now,
1253
1256
  revokeTimeMs: null,
@@ -1383,9 +1386,7 @@ export class AuthController {
1383
1386
  errorMessage: INVALID_KEY_ERROR_MESSAGE,
1384
1387
  };
1385
1388
  }
1386
- if (!verifyPasswordAgainstHashes(sessionSecret, session.sessionId, [
1387
- session.secretHash,
1388
- ])) {
1389
+ if (!this.verifyPasswordAgainstHashes(sessionSecret, session.sessionId, [session.secretHash])) {
1389
1390
  console.log('[AuthController] [validateSessionKey] Session secret was invalid.');
1390
1391
  return {
1391
1392
  success: false,
@@ -1466,6 +1467,9 @@ export class AuthController {
1466
1467
  }
1467
1468
  });
1468
1469
  }
1470
+ verifyPasswordAgainstHashes(sessionSecret, sessionId, hashes) {
1471
+ return verifyPasswordAgainstHashes(sessionSecret, sessionId, hashes);
1472
+ }
1469
1473
  validateConnectionToken(token) {
1470
1474
  return __awaiter(this, void 0, void 0, function* () {
1471
1475
  if (typeof token !== 'string' || token === '') {
@@ -1766,7 +1770,7 @@ export class AuthController {
1766
1770
  userId: userId,
1767
1771
  sessionId: newSessionId,
1768
1772
  requestId: null,
1769
- secretHash: hashPasswordWithSalt(newSessionSecret, newSessionId),
1773
+ secretHash: hashHighEntropyPasswordWithSalt(newSessionSecret, newSessionId),
1770
1774
  connectionSecret: newConnectionSecret,
1771
1775
  grantedTimeMs: now,
1772
1776
  revokeTimeMs: null,
@@ -2277,6 +2281,9 @@ export class AuthController {
2277
2281
  __decorate([
2278
2282
  traced(TRACE_NAME)
2279
2283
  ], AuthController.prototype, "createAccount", null);
2284
+ __decorate([
2285
+ traced(TRACE_NAME)
2286
+ ], AuthController.prototype, "hashHighEntropyPasswordWithSalt", null);
2280
2287
  __decorate([
2281
2288
  traced(TRACE_NAME)
2282
2289
  ], AuthController.prototype, "requestLogin", null);
@@ -2316,6 +2323,9 @@ __decorate([
2316
2323
  __decorate([
2317
2324
  traced(TRACE_NAME)
2318
2325
  ], AuthController.prototype, "validateSessionKey", null);
2326
+ __decorate([
2327
+ traced(TRACE_NAME)
2328
+ ], AuthController.prototype, "verifyPasswordAgainstHashes", null);
2319
2329
  __decorate([
2320
2330
  traced(TRACE_NAME)
2321
2331
  ], AuthController.prototype, "validateConnectionToken", null);