@miiajs/papr 0.1.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ruslan Matiushev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # @miiajs/papr
2
+
3
+ MongoDB integration via Papr for MiiaJS.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @miiajs/papr mongodb papr
9
+ ```
10
+
11
+ ## Documentation
12
+
13
+ **[miiajs.com/docs/packages/papr](https://miiajs.com/docs/packages/papr)**
14
+
15
+ ## License
16
+
17
+ MIT
@@ -0,0 +1,8 @@
1
+ import { Logger } from '@miiajs/core';
2
+ export interface ConnectionResult {
3
+ client: any;
4
+ db: any;
5
+ }
6
+ export declare function createConnection(url: string, logger: Logger, dbName?: string): Promise<ConnectionResult>;
7
+ export declare function closeConnection(client: any): Promise<void>;
8
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,GAAG,CAAA;IACX,EAAE,EAAE,GAAG,CAAA;CACR;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgB9G;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE"}
@@ -0,0 +1,18 @@
1
+ import { Logger } from '@miiajs/core';
2
+ export async function createConnection(url, logger, dbName) {
3
+ const { MongoClient } = await import('mongodb');
4
+ const client = new MongoClient(url, {
5
+ monitorCommands: true,
6
+ });
7
+ client.on('commandStarted', (event) => {
8
+ logger.debug(`${event.commandName} ${JSON.stringify(event.command)}`);
9
+ });
10
+ await client.connect();
11
+ const db = dbName ? client.db(dbName) : client.db();
12
+ await db.command({ ping: 1 });
13
+ return { client, db };
14
+ }
15
+ export async function closeConnection(client) {
16
+ await client.close();
17
+ }
18
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAOrC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,MAAc,EAAE,MAAe;IACjF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;IAE/C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE;QAClC,eAAe,EAAE,IAAI;KACtB,CAAC,CAAA;IAEF,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAU,EAAE,EAAE;QACzC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;IACtB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAA;IACnD,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;IAE7B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAW;IAC/C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;AACtB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Default number of connection attempts before giving up.
3
+ * Override via PaprModuleOptions.connection.retry.attempts.
4
+ */
5
+ export declare const DEFAULT_RETRY_ATTEMPTS = 3;
6
+ /**
7
+ * Default delay (ms) between connection retries.
8
+ * Override via PaprModuleOptions.connection.retry.delay.
9
+ */
10
+ export declare const DEFAULT_RETRY_DELAY = 2000;
11
+ /**
12
+ * Node.js network error codes considered retryable during connection.
13
+ * Non-retryable errors (e.g. auth failure) abort immediately.
14
+ */
15
+ export declare const RETRYABLE_CODES: ReadonlySet<string>;
16
+ /** Logger context tag for this package. */
17
+ export declare const LOGGER_CONTEXT = "PaprModule";
18
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAA;AAEvC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,OAAQ,CAAA;AAExC;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAM9C,CAAA;AAEF,2CAA2C;AAC3C,eAAO,MAAM,cAAc,eAAe,CAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Default number of connection attempts before giving up.
3
+ * Override via PaprModuleOptions.connection.retry.attempts.
4
+ */
5
+ export const DEFAULT_RETRY_ATTEMPTS = 3;
6
+ /**
7
+ * Default delay (ms) between connection retries.
8
+ * Override via PaprModuleOptions.connection.retry.delay.
9
+ */
10
+ export const DEFAULT_RETRY_DELAY = 2_000;
11
+ /**
12
+ * Node.js network error codes considered retryable during connection.
13
+ * Non-retryable errors (e.g. auth failure) abort immediately.
14
+ */
15
+ export const RETRYABLE_CODES = new Set([
16
+ 'ECONNREFUSED',
17
+ 'ECONNRESET',
18
+ 'ETIMEDOUT',
19
+ 'ENOTFOUND',
20
+ 'EAI_AGAIN',
21
+ ]);
22
+ /** Logger context tag for this package. */
23
+ export const LOGGER_CONTEXT = 'PaprModule';
24
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAA;AAEvC;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAA;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC;IAC1D,cAAc;IACd,YAAY;IACZ,WAAW;IACX,WAAW;IACX,WAAW;CACZ,CAAC,CAAA;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { BaseSchema, Model, SchemaOptions } from 'papr';
2
+ export type ModelToken<TSchema extends BaseSchema, TOptions extends SchemaOptions<TSchema>> = (new () => Model<TSchema, TOptions>) & {
3
+ readonly collectionName: string;
4
+ readonly schema: [TSchema, TOptions];
5
+ readonly __miiaPaprModel: true;
6
+ };
7
+ export declare function defineModel<TSchema extends BaseSchema, TOptions extends SchemaOptions<TSchema>>(collectionName: string, schema: [TSchema, TOptions]): ModelToken<TSchema, TOptions>;
8
+ //# sourceMappingURL=define-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-model.d.ts","sourceRoot":"","sources":["../src/define-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAE5D,MAAM,MAAM,UAAU,CAAC,OAAO,SAAS,UAAU,EAAE,QAAQ,SAAS,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,KAAK,CAC5G,OAAO,EACP,QAAQ,CACT,CAAC,GAAG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACpC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAA;CAC/B,CAAA;AAMD,wBAAgB,WAAW,CAAC,OAAO,SAAS,UAAU,EAAE,QAAQ,SAAS,aAAa,CAAC,OAAO,CAAC,EAC7F,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,GAC1B,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAQ/B"}
@@ -0,0 +1,14 @@
1
+ // defineModel не мемоізується: identity = export site (один раз на колекцію).
2
+ // Повторний defineModel('users', schema) свідомо створює окремий токен -
3
+ // для multi-connection use-case. Колізія колекцій ловиться runtime у
4
+ // PaprService.onInit, cross-registry колізія - через console.warn у register().
5
+ export function defineModel(collectionName, schema) {
6
+ const Token = class {
7
+ static collectionName = collectionName;
8
+ static schema = schema;
9
+ static __miiaPaprModel = true;
10
+ };
11
+ Object.defineProperty(Token, 'name', { value: `PaprModel(${collectionName})` });
12
+ return Token;
13
+ }
14
+ //# sourceMappingURL=define-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-model.js","sourceRoot":"","sources":["../src/define-model.ts"],"names":[],"mappings":"AAWA,8EAA8E;AAC9E,yEAAyE;AACzE,qEAAqE;AACrE,gFAAgF;AAChF,MAAM,UAAU,WAAW,CACzB,cAAsB,EACtB,MAA2B;IAE3B,MAAM,KAAK,GAAG;QACZ,MAAM,CAAC,cAAc,GAAG,cAAc,CAAA;QACtC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;QACtB,MAAM,CAAC,eAAe,GAAG,IAAa,CAAA;KACvC,CAAA;IACD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,aAAa,cAAc,GAAG,EAAE,CAAC,CAAA;IAC/E,OAAO,KAAiD,CAAA;AAC1D,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { PaprModule } from './papr.module.js';
2
+ export { defineModel } from './define-model.js';
3
+ export { paprDb } from './tokens.js';
4
+ export type { PaprModuleOptions, ModelToken, PaprDbToken } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { PaprModule } from './papr.module.js';
2
+ export { defineModel } from './define-model.js';
3
+ export { paprDb } from './tokens.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { ConfiguredModule, OptionsOrFactory } from '@miiajs/core';
2
+ import type { PaprModuleOptions } from './types.js';
3
+ import type { ModelToken } from './define-model.js';
4
+ export declare class PaprModule {
5
+ static configure(optionsOrFactory: OptionsOrFactory<PaprModuleOptions>, name?: string): ConfiguredModule;
6
+ static register(models: ModelToken<any, any>[], name?: string): ConfiguredModule;
7
+ }
8
+ //# sourceMappingURL=papr.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"papr.module.d.ts","sourceRoot":"","sources":["../src/papr.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAgC,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAIpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AA8DnD,qBAAa,UAAU;IACrB,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB;IAgCxG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB;CA8BjF"}
@@ -0,0 +1,110 @@
1
+ import { resolveOptions } from '@miiajs/core';
2
+ import { PaprService } from './papr.service.js';
3
+ import { getInternalServiceToken, getRegistryToken, paprDb } from './tokens.js';
4
+ // ─── Lazy proxies ────────────────────────────────────────────────────────────
5
+ // PaprService.onInit happens AFTER provider factories run, so we can't return a
6
+ // real Db / Model from the factory. Instead, we return a Proxy that defers the
7
+ // underlying lookup until first property access.
8
+ function createLazyProxy(get) {
9
+ let cached;
10
+ const resolve = () => (cached ??= get());
11
+ return new Proxy({}, {
12
+ get(_, prop) {
13
+ const target = resolve();
14
+ const value = target[prop];
15
+ return typeof value === 'function' ? value.bind(target) : value;
16
+ },
17
+ has(_, prop) {
18
+ return prop in resolve();
19
+ },
20
+ ownKeys() {
21
+ return Reflect.ownKeys(resolve());
22
+ },
23
+ getOwnPropertyDescriptor(_, prop) {
24
+ return Object.getOwnPropertyDescriptor(resolve(), prop);
25
+ },
26
+ });
27
+ }
28
+ // ─── Cross-connection collision warning ──────────────────────────────────────
29
+ // Module-level WeakMap. If the same ModelToken is registered under two different
30
+ // connection names, log a warning - this is almost certainly a bug (the same
31
+ // token can only resolve to one provider at a time per container).
32
+ const seenTokens = new WeakMap();
33
+ function checkCrossConnectionCollision(models, conn) {
34
+ for (const token of models) {
35
+ const previous = seenTokens.get(token);
36
+ if (previous !== undefined && previous !== conn) {
37
+ const fmt = (n) => (n === '' ? 'default' : n);
38
+ console.warn(`[Miia/Papr] Token ${token.name} registered in connections "${fmt(previous)}" and "${fmt(conn)}". ` +
39
+ `Use a separate defineModel(...) per connection.`);
40
+ }
41
+ seenTokens.set(token, conn);
42
+ }
43
+ }
44
+ // ─── Friendly error helpers ──────────────────────────────────────────────────
45
+ function configureMissingError(name, suffix) {
46
+ return new Error(`[Miia/Papr] ${suffix} ` +
47
+ `PaprModule.configure() is missing in the root module${name ? ` for connection "${name}"` : ''}.`);
48
+ }
49
+ // ─── PaprModule ──────────────────────────────────────────────────────────────
50
+ export class PaprModule {
51
+ static configure(optionsOrFactory, name) {
52
+ const serviceToken = getInternalServiceToken(name);
53
+ const registryToken = getRegistryToken(name);
54
+ const dbToken = paprDb(name);
55
+ const ModuleClass = name ? class PaprNamedModule {
56
+ } : PaprModule;
57
+ return {
58
+ module: ModuleClass,
59
+ providers: [
60
+ {
61
+ token: registryToken,
62
+ factory: () => new Map(),
63
+ },
64
+ {
65
+ token: serviceToken,
66
+ factory: (resolve) => {
67
+ const options = resolveOptions(optionsOrFactory, { resolve });
68
+ const registry = resolve(registryToken);
69
+ return new PaprService(options, registry);
70
+ },
71
+ },
72
+ {
73
+ token: dbToken,
74
+ factory: (resolve) => {
75
+ return createLazyProxy(() => resolve(serviceToken).db);
76
+ },
77
+ },
78
+ ],
79
+ };
80
+ }
81
+ static register(models, name) {
82
+ const serviceToken = getInternalServiceToken(name);
83
+ const registryToken = getRegistryToken(name);
84
+ const conn = name ?? '';
85
+ checkCrossConnectionCollision(models, conn);
86
+ const FeatureModule = class PaprFeatureModule {
87
+ };
88
+ const providers = models.map((token) => ({
89
+ token,
90
+ factory: (resolve) => {
91
+ let service;
92
+ let registry;
93
+ try {
94
+ service = resolve(serviceToken);
95
+ registry = resolve(registryToken);
96
+ }
97
+ catch {
98
+ throw configureMissingError(name, `inject(${token.name}) failed:`);
99
+ }
100
+ registry.set(token, token);
101
+ return createLazyProxy(() => service.getModel(token));
102
+ },
103
+ }));
104
+ return {
105
+ module: FeatureModule,
106
+ providers,
107
+ };
108
+ }
109
+ }
110
+ //# sourceMappingURL=papr.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"papr.module.js","sourceRoot":"","sources":["../src/papr.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Db } from 'mongodb';
2
+ import type { Model } from 'papr';
3
+ import type { PaprModuleOptions } from './types.js';
4
+ import type { ModelToken } from './define-model.js';
5
+ /**
6
+ * Internal lifecycle owner for a PaprModule connection. NOT exported from the
7
+ * package index. Users interact with @miiajs/papr through `inject(User)` /
8
+ * `inject(paprDb())` only.
9
+ *
10
+ * Holds the MongoClient, mongodb Db, Papr instance, and the per-token
11
+ * Model<TDoc, TOpts> map. Resolved by per-model providers in PaprModule.register()
12
+ * and the db-token provider in PaprModule.configure().
13
+ */
14
+ export declare class PaprService {
15
+ private readonly options;
16
+ private readonly registry;
17
+ private logger;
18
+ private client;
19
+ private _db;
20
+ private _papr;
21
+ private _models;
22
+ constructor(options: PaprModuleOptions, registry: Map<ModelToken<any, any>, ModelToken<any, any>>);
23
+ get db(): Db;
24
+ getModel(token: ModelToken<any, any>): Model<any, any>;
25
+ onInit(): Promise<void>;
26
+ onDestroy(): Promise<void>;
27
+ private assertNoCollectionCollision;
28
+ }
29
+ //# sourceMappingURL=papr.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"papr.service.d.ts","sourceRoot":"","sources":["../src/papr.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAe,MAAM,SAAS,CAAA;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,MAAM,CAAA;AACjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAInD;;;;;;;;GAQG;AACH,qBAAa,WAAW;IAQpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAAmD;gBAG/C,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAG5E,IAAI,EAAE,IAAI,EAAE,CAKX;IAED,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;IAWhD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDvB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC,OAAO,CAAC,2BAA2B;CAcpC"}
@@ -0,0 +1,110 @@
1
+ import { Logger } from '@miiajs/core';
2
+ import { createConnection, closeConnection } from './connection.js';
3
+ import { DEFAULT_RETRY_ATTEMPTS, DEFAULT_RETRY_DELAY, LOGGER_CONTEXT, RETRYABLE_CODES } from './constants.js';
4
+ /**
5
+ * Internal lifecycle owner for a PaprModule connection. NOT exported from the
6
+ * package index. Users interact with @miiajs/papr through `inject(User)` /
7
+ * `inject(paprDb())` only.
8
+ *
9
+ * Holds the MongoClient, mongodb Db, Papr instance, and the per-token
10
+ * Model<TDoc, TOpts> map. Resolved by per-model providers in PaprModule.register()
11
+ * and the db-token provider in PaprModule.configure().
12
+ */
13
+ export class PaprService {
14
+ options;
15
+ registry;
16
+ logger = new Logger(LOGGER_CONTEXT);
17
+ client = null;
18
+ _db = null;
19
+ _papr = null;
20
+ _models = new Map();
21
+ constructor(options, registry) {
22
+ this.options = options;
23
+ this.registry = registry;
24
+ }
25
+ get db() {
26
+ if (!this._db) {
27
+ throw new Error('[Miia/Papr] Not connected. Ensure app.init() was called.');
28
+ }
29
+ return this._db;
30
+ }
31
+ getModel(token) {
32
+ const m = this._models.get(token);
33
+ if (!m) {
34
+ throw new Error(`[Miia/Papr] Model "${token.collectionName}" not initialized. ` +
35
+ `Did you forget to register it with PaprModule.register([${token.name}])?`);
36
+ }
37
+ return m;
38
+ }
39
+ async onInit() {
40
+ this.assertNoCollectionCollision();
41
+ const attempts = this.options.connection.retry?.attempts ?? DEFAULT_RETRY_ATTEMPTS;
42
+ const delay = this.options.connection.retry?.delay ?? DEFAULT_RETRY_DELAY;
43
+ for (let i = 1; i <= attempts; i++) {
44
+ let client = null;
45
+ try {
46
+ const conn = await createConnection(this.options.connection.url, this.logger, this.options.connection.dbName);
47
+ client = conn.client;
48
+ this.client = conn.client;
49
+ this._db = conn.db;
50
+ const PaprDefault = (await import('papr')).default;
51
+ const papr = new PaprDefault();
52
+ for (const token of this.registry.values()) {
53
+ const model = papr.model(token.collectionName, token.schema);
54
+ this._models.set(token, model);
55
+ }
56
+ papr.initialize(conn.db);
57
+ await papr.updateSchemas();
58
+ this._papr = papr;
59
+ return;
60
+ }
61
+ catch (error) {
62
+ // Resource leak fix: close client if connect succeeded but a later
63
+ // step (model creation, updateSchemas, etc) failed.
64
+ if (client) {
65
+ try {
66
+ await closeConnection(client);
67
+ }
68
+ catch {
69
+ // swallow - we're already in an error path
70
+ }
71
+ this.client = null;
72
+ this._db = null;
73
+ this._models.clear();
74
+ }
75
+ const code = error?.code ?? error?.cause?.code;
76
+ const retryable = code && RETRYABLE_CODES.has(code);
77
+ if (!retryable || i === attempts) {
78
+ this.logger.error(retryable ? `Failed to connect after ${attempts} attempts` : `Connection failed: ${error.message}`, error.stack);
79
+ throw error;
80
+ }
81
+ this.logger.error(`Database connection failed. Retrying (${i}/${attempts})...`);
82
+ await new Promise((resolve) => setTimeout(resolve, delay));
83
+ }
84
+ }
85
+ }
86
+ async onDestroy() {
87
+ this.logger.log('Disconnecting from MongoDB...');
88
+ if (this.client) {
89
+ await closeConnection(this.client);
90
+ }
91
+ this._db = null;
92
+ this._papr = null;
93
+ this._models.clear();
94
+ this.client = null;
95
+ this.logger.log('Disconnected from MongoDB');
96
+ }
97
+ assertNoCollectionCollision() {
98
+ const seen = new Map();
99
+ for (const token of this.registry.values()) {
100
+ const previous = seen.get(token.collectionName);
101
+ if (previous && previous !== token) {
102
+ throw new Error(`[Miia/Papr] Two distinct ModelToken-s registered for the same collection ` +
103
+ `"${token.collectionName}" on the same connection. ` +
104
+ `Each collection must be defined once per connection.`);
105
+ }
106
+ seen.set(token.collectionName, token);
107
+ }
108
+ }
109
+ }
110
+ //# sourceMappingURL=papr.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"papr.service.js","sourceRoot":"","sources":["../src/papr.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Db } from 'mongodb';
2
+ export type PaprDbToken = new () => Db;
3
+ /**
4
+ * Returns a typed DI token for the raw mongodb `Db` of a PaprModule connection.
5
+ *
6
+ * - `paprDb()` - default connection.
7
+ * - `paprDb('analytics')` - named connection.
8
+ *
9
+ * Memoized by name: the same name always returns the same token,
10
+ * so DI identity is stable across modules.
11
+ */
12
+ export declare function paprDb(name?: string): PaprDbToken;
13
+ export declare function getInternalServiceToken(name?: string): string;
14
+ export declare function getRegistryToken(name?: string): string;
15
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAEjC,MAAM,MAAM,WAAW,GAAG,UAAU,EAAE,CAAA;AAItC;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAUjD;AAID,wBAAgB,uBAAuB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD"}
package/dist/tokens.js ADDED
@@ -0,0 +1,29 @@
1
+ const cache = new Map();
2
+ /**
3
+ * Returns a typed DI token for the raw mongodb `Db` of a PaprModule connection.
4
+ *
5
+ * - `paprDb()` - default connection.
6
+ * - `paprDb('analytics')` - named connection.
7
+ *
8
+ * Memoized by name: the same name always returns the same token,
9
+ * so DI identity is stable across modules.
10
+ */
11
+ export function paprDb(name) {
12
+ const key = name ?? '';
13
+ let cls = cache.get(key);
14
+ if (!cls) {
15
+ cls = class {
16
+ static __name = `paprDb(${name ?? 'default'})`;
17
+ };
18
+ cache.set(key, cls);
19
+ }
20
+ return cls;
21
+ }
22
+ // ─── Internal token helpers (not exported from package index) ─────────────
23
+ export function getInternalServiceToken(name) {
24
+ return name ? `__PAPR_SERVICE_${name}` : '__PAPR_SERVICE';
25
+ }
26
+ export function getRegistryToken(name) {
27
+ return name ? `__PAPR_REGISTRY_${name}` : '__PAPR_REGISTRY';
28
+ }
29
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAIA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAA;AAE5C;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAC,IAAa;IAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACxB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG;YACJ,MAAM,CAAU,MAAM,GAAG,UAAU,IAAI,IAAI,SAAS,GAAG,CAAA;SAC9B,CAAA;QAC3B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACrB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,6EAA6E;AAE7E,MAAM,UAAU,uBAAuB,CAAC,IAAa;IACnD,OAAO,IAAI,CAAC,CAAC,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,OAAO,IAAI,CAAC,CAAC,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAA;AAC7D,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface PaprModuleOptions {
2
+ connection: {
3
+ url: string;
4
+ dbName?: string;
5
+ retry?: {
6
+ attempts?: number;
7
+ delay?: number;
8
+ };
9
+ };
10
+ }
11
+ export type { ModelToken } from './define-model.js';
12
+ export type { PaprDbToken } from './tokens.js';
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE;QACV,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE;YACN,QAAQ,CAAC,EAAE,MAAM,CAAA;YACjB,KAAK,CAAC,EAAE,MAAM,CAAA;SACf,CAAA;KACF,CAAA;CACF;AAED,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@miiajs/papr",
3
+ "version": "0.1.0",
4
+ "author": "Ruslan Matiushev",
5
+ "license": "MIT",
6
+ "description": "MongoDB integration for MiiaJS via Papr.",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/miiajs/miia.git",
10
+ "directory": "packages/papr"
11
+ },
12
+ "homepage": "https://github.com/miiajs/miia/tree/main/packages/papr#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/miiajs/miia/issues"
15
+ },
16
+ "keywords": [
17
+ "miiajs",
18
+ "miia",
19
+ "papr",
20
+ "mongodb",
21
+ "odm"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "type": "module",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.js"
31
+ }
32
+ },
33
+ "main": "./dist/index.js",
34
+ "types": "./dist/index.d.ts",
35
+ "files": [
36
+ "dist",
37
+ "README.md",
38
+ "LICENSE"
39
+ ],
40
+ "sideEffects": false,
41
+ "engines": {
42
+ "node": ">=22.22.1",
43
+ "bun": ">=1.3.11",
44
+ "deno": ">=2.6.1"
45
+ },
46
+ "dependencies": {
47
+ "@miiajs/core": "workspace:*"
48
+ },
49
+ "peerDependencies": {
50
+ "mongodb": "^7.1.1",
51
+ "papr": "^17.0.0"
52
+ },
53
+ "scripts": {
54
+ "build": "tsc --build",
55
+ "clean": "tsc --build --clean"
56
+ },
57
+ "devDependencies": {
58
+ "mongodb": "^7.1.1",
59
+ "papr": "^17.0.0"
60
+ }
61
+ }