@formancy/server-core 0.2.0 → 0.3.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/dist/index.d.mts +141 -75
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +222 -189
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CHALLENGE_TTL_SECONDS, Challenge, DEFAULT_MAX_NUMBER, Solution, VerifyOutcome, decodeSolution, encodeSolution, hashOf, mintChallenge, solveChallenge, verifySolution } from "@formancy/challenge";
|
|
2
2
|
import { Change, FormSchema } from "@formancy/spec";
|
|
3
|
+
import { CapabilitySource, Check } from "@formancy/core";
|
|
3
4
|
import { SchemaError } from "@formancy/spec/validate";
|
|
4
|
-
import { CapabilitySource } from "@formancy/core";
|
|
5
5
|
//#region src/options-membership.d.ts
|
|
6
6
|
/**
|
|
7
7
|
* Checking that a sourced answer is one the deployment's own source offers.
|
|
@@ -606,41 +606,6 @@ interface WebhookHealth {
|
|
|
606
606
|
}
|
|
607
607
|
export declare function healthOf(webhook: WebhookRecord, now: Date): WebhookHealth;
|
|
608
608
|
//#endregion
|
|
609
|
-
//#region src/redos.d.ts
|
|
610
|
-
/**
|
|
611
|
-
* Refuse a form whose `pattern` values can be made to backtrack.
|
|
612
|
-
*
|
|
613
|
-
* A form author supplies these, and the server runs them against whatever a
|
|
614
|
-
* submitter typed. That makes a regular expression an author-side denial of
|
|
615
|
-
* service vector: one bad pattern, published once, and every submission after
|
|
616
|
-
* it can be turned into unbounded CPU by anyone who can reach the form.
|
|
617
|
-
*
|
|
618
|
-
* Checked at PUBLISH time rather than at match time, because there is no way
|
|
619
|
-
* to time out a JavaScript regular expression once it has started. The only
|
|
620
|
-
* moment the cost can be refused is before the pattern is stored.
|
|
621
|
-
*
|
|
622
|
-
* The check is static — `recheck` analyses the expression rather than running
|
|
623
|
-
* it — so it costs nothing per submission, and it found a polynomial case in
|
|
624
|
-
* formancy's own built-in email format before it was ever pointed at a user's.
|
|
625
|
-
*/
|
|
626
|
-
interface UnsafePattern {
|
|
627
|
-
/** Data path of the field carrying it, e.g. `contacts[].code`. */
|
|
628
|
-
path: string;
|
|
629
|
-
pattern: string;
|
|
630
|
-
/** `exponential` or `polynomial`, with the degree where there is one. */
|
|
631
|
-
complexity: string;
|
|
632
|
-
}
|
|
633
|
-
/**
|
|
634
|
-
* The patterns in this schema that an attacker could exploit, or an empty array
|
|
635
|
-
* when there are none.
|
|
636
|
-
*
|
|
637
|
-
* A pattern `recheck` cannot decide about is ACCEPTED. Refusing on `unknown`
|
|
638
|
-
* would make publishing depend on an analysis timeout, which is a worse failure
|
|
639
|
-
* than the one being prevented — an author whose legitimate form stops
|
|
640
|
-
* publishing intermittently has no way to act on that.
|
|
641
|
-
*/
|
|
642
|
-
export declare function unsafePatterns(schema: FormSchema): Promise<UnsafePattern[]>;
|
|
643
|
-
//#endregion
|
|
644
609
|
//#region src/use-cases.d.ts
|
|
645
610
|
/**
|
|
646
611
|
* The backend's use-cases, framework-free.
|
|
@@ -653,6 +618,15 @@ interface ServerDeps {
|
|
|
653
618
|
storage: Storage;
|
|
654
619
|
newId(): string;
|
|
655
620
|
nowIso(): string;
|
|
621
|
+
/**
|
|
622
|
+
* Validators this deployment answers, by the name a `check` rule gives.
|
|
623
|
+
*
|
|
624
|
+
* The same shape `optionsSources` takes, and the same rule: the document names
|
|
625
|
+
* a check, the deployment says how to answer it, and nothing in the engine
|
|
626
|
+
* fetches anything. A check a document names and a deployment has not supplied
|
|
627
|
+
* fails the field closed.
|
|
628
|
+
*/
|
|
629
|
+
checks?: Record<string, Check>;
|
|
656
630
|
/** The clock/randomness the ENGINE sees during replay. */
|
|
657
631
|
capabilities: CapabilitySource;
|
|
658
632
|
/**
|
|
@@ -681,45 +655,6 @@ interface ServerDeps {
|
|
|
681
655
|
*/
|
|
682
656
|
optionsSources?: ServerOptionsSources;
|
|
683
657
|
}
|
|
684
|
-
type PublishOutcome = {
|
|
685
|
-
ok: true;
|
|
686
|
-
formId: string;
|
|
687
|
-
versionId: string;
|
|
688
|
-
version: number;
|
|
689
|
-
schemaHash: string;
|
|
690
|
-
} | {
|
|
691
|
-
ok: false;
|
|
692
|
-
kind: 'invalid_schema';
|
|
693
|
-
errors?: SchemaError[];
|
|
694
|
-
} | {
|
|
695
|
-
ok: false;
|
|
696
|
-
kind: 'invalid_logic';
|
|
697
|
-
message: string;
|
|
698
|
-
} | {
|
|
699
|
-
ok: false;
|
|
700
|
-
kind: 'unsafe_pattern';
|
|
701
|
-
patterns: UnsafePattern[];
|
|
702
|
-
} |
|
|
703
|
-
/** The document names a list this deployment has never heard of. */
|
|
704
|
-
{
|
|
705
|
-
ok: false;
|
|
706
|
-
kind: 'unknown_options_source';
|
|
707
|
-
sources: string[];
|
|
708
|
-
};
|
|
709
|
-
/**
|
|
710
|
-
* Publish a schema as a form's next version.
|
|
711
|
-
*
|
|
712
|
-
* This is the save gate: structural validation, then the ENGINE's own compile
|
|
713
|
-
* — type-checked expressions, kind policies and the cycle graph — so a form
|
|
714
|
-
* that can loop or read a ghost field is refused here and never persisted.
|
|
715
|
-
* Republishing the identical document is idempotent, because "deploy again"
|
|
716
|
-
* must never manufacture a version.
|
|
717
|
-
*/
|
|
718
|
-
export declare function publishForm(deps: ServerDeps, input: {
|
|
719
|
-
path: string;
|
|
720
|
-
schema: unknown;
|
|
721
|
-
actor?: Actor;
|
|
722
|
-
}): Promise<PublishOutcome>;
|
|
723
658
|
interface ResolvedForm {
|
|
724
659
|
formId: string;
|
|
725
660
|
versionId: string;
|
|
@@ -889,6 +824,41 @@ interface ListedVersion {
|
|
|
889
824
|
* view rendering fifty full schemas would be its own denial of service. */
|
|
890
825
|
export declare function listVersions(deps: ServerDeps, path: string): Promise<ListedVersion[] | undefined>;
|
|
891
826
|
//#endregion
|
|
827
|
+
//#region src/redos.d.ts
|
|
828
|
+
/**
|
|
829
|
+
* Refuse a form whose `pattern` values can be made to backtrack.
|
|
830
|
+
*
|
|
831
|
+
* A form author supplies these, and the server runs them against whatever a
|
|
832
|
+
* submitter typed. That makes a regular expression an author-side denial of
|
|
833
|
+
* service vector: one bad pattern, published once, and every submission after
|
|
834
|
+
* it can be turned into unbounded CPU by anyone who can reach the form.
|
|
835
|
+
*
|
|
836
|
+
* Checked at PUBLISH time rather than at match time, because there is no way
|
|
837
|
+
* to time out a JavaScript regular expression once it has started. The only
|
|
838
|
+
* moment the cost can be refused is before the pattern is stored.
|
|
839
|
+
*
|
|
840
|
+
* The check is static — `recheck` analyses the expression rather than running
|
|
841
|
+
* it — so it costs nothing per submission, and it found a polynomial case in
|
|
842
|
+
* formancy's own built-in email format before it was ever pointed at a user's.
|
|
843
|
+
*/
|
|
844
|
+
interface UnsafePattern {
|
|
845
|
+
/** Data path of the field carrying it, e.g. `contacts[].code`. */
|
|
846
|
+
path: string;
|
|
847
|
+
pattern: string;
|
|
848
|
+
/** `exponential` or `polynomial`, with the degree where there is one. */
|
|
849
|
+
complexity: string;
|
|
850
|
+
}
|
|
851
|
+
/**
|
|
852
|
+
* The patterns in this schema that an attacker could exploit, or an empty array
|
|
853
|
+
* when there are none.
|
|
854
|
+
*
|
|
855
|
+
* A pattern `recheck` cannot decide about is ACCEPTED. Refusing on `unknown`
|
|
856
|
+
* would make publishing depend on an analysis timeout, which is a worse failure
|
|
857
|
+
* than the one being prevented — an author whose legitimate form stops
|
|
858
|
+
* publishing intermittently has no way to act on that.
|
|
859
|
+
*/
|
|
860
|
+
export declare function unsafePatterns(schema: FormSchema): Promise<UnsafePattern[]>;
|
|
861
|
+
//#endregion
|
|
892
862
|
//#region src/testing/memory-storage.d.ts
|
|
893
863
|
/**
|
|
894
864
|
* The in-memory Storage — the second implementation that keeps the port
|
|
@@ -1093,5 +1063,101 @@ export declare function collectAbandonedFiles(storage: Storage, now: Date, after
|
|
|
1093
1063
|
/** Re-exported so a host can see which paths a schema's file fields live at. */
|
|
1094
1064
|
export declare function fileFieldPaths(schema: FormSchema): string[];
|
|
1095
1065
|
//#endregion
|
|
1066
|
+
//#region src/publishing.d.ts
|
|
1067
|
+
/**
|
|
1068
|
+
* Publishing a form: the save gate, and who may overwrite whom.
|
|
1069
|
+
*
|
|
1070
|
+
* Its own file because `use-cases.ts` had become the place every family went,
|
|
1071
|
+
* and the size budget refused the next thing added to it — the entry already
|
|
1072
|
+
* said the seam was one use-case family per file, and this is the family.
|
|
1073
|
+
*/
|
|
1074
|
+
type PublishOutcome = {
|
|
1075
|
+
ok: true;
|
|
1076
|
+
formId: string;
|
|
1077
|
+
versionId: string;
|
|
1078
|
+
version: number;
|
|
1079
|
+
schemaHash: string;
|
|
1080
|
+
/**
|
|
1081
|
+
* Things worth telling the publisher that are not grounds to refuse.
|
|
1082
|
+
*
|
|
1083
|
+
* Always present, empty when there is nothing to say, so a caller reads a
|
|
1084
|
+
* list rather than branching on whether there is one. Sentences rather
|
|
1085
|
+
* than codes: the only consumers are a person reading a CLI, an admin
|
|
1086
|
+
* screen or a log, and a code would need a catalogue nobody would write
|
|
1087
|
+
* ([0097](../../../docs/decisions/0097-a-publish-may-warn.md)).
|
|
1088
|
+
*/
|
|
1089
|
+
warnings: readonly string[];
|
|
1090
|
+
} | {
|
|
1091
|
+
ok: false;
|
|
1092
|
+
kind: 'invalid_schema';
|
|
1093
|
+
errors?: SchemaError[];
|
|
1094
|
+
} | {
|
|
1095
|
+
ok: false;
|
|
1096
|
+
kind: 'invalid_logic';
|
|
1097
|
+
message: string;
|
|
1098
|
+
} | {
|
|
1099
|
+
ok: false;
|
|
1100
|
+
kind: 'unsafe_pattern';
|
|
1101
|
+
patterns: UnsafePattern[];
|
|
1102
|
+
} |
|
|
1103
|
+
/** The document names a list this deployment has never heard of. */
|
|
1104
|
+
{
|
|
1105
|
+
ok: false;
|
|
1106
|
+
kind: 'unknown_options_source';
|
|
1107
|
+
sources: string[];
|
|
1108
|
+
} |
|
|
1109
|
+
/**
|
|
1110
|
+
* Somebody else published while this editor was editing.
|
|
1111
|
+
*
|
|
1112
|
+
* The same kind and the same body the submission path uses, deliberately: a
|
|
1113
|
+
* client that already knows how to handle one stale version handles both.
|
|
1114
|
+
*/
|
|
1115
|
+
{
|
|
1116
|
+
ok: false;
|
|
1117
|
+
kind: 'version_changed';
|
|
1118
|
+
current?: ResolvedForm;
|
|
1119
|
+
} |
|
|
1120
|
+
/**
|
|
1121
|
+
* This exact document is already a version of this form, and not the current
|
|
1122
|
+
* one — somebody republishing an older version to undo a bad publish.
|
|
1123
|
+
*
|
|
1124
|
+
* `UNIQUE (form_id, schema_hash)` is what makes republishing the CURRENT
|
|
1125
|
+
* document idempotent rather than a version factory, and it refuses this too:
|
|
1126
|
+
* without this branch the insert raised and the route answered **500**. A
|
|
1127
|
+
* published version is immutable and cannot be published twice
|
|
1128
|
+
* ([0025](../../../docs/decisions/0025-immutability-in-the-database.md)), so
|
|
1129
|
+
* the honest answer names the version it already is.
|
|
1130
|
+
*/
|
|
1131
|
+
{
|
|
1132
|
+
ok: false;
|
|
1133
|
+
kind: 'already_published';
|
|
1134
|
+
version: number;
|
|
1135
|
+
};
|
|
1136
|
+
/**
|
|
1137
|
+
* Publish a schema as a form's next version.
|
|
1138
|
+
*
|
|
1139
|
+
* This is the save gate: structural validation, then the ENGINE's own compile
|
|
1140
|
+
* — type-checked expressions, kind policies and the cycle graph — so a form
|
|
1141
|
+
* that can loop or read a ghost field is refused here and never persisted.
|
|
1142
|
+
* Republishing the identical document is idempotent, because "deploy again"
|
|
1143
|
+
* must never manufacture a version.
|
|
1144
|
+
*/
|
|
1145
|
+
export declare function publishForm(deps: ServerDeps, input: {
|
|
1146
|
+
path: string;
|
|
1147
|
+
schema: unknown;
|
|
1148
|
+
actor?: Actor;
|
|
1149
|
+
/**
|
|
1150
|
+
* The hash of the version this edit started from, when there was one.
|
|
1151
|
+
*
|
|
1152
|
+
* **Optional, and that is the decision.** A script, the CLI and an agent
|
|
1153
|
+
* publish a document they composed rather than one they opened, and have
|
|
1154
|
+
* nothing to declare; requiring it would make every one of them read the
|
|
1155
|
+
* current version first to satisfy a rule about editors. What declares is
|
|
1156
|
+
* the thing that OPENED a version — the builder — and declaring is how it
|
|
1157
|
+
* asks to be told it has been overtaken.
|
|
1158
|
+
*/
|
|
1159
|
+
basedOnSchemaHash?: string;
|
|
1160
|
+
}): Promise<PublishOutcome>;
|
|
1161
|
+
//#endregion
|
|
1096
1162
|
export { type Action, type Actor, type AttemptOutcome, type AuditAction, type AuditDraft, type AuditEntry, type AuthDeps, type AuthOutcome, type BreakerState, CHALLENGE_TTL_SECONDS, type Challenge, type ClaimOutcome, DEFAULT_MAX_NUMBER, type DeliveryHeaders, type DeliveryRecord, type DraftMigration, type DraftRecord, type FileRecord, type FormRecord, type FormVersionRecord, type ListedForm, type ListedSubmission, type ListedVersion, type MembershipOutcome, type OfferDeps, type OfferInput, type OfferOutcome, type OutboxDeps, type PublishOutcome, type ReplayOutcome, type ResolvedForm, type ResumeOutcome, type Role, type ServerDeps, type ServerOptionsSource, type ServerOptionsSources, type Solution, type Storage, type SubmissionOutcome, type SubmissionRecord, type UnsafePattern, type VerifyOutcome, type WebhookHealth, type WebhookRecord, decodeSolution, encodeSolution, hashOf, mintChallenge, solveChallenge, verifySolution };
|
|
1097
1163
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/options-membership.ts","../src/ports.ts","../src/auth.ts","../src/audit.ts","../src/outbox.ts","../src/breaker.ts","../src/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/options-membership.ts","../src/ports.ts","../src/auth.ts","../src/audit.ts","../src/outbox.ts","../src/breaker.ts","../src/use-cases.ts","../src/redos.ts","../src/testing/memory-storage.ts","../src/address.ts","../src/webhook.ts","../src/uploads.ts","../src/publishing.ts"],"mappings":"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"}
|