@northstartech/cipher 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +541 -2
  2. package/dist/client.d.ts +237 -0
  3. package/dist/client.js +555 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/crypto.d.ts +72 -0
  6. package/dist/crypto.js +244 -0
  7. package/dist/crypto.js.map +1 -0
  8. package/dist/encoding.d.ts +17 -0
  9. package/dist/encoding.js +79 -0
  10. package/dist/encoding.js.map +1 -0
  11. package/dist/errors.d.ts +14 -0
  12. package/dist/errors.js +22 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.js +6 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/integrations/drizzle.d.ts +96 -0
  18. package/dist/integrations/drizzle.js +285 -0
  19. package/dist/integrations/drizzle.js.map +1 -0
  20. package/dist/integrations/mongoose.d.ts +72 -0
  21. package/dist/integrations/mongoose.js +582 -0
  22. package/dist/integrations/mongoose.js.map +1 -0
  23. package/dist/integrations/prisma.d.ts +65 -0
  24. package/dist/integrations/prisma.js +588 -0
  25. package/dist/integrations/prisma.js.map +1 -0
  26. package/dist/integrations/sequelize.d.ts +62 -0
  27. package/dist/integrations/sequelize.js +677 -0
  28. package/dist/integrations/sequelize.js.map +1 -0
  29. package/dist/integrations/shared.d.ts +268 -0
  30. package/dist/integrations/shared.js +513 -0
  31. package/dist/integrations/shared.js.map +1 -0
  32. package/dist/integrations/typeorm.d.ts +109 -0
  33. package/dist/integrations/typeorm.js +457 -0
  34. package/dist/integrations/typeorm.js.map +1 -0
  35. package/dist/object.d.ts +53 -0
  36. package/dist/object.js +226 -0
  37. package/dist/object.js.map +1 -0
  38. package/dist/search.d.ts +250 -0
  39. package/dist/search.js +258 -0
  40. package/dist/search.js.map +1 -0
  41. package/package.json +101 -4
package/dist/search.js ADDED
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Northstar Search: encrypted full-text search that runs inside the attested
3
+ * enclave. Index files are encrypted at rest under a key only the enclave can
4
+ * unwrap; documents and queries travel sealed to the enclave session.
5
+ *
6
+ * ```ts
7
+ * const customers = cipher.index('customers')
8
+ * await customers.ensure({ language: 'spanish', fields: { name: 'text', email: 'keyword', city: 'keyword', balance: 'number' } })
9
+ * await customers.upsert({ 42: { name: 'Ana García', city: 'CDMX', balance: 1500 } })
10
+ * const r = await customers.search({ q: 'ana garsia', filter: { city: 'cdmx' } })
11
+ * // r.hits = [{ id: '42', score: 3.1 }], r.total = 1
12
+ * ```
13
+ *
14
+ * Values may be ciphertexts: a string starting with `nsc:v1:` is decrypted in
15
+ * the enclave with context (index or `collection`, field, id), or pass
16
+ * `SearchIndex.ciphertext(ct, context)` to give the context explicitly.
17
+ */
18
+ import { wireContext } from './client.js';
19
+ import { CipherError } from './errors.js';
20
+ const UPSERT_CHUNK = 1000;
21
+ const DELETE_CHUNK = 5000;
22
+ const seconds = (s) => new Date(s * 1000);
23
+ function version(v) {
24
+ return { version: v.version, state: v.state, documents: v.documents, diskBytes: v.disk_bytes, createdAt: seconds(v.created_at), schema: v.schema };
25
+ }
26
+ /** @internal */
27
+ export function indexInfo(r) {
28
+ if (!r || typeof r !== 'object' || !r.active)
29
+ throw new CipherError('PROTOCOL_ERROR', 'malformed search index description');
30
+ return {
31
+ index: r.index,
32
+ keyId: r.key_id,
33
+ createdAt: seconds(r.created_at),
34
+ updatedAt: seconds(r.updated_at),
35
+ active: version(r.active),
36
+ ...(r.building ? { building: version(r.building) } : {}),
37
+ ...(r.outcome ? { outcome: r.outcome } : {}),
38
+ };
39
+ }
40
+ function writeResult(r) {
41
+ return {
42
+ upserted: r.upserted ?? 0,
43
+ deleted: r.deleted ?? 0,
44
+ decrypted: r.decrypted ?? 0,
45
+ errors: (r.errors ?? []).map((e) => ({ id: e.id, error: new CipherError(e.error.code, e.error.message) })),
46
+ committed: r.committed === true,
47
+ };
48
+ }
49
+ function emptyWrite() {
50
+ return { upserted: 0, deleted: 0, decrypted: 0, errors: [], committed: false };
51
+ }
52
+ function isPlainObject(v) {
53
+ if (!v || typeof v !== 'object' || Array.isArray(v))
54
+ return false;
55
+ const p = Object.getPrototypeOf(v);
56
+ return p === Object.prototype || p === null;
57
+ }
58
+ function wireValue(v) {
59
+ if (v instanceof Date)
60
+ return v.toISOString();
61
+ if (Array.isArray(v))
62
+ return v.map(wireValue);
63
+ return v;
64
+ }
65
+ /** Fields as sent: `undefined` dropped, dates as RFC 3339 (an empty map stays `{}`). */
66
+ function wireFields(fields, label) {
67
+ if (fields === undefined || fields === null)
68
+ return {};
69
+ if (!isPlainObject(fields))
70
+ throw new CipherError('INVALID_REQUEST', `${label}: fields must be an object`);
71
+ const out = {};
72
+ for (const [k, v] of Object.entries(fields))
73
+ if (v !== undefined)
74
+ out[k] = wireValue(v);
75
+ return out;
76
+ }
77
+ function docId(id, label) {
78
+ if (typeof id === 'string' && id)
79
+ return id;
80
+ if (typeof id === 'number' && Number.isSafeInteger(id))
81
+ return String(id);
82
+ if (typeof id === 'bigint')
83
+ return id.toString();
84
+ throw new CipherError('INVALID_REQUEST', `${label}: id must be a non-empty string or an integer`);
85
+ }
86
+ /** `[{ id, fields }]` or `{ [id]: fields }` → wire documents. */
87
+ function wireDocuments(input) {
88
+ if (Array.isArray(input)) {
89
+ return input.map((d, i) => {
90
+ if (!d || typeof d !== 'object')
91
+ throw new CipherError('INVALID_REQUEST', `document ${i}: expected { id, fields }`);
92
+ const id = docId(d.id, `document ${i}`);
93
+ return { id, fields: wireFields(d.fields, `document ${id}`) };
94
+ });
95
+ }
96
+ if (isPlainObject(input))
97
+ return Object.entries(input).map(([id, fields]) => ({ id: docId(id, 'document'), fields: wireFields(fields, `document ${id}`) }));
98
+ throw new CipherError('INVALID_REQUEST', 'documents must be [{ id, fields }] or { [id]: fields }');
99
+ }
100
+ /**
101
+ * A Northstar Search index. Get one with `cipher.index(name)`; the handle is
102
+ * cheap and does no I/O until a method is called.
103
+ */
104
+ export class SearchIndex {
105
+ name;
106
+ #t;
107
+ /** @internal Use `cipher.index(name)`. */
108
+ constructor(transport, name) {
109
+ if (typeof name !== 'string' || !name)
110
+ throw new CipherError('CONFIGURATION_ERROR', 'a search index needs a name');
111
+ this.#t = transport;
112
+ this.name = name;
113
+ }
114
+ /**
115
+ * A field value the enclave decrypts before indexing, with an explicit context
116
+ * (normalized like `encrypt`'s: `recordId` → `record_id`, values as strings).
117
+ */
118
+ static ciphertext(ciphertext, context) {
119
+ if (typeof ciphertext !== 'string' || !ciphertext.startsWith('nsc:v1:'))
120
+ throw new CipherError('INVALID_CIPHERTEXT', 'search ciphertext values must be nsc:v1: ciphertext');
121
+ return { ciphertext, context: wireContext(context) };
122
+ }
123
+ /** Normalize a schema: the map shorthand `{ fields: { name: 'text' } }` becomes the wire list form. */
124
+ static schema(input) {
125
+ if (!input || typeof input !== 'object')
126
+ throw new CipherError('INVALID_REQUEST', 'schema must be { language?, fields }');
127
+ const f = input.fields;
128
+ let fields;
129
+ if (Array.isArray(f))
130
+ fields = f.map((x) => ({ ...x }));
131
+ else if (isPlainObject(f)) {
132
+ fields = Object.entries(f).map(([name, spec]) => (typeof spec === 'string' ? { name, type: spec } : { ...spec, name }));
133
+ }
134
+ else
135
+ throw new CipherError('INVALID_REQUEST', 'schema.fields must be a list of { name, type } or a map of name → type');
136
+ return { ...(input.language ? { language: input.language } : {}), fields };
137
+ }
138
+ /**
139
+ * Create the index, or confirm it exists with this schema (`outcome`:
140
+ * `created` | `unchanged`). A different schema fails with `CONFLICT` unless
141
+ * `rebuild` is set: then a fresh version is built next to the live one
142
+ * (writes reach both, queries keep using the live one until {@link activate}).
143
+ * `key`: key alias or id protecting the index (default: the client's key).
144
+ */
145
+ async ensure(schema, opts = {}) {
146
+ return indexInfo(await this.#t.call('/v1/search/indexes', {
147
+ index: this.name,
148
+ schema: SearchIndex.schema(schema),
149
+ key: opts.key ?? this.#t.keyId,
150
+ rebuild: opts.rebuild === true,
151
+ }));
152
+ }
153
+ async describe() {
154
+ return indexInfo(await this.#t.call('/v1/search/indexes/describe', { index: this.name }));
155
+ }
156
+ /** Make the version being built (or `version`) live; the previous one is deleted. */
157
+ async activate(version) {
158
+ return indexInfo(await this.#t.call('/v1/search/indexes/activate', { index: this.name, ...(version !== undefined ? { version } : {}) }));
159
+ }
160
+ /** Delete the index and its files. `false` when there was none. */
161
+ async drop() {
162
+ try {
163
+ const r = await this.#t.call('/v1/search/indexes/drop', { index: this.name });
164
+ return r?.dropped === true;
165
+ }
166
+ catch (e) {
167
+ if (e instanceof CipherError && e.code === 'NOT_FOUND')
168
+ return false;
169
+ throw e;
170
+ }
171
+ }
172
+ /**
173
+ * Add or replace documents: `[{ id, fields }]` or `{ [id]: fields }`. Sent in
174
+ * chunks of 1 000; `wait` applies to the last chunk (so to all of them).
175
+ * Rejected documents are listed in `errors`; the others are indexed.
176
+ */
177
+ async upsert(documents, opts = {}) {
178
+ const docs = wireDocuments(documents);
179
+ const total = emptyWrite();
180
+ for (let i = 0; i < docs.length; i += UPSERT_CHUNK) {
181
+ const r = await this.send({
182
+ upsert: docs.slice(i, i + UPSERT_CHUNK),
183
+ ...(opts.mode ? { mode: opts.mode } : {}),
184
+ ...(opts.collection ? { collection: opts.collection } : {}),
185
+ ...(opts.wait && i + UPSERT_CHUNK >= docs.length ? { wait: true } : {}),
186
+ });
187
+ total.upserted += r.upserted;
188
+ total.decrypted += r.decrypted;
189
+ total.errors.push(...r.errors);
190
+ total.committed = r.committed;
191
+ }
192
+ return total;
193
+ }
194
+ /** Remove documents by id (absent ids are ignored). */
195
+ async delete(ids, opts = {}) {
196
+ const list = ids.map((id) => docId(id, 'delete'));
197
+ const total = emptyWrite();
198
+ for (let i = 0; i < list.length; i += DELETE_CHUNK) {
199
+ const r = await this.send({ delete: list.slice(i, i + DELETE_CHUNK), ...(opts.wait && i + DELETE_CHUNK >= list.length ? { wait: true } : {}) });
200
+ total.deleted += r.deleted;
201
+ total.committed = r.committed;
202
+ }
203
+ return total;
204
+ }
205
+ /** Wait until everything written so far is searchable; `optimize` also merges segments (after bulk loads). */
206
+ async flush(opts = {}) {
207
+ return this.write({ wait: true, ...(opts.optimize ? { optimize: true } : {}) });
208
+ }
209
+ /** Raw write (≤ 5 000 documents and deletions): `upsert`, `delete`, `mode`, `collection`, `wait`, `optimize`. */
210
+ async write(request) {
211
+ const body = {};
212
+ if (request.upsert?.length)
213
+ body.upsert = wireDocuments(request.upsert);
214
+ if (request.delete?.length)
215
+ body.delete = request.delete.map((id) => docId(id, 'delete'));
216
+ if (request.mode)
217
+ body.mode = request.mode;
218
+ if (request.collection)
219
+ body.collection = request.collection;
220
+ if (request.wait)
221
+ body.wait = true;
222
+ if (request.optimize)
223
+ body.optimize = true;
224
+ return this.send(body);
225
+ }
226
+ async send(body) {
227
+ return writeResult(await this.#t.call('/v1/search/documents', { index: this.name, ...body }));
228
+ }
229
+ /** Search. Without `q`, every document matches (filters, facets and sorting still apply). */
230
+ async search(query = {}) {
231
+ const { purpose, facetLimit, filter, ...rest } = query;
232
+ const body = { index: this.name };
233
+ if (purpose)
234
+ body.purpose = purpose;
235
+ for (const [k, v] of Object.entries(rest))
236
+ if (v !== undefined && v !== null)
237
+ body[k] = wireValue(v);
238
+ if (facetLimit !== undefined && facetLimit !== null)
239
+ body.facet_limit = facetLimit;
240
+ if (filter && Object.keys(filter).length)
241
+ body.filter = filter;
242
+ const r = await this.#t.call('/v1/search/query', body);
243
+ if (!r || !Array.isArray(r.hits))
244
+ throw new CipherError('PROTOCOL_ERROR', 'malformed search response');
245
+ return {
246
+ hits: r.hits.map((h) => ({
247
+ id: h.id,
248
+ ...(typeof h.score === 'number' ? { score: h.score } : {}),
249
+ ...(h.fields ? { fields: h.fields } : {}),
250
+ ...(h.highlights && Object.keys(h.highlights).length ? { highlights: h.highlights } : {}),
251
+ })),
252
+ total: r.total,
253
+ facets: r.facets ?? {},
254
+ tookMs: r.took_ms,
255
+ };
256
+ }
257
+ }
258
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,103 @@
1
1
  {
2
2
  "name": "@northstartech/cipher",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Northstar Cipher SDK: field-level encryption backed by attested enclaves, for Node.js and browsers.",
5
+ "license": "SEE LICENSE IN LICENSE",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./prisma": {
15
+ "types": "./dist/integrations/prisma.d.ts",
16
+ "import": "./dist/integrations/prisma.js"
17
+ },
18
+ "./sequelize": {
19
+ "types": "./dist/integrations/sequelize.d.ts",
20
+ "import": "./dist/integrations/sequelize.js"
21
+ },
22
+ "./mongoose": {
23
+ "types": "./dist/integrations/mongoose.d.ts",
24
+ "import": "./dist/integrations/mongoose.js"
25
+ },
26
+ "./drizzle": {
27
+ "types": "./dist/integrations/drizzle.d.ts",
28
+ "import": "./dist/integrations/drizzle.js"
29
+ },
30
+ "./typeorm": {
31
+ "types": "./dist/integrations/typeorm.d.ts",
32
+ "import": "./dist/integrations/typeorm.js"
33
+ }
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "README.md",
38
+ "LICENSE"
39
+ ],
40
+ "engines": {
41
+ "node": ">=20"
42
+ },
43
+ "sideEffects": false,
44
+ "scripts": {
45
+ "build": "tsc -p tsconfig.build.json",
46
+ "test": "vitest run",
47
+ "prepare": "npm run build",
48
+ "prepublishOnly": "npm test && npm run build"
49
+ },
50
+ "dependencies": {
51
+ "@hpke/core": "1.9.0",
52
+ "@hpke/hybridkem-x-wing": "0.7.0"
53
+ },
54
+ "peerDependencies": {
55
+ "@prisma/client": "^7.0.0",
56
+ "drizzle-orm": ">=0.45.0 <1.0.0",
57
+ "mongoose": "^9.0.0",
58
+ "sequelize": "^6.37.0",
59
+ "typeorm": "^1.0.0"
60
+ },
61
+ "peerDependenciesMeta": {
62
+ "@prisma/client": {
63
+ "optional": true
64
+ },
65
+ "drizzle-orm": {
66
+ "optional": true
67
+ },
68
+ "mongoose": {
69
+ "optional": true
70
+ },
71
+ "sequelize": {
72
+ "optional": true
73
+ },
74
+ "typeorm": {
75
+ "optional": true
76
+ }
77
+ },
78
+ "devDependencies": {
79
+ "@prisma/adapter-pg": "7.10.0",
80
+ "@prisma/client": "7.10.0",
81
+ "@types/better-sqlite3": "7.6.13",
82
+ "@types/node": "22.20.5",
83
+ "@types/pg": "8.23.1",
84
+ "better-sqlite3": "12.11.1",
85
+ "drizzle-orm": "0.45.3",
86
+ "mongodb-memory-server": "11.3.0",
87
+ "mongoose": "9.10.2",
88
+ "pg": "8.23.0",
89
+ "pg-hstore": "2.3.4",
90
+ "prisma": "7.10.0",
91
+ "reflect-metadata": "0.2.2",
92
+ "sequelize": "6.37.8",
93
+ "sqlite3": "6.0.1",
94
+ "typeorm": "1.1.1",
95
+ "typescript": "5.9.3",
96
+ "vitest": "3.2.7"
97
+ },
98
+ "homepage": "https://bynorthstar.tech/cipher/",
99
+ "publishConfig": {
100
+ "access": "public",
101
+ "provenance": false
102
+ }
103
+ }