@ibgib/core-gib 0.1.57 → 0.1.58
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/keystone/keystone-config-builder.d.mts +12 -1
- package/dist/keystone/keystone-config-builder.d.mts.map +1 -1
- package/dist/keystone/keystone-config-builder.mjs +58 -4
- package/dist/keystone/keystone-config-builder.mjs.map +1 -1
- package/dist/keystone/keystone-constants.d.mts +40 -5
- package/dist/keystone/keystone-constants.d.mts.map +1 -1
- package/dist/keystone/keystone-constants.mjs +39 -5
- package/dist/keystone/keystone-constants.mjs.map +1 -1
- package/dist/keystone/keystone-helpers.d.mts +11 -1
- package/dist/keystone/keystone-helpers.d.mts.map +1 -1
- package/dist/keystone/keystone-helpers.mjs +37 -1
- package/dist/keystone/keystone-helpers.mjs.map +1 -1
- package/dist/keystone/keystone-policy-types.d.mts +23 -0
- package/dist/keystone/keystone-policy-types.d.mts.map +1 -0
- package/dist/keystone/keystone-policy-types.mjs +2 -0
- package/dist/keystone/keystone-policy-types.mjs.map +1 -0
- package/dist/sync/graft-info/graft-info-helpers.respec.mjs +8 -8
- package/dist/sync/graft-info/graft-info-helpers.respec.mjs.map +1 -1
- package/dist/sync/sync-conflict-adv-multitimelines.respec.mjs +22 -22
- package/dist/sync/sync-conflict-adv-multitimelines.respec.mjs.map +1 -1
- package/dist/sync/sync-conflict-basic-divergence.respec.mjs +3 -3
- package/dist/sync/sync-conflict-basic-divergence.respec.mjs.map +1 -1
- package/dist/sync/sync-conflict-basic-multitimelines.respec.mjs +6 -6
- package/dist/sync/sync-conflict-basic-multitimelines.respec.mjs.map +1 -1
- package/dist/sync/sync-conflict-text-merge.respec.mjs +26 -26
- package/dist/sync/sync-conflict-text-merge.respec.mjs.map +1 -1
- package/dist/sync/sync-helpers.d.mts +19 -0
- package/dist/sync/sync-helpers.d.mts.map +1 -1
- package/dist/sync/sync-helpers.mjs +51 -1
- package/dist/sync/sync-helpers.mjs.map +1 -1
- package/dist/sync/sync-innerspace-constants.respec.mjs +2 -2
- package/dist/sync/sync-innerspace-constants.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-deep-updates.respec.mjs +2 -2
- package/dist/sync/sync-innerspace-deep-updates.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-dest-ahead.respec.mjs +4 -4
- package/dist/sync/sync-innerspace-dest-ahead.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs +2 -2
- package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-partial-update.respec.mjs +3 -3
- package/dist/sync/sync-innerspace-partial-update.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace.respec.mjs +4 -4
- package/dist/sync/sync-innerspace.respec.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.d.mts +5 -0
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mjs +18 -0
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.d.mts +5 -0
- package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mjs +21 -3
- package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts +12 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs +34 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-types.d.mts +69 -1
- package/dist/sync/sync-peer/sync-peer-types.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-v1.d.mts +30 -0
- package/dist/sync/sync-peer/sync-peer-v1.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-v1.mjs +88 -1
- package/dist/sync/sync-peer/sync-peer-v1.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.d.mts +30 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs +2 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts +66 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs +280 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts +85 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs +332 -0
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.d.mts +29 -0
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mjs +2 -0
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mjs.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.d.mts +42 -0
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs +282 -0
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs.map +1 -0
- package/dist/sync/sync-saga-coordinator.d.mts +35 -1
- package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
- package/dist/sync/sync-saga-coordinator.mjs +62 -1
- package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
- package/dist/sync/sync-withid.connect.respec.d.mts +12 -0
- package/dist/sync/sync-withid.connect.respec.d.mts.map +1 -0
- package/dist/sync/sync-withid.connect.respec.mjs +205 -0
- package/dist/sync/sync-withid.connect.respec.mjs.map +1 -0
- package/dist/sync/sync-withid.establish.respec.d.mts +19 -0
- package/dist/sync/sync-withid.establish.respec.d.mts.map +1 -0
- package/dist/sync/sync-withid.establish.respec.mjs +322 -0
- package/dist/sync/sync-withid.establish.respec.mjs.map +1 -0
- package/package.json +4 -4
- package/src/keystone/keystone-config-builder.mts +73 -4
- package/src/keystone/keystone-constants.mts +42 -6
- package/src/keystone/keystone-helpers.mts +44 -2
- package/src/keystone/keystone-policy-types.mts +25 -0
- package/src/keystone/keystone-policy.schema.json +51 -0
- package/src/keystone/keystone-service-v1.mts +3 -3
- package/src/sync/docs/architecture.md +20 -0
- package/src/sync/docs/security.md +207 -3
- package/src/sync/graft-info/graft-info-helpers.respec.mts +7 -7
- package/src/sync/sync-conflict-adv-multitimelines.respec.mts +21 -21
- package/src/sync/sync-conflict-basic-divergence.respec.mts +2 -2
- package/src/sync/sync-conflict-basic-multitimelines.respec.mts +5 -5
- package/src/sync/sync-conflict-text-merge.respec.mts +25 -25
- package/src/sync/sync-helpers.mts +51 -1
- package/src/sync/sync-innerspace-constants.respec.mts +1 -1
- package/src/sync/sync-innerspace-deep-updates.respec.mts +1 -1
- package/src/sync/sync-innerspace-dest-ahead.respec.mts +3 -3
- package/src/sync/sync-innerspace-multiple-timelines.respec.mts +1 -1
- package/src/sync/sync-innerspace-partial-update.respec.mts +2 -2
- package/src/sync/sync-innerspace.respec.mts +3 -3
- package/src/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mts +20 -0
- package/src/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mts +23 -3
- package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mts +38 -1
- package/src/sync/sync-peer/sync-peer-types.mts +70 -1
- package/src/sync/sync-peer/sync-peer-v1.mts +94 -1
- package/src/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mts +36 -0
- package/src/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mts +337 -0
- package/src/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mts +388 -0
- package/src/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mts +35 -0
- package/src/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mts +321 -0
- package/src/sync/sync-saga-coordinator.mts +84 -0
- package/src/sync/sync-withid.connect.respec.mts +243 -0
- package/src/sync/sync-withid.establish.respec.mts +361 -0
- package/src/sync/unused-identity-backup.mts.md +1 -1
- package/dist/sync/sync-innerspace-dest-ahead-withid.respec.d.mts +0 -2
- package/dist/sync/sync-innerspace-dest-ahead-withid.respec.d.mts.map +0 -1
- package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs +0 -310
- package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs.map +0 -1
- package/src/sync/sync-innerspace-dest-ahead-withid.respec.mts +0 -364
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module sync-withid.establish.respec
|
|
3
|
+
*
|
|
4
|
+
* Phase 1 — `establishSessionIdentity` (Pre-Connect)
|
|
5
|
+
*
|
|
6
|
+
* Goal: Get `I^Itjp` onto the domain provider, generate `S^Stjp` locally,
|
|
7
|
+
* evolve `I → I1` with a `sync` claim targeting `S^Stjp`, and post both
|
|
8
|
+
* `I1` and `S` to the provider. Verify both keystones are in the appropriate
|
|
9
|
+
* durable spaces at the right times.
|
|
10
|
+
*
|
|
11
|
+
* `senderCoordinator.sync(...)` IS called — we are not mocking. We expect it
|
|
12
|
+
* may throw at first. We examine side-effects (keystone presence in durable
|
|
13
|
+
* spaces) rather than end-to-end correctness. As phases succeed and sync no
|
|
14
|
+
* longer throws, assertions will be adjusted accordingly.
|
|
15
|
+
*
|
|
16
|
+
* @see libs/core-gib/src/sync/docs/security.md — Implementation Plan, Phase 1A
|
|
17
|
+
*/
|
|
18
|
+
import { respecfully, iReckon, ifWe } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
|
|
19
|
+
const maam = `[${import.meta.url}]`, sir = maam;
|
|
20
|
+
import { clone, delay, extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
|
|
21
|
+
import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
|
|
22
|
+
import { GLOBAL_LOG_A_LOT } from '../core-constants.mjs';
|
|
23
|
+
import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
|
|
24
|
+
import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
|
|
25
|
+
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
26
|
+
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
|
|
27
|
+
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
28
|
+
import { SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mjs';
|
|
29
|
+
import { KeystoneService_V1 } from '../keystone/keystone-service-v1.mjs';
|
|
30
|
+
import { KEYSTONE_VERB_SYNC, POOL_ID_SYNC, POOL_ID_CONNECT, KEYSTONE_VERB_CONNECT, } from '../keystone/keystone-constants.mjs';
|
|
31
|
+
import { createStandardPoolConfig } from '../keystone/keystone-config-builder.mjs';
|
|
32
|
+
import { KeystoneReplenishStrategy } from '../keystone/keystone-types.mjs';
|
|
33
|
+
import { SyncConflictStrategy } from './sync-constants.mjs';
|
|
34
|
+
import { getIdentity_throwIfUndefined } from '../keystone/keystone-helpers.mjs';
|
|
35
|
+
import { Factory_V1 } from '@ibgib/ts-gib/dist/V1/factory.mjs';
|
|
36
|
+
import { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';
|
|
37
|
+
import { fork } from '@ibgib/ts-gib/dist/V1/transforms/fork.mjs';
|
|
38
|
+
const logalot = GLOBAL_LOG_A_LOT;
|
|
39
|
+
const lc = sir;
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Test-only identity constants
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/**
|
|
44
|
+
* Plaintext secret for the senderIdentity keystone (I).
|
|
45
|
+
* Test-only — never use plaintext secrets in production.
|
|
46
|
+
*/
|
|
47
|
+
const SENDER_SECRET = 'test-sender-secret-phase1';
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Session keystone pool configs
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
/**
|
|
52
|
+
* `connect` pool — used once during `peer.connect()` transport handshake.
|
|
53
|
+
* Small pool; fully consumed in one handshake.
|
|
54
|
+
*/
|
|
55
|
+
const SESSION_CONNECT_POOL_CONFIG = createStandardPoolConfig({
|
|
56
|
+
id: POOL_ID_CONNECT,
|
|
57
|
+
salt: 'session-connect-salt-phase1',
|
|
58
|
+
verbs: [KEYSTONE_VERB_CONNECT],
|
|
59
|
+
// Small size: fully consumed in a single connect handshake
|
|
60
|
+
size: 10,
|
|
61
|
+
sequential: 1,
|
|
62
|
+
random: 1,
|
|
63
|
+
targetBinding: 2,
|
|
64
|
+
replenishStrategy: KeystoneReplenishStrategy.deleteAll,
|
|
65
|
+
});
|
|
66
|
+
/**
|
|
67
|
+
* `sync` pool — used per outgoing context frame (Init, Delta, Commit).
|
|
68
|
+
* Replenishes via topUp to stay active throughout the saga.
|
|
69
|
+
*/
|
|
70
|
+
const SESSION_SYNC_POOL_CONFIG = createStandardPoolConfig({
|
|
71
|
+
id: POOL_ID_SYNC,
|
|
72
|
+
salt: 'session-sync-salt-phase1',
|
|
73
|
+
verbs: [KEYSTONE_VERB_SYNC],
|
|
74
|
+
size: 200,
|
|
75
|
+
sequential: 1,
|
|
76
|
+
random: 1,
|
|
77
|
+
targetBinding: 2,
|
|
78
|
+
replenishStrategy: KeystoneReplenishStrategy.topUp,
|
|
79
|
+
});
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Top-level senderIdentity (I) pool config
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
/**
|
|
84
|
+
* The senderIdentity needs a `sync` pool so it can evolve itself (I → I1)
|
|
85
|
+
* with a claim targeting the session keystone genesis (S^Stjp).
|
|
86
|
+
*/
|
|
87
|
+
const SENDER_IDENTITY_SYNC_POOL_CONFIG = createStandardPoolConfig({
|
|
88
|
+
id: POOL_ID_SYNC,
|
|
89
|
+
salt: 'senderidentitysyncsaltphase1', // dashes not allowed in regex
|
|
90
|
+
verbs: [KEYSTONE_VERB_SYNC],
|
|
91
|
+
size: 200,
|
|
92
|
+
sequential: 1,
|
|
93
|
+
random: 1,
|
|
94
|
+
targetBinding: 2,
|
|
95
|
+
replenishStrategy: KeystoneReplenishStrategy.topUp,
|
|
96
|
+
});
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// Main test suite
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
await respecfully(sir, `Test Phase 1: establishSessionIdentity`, async () => {
|
|
101
|
+
// #region Init/Setup
|
|
102
|
+
const metaspace = new Metaspace_Innerspace(undefined);
|
|
103
|
+
await metaspace.initialize({
|
|
104
|
+
getFnAlert: () => async ({ title, msg }) => { console.log(`[Alert] ${title}: ${msg}`); },
|
|
105
|
+
getFnPrompt: () => async ({ title, msg }) => { console.log(`[Prompt] ${title}: ${msg}`); return ''; },
|
|
106
|
+
getFnPromptPassword: () => async (title, msg) => { console.log(`[PromptPwd] ${title}: ${msg}`); return null; },
|
|
107
|
+
});
|
|
108
|
+
while (!metaspace.initialized) {
|
|
109
|
+
await delay(10);
|
|
110
|
+
}
|
|
111
|
+
const defaultLocalUserSpace = await metaspace.getLocalUserSpace({ lock: false });
|
|
112
|
+
await defaultLocalUserSpace.initialized;
|
|
113
|
+
/** Sender's durable space — where the sender originates ibgibs. */
|
|
114
|
+
const sourceSpace = new InnerSpace_V1({
|
|
115
|
+
...DEFAULT_INNER_SPACE_DATA_V1,
|
|
116
|
+
name: 'source',
|
|
117
|
+
uuid: 'source_uuid',
|
|
118
|
+
description: 'sender durable space',
|
|
119
|
+
});
|
|
120
|
+
await sourceSpace.initialized;
|
|
121
|
+
/** Receiver's durable space — the domain provider in the innerspace simulation. */
|
|
122
|
+
const destSpace = new InnerSpace_V1({
|
|
123
|
+
...DEFAULT_INNER_SPACE_DATA_V1,
|
|
124
|
+
name: 'dest',
|
|
125
|
+
uuid: 'dest_uuid',
|
|
126
|
+
description: 'receiver (domain provider) durable space',
|
|
127
|
+
});
|
|
128
|
+
await destSpace.initialized;
|
|
129
|
+
const senderCoordinator = new SyncSagaCoordinator();
|
|
130
|
+
const receiverCoordinator = new SyncSagaCoordinator();
|
|
131
|
+
async function newTestIbGib_stone({ ib = 'test', data }) {
|
|
132
|
+
const stone = await Factory_V1.stone({
|
|
133
|
+
parentPrimitiveIb: ib.split(' ').at(0) ?? 'test',
|
|
134
|
+
ib,
|
|
135
|
+
data,
|
|
136
|
+
uuid: true,
|
|
137
|
+
});
|
|
138
|
+
return stone;
|
|
139
|
+
}
|
|
140
|
+
async function newTestIbGib({ ib = 'test' }) {
|
|
141
|
+
let resFork = await fork({
|
|
142
|
+
src: ROOT,
|
|
143
|
+
destIb: ib,
|
|
144
|
+
tjp: { timestamp: true, uuid: true },
|
|
145
|
+
dna: true,
|
|
146
|
+
nCounter: true,
|
|
147
|
+
});
|
|
148
|
+
return resFork;
|
|
149
|
+
}
|
|
150
|
+
async function newTestPeer() {
|
|
151
|
+
const peer = new SyncPeerInnerspace_V1(clone(SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1));
|
|
152
|
+
await peer.initialized;
|
|
153
|
+
await peer.initializeOpts({
|
|
154
|
+
sagaId: '', // coordinator will override this via setOptionalOpts before establishSessionIdentity
|
|
155
|
+
localMetaspace: metaspace,
|
|
156
|
+
localSpace: sourceSpace,
|
|
157
|
+
receiverSpace: destSpace,
|
|
158
|
+
receiverCoordinator,
|
|
159
|
+
receiverMetaspace: metaspace,
|
|
160
|
+
});
|
|
161
|
+
return peer;
|
|
162
|
+
}
|
|
163
|
+
// KeystoneService_V1 is stateless — new it inline wherever needed.
|
|
164
|
+
const keystoneSvc = new KeystoneService_V1();
|
|
165
|
+
// #endregion Init/Setup
|
|
166
|
+
/**
|
|
167
|
+
* senderIdentity (I): Alice's long-lived Domain Keystone.
|
|
168
|
+
* Created fresh for this test with a `sync` pool so it can evolve (I → I1).
|
|
169
|
+
*/
|
|
170
|
+
let senderIdentity;
|
|
171
|
+
// #region Step 1: Prepare identity
|
|
172
|
+
// Create senderIdentity genesis (I^Itjp) in sourceSpace
|
|
173
|
+
senderIdentity = await keystoneSvc.genesis({
|
|
174
|
+
masterSecret: SENDER_SECRET,
|
|
175
|
+
configs: [SENDER_IDENTITY_SYNC_POOL_CONFIG],
|
|
176
|
+
metaspace,
|
|
177
|
+
space: sourceSpace,
|
|
178
|
+
});
|
|
179
|
+
if (logalot) {
|
|
180
|
+
console.log(`${lc} senderIdentity genesis addr: ${getIbGibAddr({ ibGib: senderIdentity })}`);
|
|
181
|
+
}
|
|
182
|
+
// post the senderIdentity to receiver (like "create account")
|
|
183
|
+
await metaspace.put({ ibGib: senderIdentity, space: destSpace });
|
|
184
|
+
await metaspace.registerNewIbGib({ ibGib: senderIdentity, space: destSpace });
|
|
185
|
+
// #endregion Step 1: Prepare identity
|
|
186
|
+
// at this point, we have mimicked a user who already has an identity via a
|
|
187
|
+
// create account button.
|
|
188
|
+
// #region Step 2: Execute
|
|
189
|
+
let xStone;
|
|
190
|
+
let xStoneAddr;
|
|
191
|
+
try {
|
|
192
|
+
if (logalot) {
|
|
193
|
+
console.log(`${lc}[Step 2] starting... (I: 1aa5643dd8d46fcdd87d48b8be550826)`);
|
|
194
|
+
}
|
|
195
|
+
// setup/call sync
|
|
196
|
+
// Sync call — sync itself is responsible for establishSessionIdentity
|
|
197
|
+
// internally.
|
|
198
|
+
/**
|
|
199
|
+
* doesn't really matter intrinsically for this test, but we need a
|
|
200
|
+
* domain ibgib to sync
|
|
201
|
+
*/
|
|
202
|
+
xStone = await newTestIbGib_stone({ ib: 'test' });
|
|
203
|
+
xStoneAddr = getIbGibAddr({ ibGib: xStone });
|
|
204
|
+
await metaspace.put({ ibGib: xStone, space: sourceSpace });
|
|
205
|
+
await metaspace.registerNewIbGib({ ibGib: xStone, space: sourceSpace });
|
|
206
|
+
const syncSaga = await senderCoordinator.sync({
|
|
207
|
+
domainIbGibs: [xStone],
|
|
208
|
+
senderIdentity,
|
|
209
|
+
fnSenderSecret: async () => { return SENDER_SECRET; },
|
|
210
|
+
peer: await newTestPeer(),
|
|
211
|
+
localSpace: sourceSpace,
|
|
212
|
+
metaspace,
|
|
213
|
+
conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
|
|
214
|
+
});
|
|
215
|
+
await syncSaga.done;
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
// error is fine/expected right now. later perhaps we will throw, or
|
|
219
|
+
// perhaps we always just swallow any exceptions since this is close to
|
|
220
|
+
// a unit test
|
|
221
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
if (logalot) {
|
|
225
|
+
console.log(`${lc}[Step 2] complete.`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// #endregion Step 2: Execute
|
|
229
|
+
// #region Step 3: Check states
|
|
230
|
+
// check state of sender/receiver spaces WRT sender identity, new sender
|
|
231
|
+
// identity, and session identity.
|
|
232
|
+
// get newSenderIdentity address via metaspace.getLatestAddr
|
|
233
|
+
// Resolve the latest senderIdentity frame (I1) from the sender's space.
|
|
234
|
+
// After sync, the coordinator should have evolved I → I1 and stored it.
|
|
235
|
+
let newSenderIdentityAddr;
|
|
236
|
+
/**
|
|
237
|
+
* The session keystone addr should be embedded in I1's proof claim target.
|
|
238
|
+
*/
|
|
239
|
+
let newSenderIdentity;
|
|
240
|
+
await ifWe(sir, 'newSenderIdentity created and stored in source space', async () => {
|
|
241
|
+
newSenderIdentityAddr = await metaspace.getLatestAddr({
|
|
242
|
+
ibGib: senderIdentity,
|
|
243
|
+
space: sourceSpace,
|
|
244
|
+
});
|
|
245
|
+
if (!newSenderIdentityAddr) {
|
|
246
|
+
throw new Error(`newSenderIdentity not found in space (${sourceSpace.ib}). this should have been evolved and stored during sync (E: a5a798bf8ba467cbc87595dcc2b36726)`);
|
|
247
|
+
}
|
|
248
|
+
newSenderIdentity = await getIdentity_throwIfUndefined({
|
|
249
|
+
addr: newSenderIdentityAddr,
|
|
250
|
+
metaspace,
|
|
251
|
+
space: sourceSpace,
|
|
252
|
+
});
|
|
253
|
+
// todo: add iReckon statements for expectations like claim verb, claim target, etc., of newSenderIdentity
|
|
254
|
+
iReckon(sir, newSenderIdentity).asTo('newSenderIdentity is truthy').isGonnaBeTruthy();
|
|
255
|
+
const syncProof = newSenderIdentity?.data?.proofs?.find(p => p.claim?.verb === KEYSTONE_VERB_SYNC);
|
|
256
|
+
iReckon(sir, syncProof).asTo('I1 has a sync-verb proof/claim').isGonnaBeTruthy();
|
|
257
|
+
iReckon(sir, syncProof?.claim?.target).asTo('sync claim has a target (S^Stjp)').isGonnaBeTruthy();
|
|
258
|
+
});
|
|
259
|
+
if (!newSenderIdentity) {
|
|
260
|
+
throw new Error(`(UNEXPECTED) newSenderIdentity falsy? should have thrown before this if falsy. (E: 7a3d92e6160409de149eaf6802365126)`);
|
|
261
|
+
}
|
|
262
|
+
const sessionIdentityTjpAddr = newSenderIdentity.data.proofs
|
|
263
|
+
.find(p => p.claim.verb === KEYSTONE_VERB_SYNC)?.claim.target;
|
|
264
|
+
if (!sessionIdentityTjpAddr) {
|
|
265
|
+
throw new Error(`(UNEXPECTED) sessionIdentityTjpAddr falsy? (E: c53583b07a78837de84a59388b6ff826)`);
|
|
266
|
+
}
|
|
267
|
+
let sessionIdentity;
|
|
268
|
+
await ifWe(sir, 'creates sessionIdentity genesis (S) locally — exists in sourceSpace', async () => {
|
|
269
|
+
sessionIdentity = await getIdentity_throwIfUndefined({
|
|
270
|
+
addr: sessionIdentityTjpAddr,
|
|
271
|
+
metaspace,
|
|
272
|
+
space: sourceSpace,
|
|
273
|
+
});
|
|
274
|
+
iReckon(sir, sessionIdentity).asTo('sessionIdentity is truthy').isGonnaBeTruthy();
|
|
275
|
+
});
|
|
276
|
+
if (!sessionIdentity) {
|
|
277
|
+
throw new Error(`(UNEXPECTED) sessionIdentity falsy? (E: e1fa06009df535f3c848e6ca8b0bd326)`);
|
|
278
|
+
}
|
|
279
|
+
await ifWe(sir, 'Session identity S has expected state', async () => {
|
|
280
|
+
// #region sanity/compile
|
|
281
|
+
if (!sessionIdentity) {
|
|
282
|
+
throw new Error(`(UNEXPECTED) sessionIdentity falsy? (E: dd229f4e44489a54488768157a393926)`);
|
|
283
|
+
}
|
|
284
|
+
if (!sessionIdentity.data) {
|
|
285
|
+
throw new Error(`(UNEXPECTED) sessionIdentity.data falsy? (E: 56f10c9f9c18c6147ea19281dcbaf826)`);
|
|
286
|
+
}
|
|
287
|
+
// #endregion sanity/compile
|
|
288
|
+
// Verify S has both pool ids: connect and sync
|
|
289
|
+
const sPools = sessionIdentity.data.challengePools;
|
|
290
|
+
iReckon(sir, sPools).asTo('S has challengePools').isGonnaBeTruthy();
|
|
291
|
+
const hasConnectPool = sPools?.some(p => p.id === POOL_ID_CONNECT);
|
|
292
|
+
const hasSyncPool = sPools?.some(p => p.id === POOL_ID_SYNC);
|
|
293
|
+
iReckon(sir, hasConnectPool).asTo('S has connect pool').isGonnaBeTrue();
|
|
294
|
+
iReckon(sir, hasSyncPool).asTo('S has sync pool').isGonnaBeTrue();
|
|
295
|
+
const sProofs = sessionIdentity.data.proofs;
|
|
296
|
+
iReckon(sir, sProofs).asTo('S has proofs array').isGonnaBeTruthy();
|
|
297
|
+
iReckon(sir, sProofs.length === 0).asTo('S has 0 proofs on genesis').isGonnaBeTrue();
|
|
298
|
+
// Verify S is bound to target domain (xStone) via frameDetails
|
|
299
|
+
const targetAddrs = sessionIdentity.data.frameDetails?.targetAddrs;
|
|
300
|
+
iReckon(sir, targetAddrs).asTo('S has targetAddrs array in frameDetails').isGonnaBeTruthy();
|
|
301
|
+
iReckon(sir, targetAddrs?.includes(xStoneAddr)).asTo('S targetAddrs contains the domain being synced (xStoneAddr)').isGonnaBeTrue();
|
|
302
|
+
});
|
|
303
|
+
await ifWe(sir, 'I, I1 and S all exist in destSpace (receiver)', async () => {
|
|
304
|
+
// todo: use getIdentity_throwIfUndefined for all three identities but in destSpace
|
|
305
|
+
const senderIdentityAddr = getIbGibAddr({ ibGib: senderIdentity });
|
|
306
|
+
await getIdentity_throwIfUndefined({
|
|
307
|
+
addr: senderIdentityAddr,
|
|
308
|
+
metaspace,
|
|
309
|
+
space: destSpace
|
|
310
|
+
});
|
|
311
|
+
iReckon(sir, true).asTo('I (original) exists in destSpace').isGonnaBeTrue();
|
|
312
|
+
if (!newSenderIdentityAddr) {
|
|
313
|
+
throw new Error(`newSenderIdentity not found in space (${sourceSpace.ib}). this should have been evolved and stored during sync (E: b626885071885b38d87853189f25c826)`);
|
|
314
|
+
}
|
|
315
|
+
await getIdentity_throwIfUndefined({ addr: newSenderIdentityAddr, metaspace, space: destSpace });
|
|
316
|
+
iReckon(sir, true).asTo('I1 (evolved) exists in destSpace').isGonnaBeTrue();
|
|
317
|
+
await getIdentity_throwIfUndefined({ addr: sessionIdentityTjpAddr, metaspace, space: destSpace });
|
|
318
|
+
iReckon(sir, true).asTo('S (sessionIdentity) exists in destSpace').isGonnaBeTrue();
|
|
319
|
+
});
|
|
320
|
+
// #endregion Step 3: Check states
|
|
321
|
+
});
|
|
322
|
+
//# sourceMappingURL=sync-withid.establish.respec.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-withid.establish.respec.mjs","sourceRoot":"","sources":["../../src/sync/sync-withid.establish.respec.mts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ibgib/core-gib",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.58",
|
|
4
4
|
"description": "ibgib core functionality, including base architecture for witnesses, spaces, apps, robbots, etc., as well as shared utility functions. Node v19+ needed for heavily-used isomorphic webcrypto hashing consumed in both node and browsers.",
|
|
5
5
|
"funding": {
|
|
6
6
|
"type": "individual",
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
"author": "William Raiford",
|
|
27
27
|
"license": "ISC",
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@ibgib/encrypt-gib": "
|
|
30
|
-
"@ibgib/helper-gib": "
|
|
31
|
-
"@ibgib/ts-gib": "
|
|
29
|
+
"@ibgib/encrypt-gib": "^0.2.37",
|
|
30
|
+
"@ibgib/helper-gib": "^0.0.36",
|
|
31
|
+
"@ibgib/ts-gib": "^0.5.32"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {},
|
|
34
34
|
"engines": {
|
|
@@ -5,7 +5,10 @@ import {
|
|
|
5
5
|
KeystonePoolConfig, KeystonePoolConfig_HashV1, KeystonePoolBehavior,
|
|
6
6
|
KeystoneReplenishStrategy, KeystonePoolConfigBase, KeystoneChallengeType,
|
|
7
7
|
} from './keystone-types.mjs';
|
|
8
|
-
import { POOL_ID_REVOKE, KEYSTONE_VERB_REVOKE, KEYSTONE_CONFIG_DEFAULT_SIZE, KEYSTONE_CONFIG_DEFAULT_BINDING, KEYSTONE_CONFIG_DEFAULT_REPLENISH_STRATEGY, KEYSTONE_CONFIG_DEFAULT_SEQUENTIAL, KEYSTONE_CONFIG_DEFAULT_RANDOM, KEYSTONE_CONFIG_DEFAULT_SIZE_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_SEQUENTIAL_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_RANDOM_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_BINDING_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_REPLENISH_STRATEGY_HIGHSECURITY, KeystoneVerb, KEYSTONE_CONFIG_DEFAULT_HASH_ALGORITHM, KEYSTONE_CONFIG_DEFAULT_HASH_ROUNDS, KEYSTONE_CONFIG_DEFAULT_HASH_ALGORITHM_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_HASH_ROUNDS_HIGHSECURITY } from './keystone-constants.mjs';
|
|
8
|
+
import { POOL_ID_REVOKE, KEYSTONE_VERB_REVOKE, KEYSTONE_CONFIG_DEFAULT_SIZE, KEYSTONE_CONFIG_DEFAULT_BINDING, KEYSTONE_CONFIG_DEFAULT_REPLENISH_STRATEGY, KEYSTONE_CONFIG_DEFAULT_SEQUENTIAL, KEYSTONE_CONFIG_DEFAULT_RANDOM, KEYSTONE_CONFIG_DEFAULT_SIZE_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_SEQUENTIAL_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_RANDOM_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_BINDING_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_REPLENISH_STRATEGY_HIGHSECURITY, KeystoneVerb, KEYSTONE_CONFIG_DEFAULT_HASH_ALGORITHM, KEYSTONE_CONFIG_DEFAULT_HASH_ROUNDS, KEYSTONE_CONFIG_DEFAULT_HASH_ALGORITHM_HIGHSECURITY, KEYSTONE_CONFIG_DEFAULT_HASH_ROUNDS_HIGHSECURITY, POOL_ID_SYNC, POOL_ID_CONNECT, POOL_ID_MANAGE } from './keystone-constants.mjs';
|
|
9
|
+
import { KeystoneBehaviorProfileTemplate, KeystonePoolTemplate } from './keystone-policy-types.mjs';
|
|
10
|
+
|
|
11
|
+
export { KeystoneBehaviorProfileTemplate, KeystonePoolTemplate };
|
|
9
12
|
|
|
10
13
|
const logalot = GLOBAL_LOG_A_LOT;
|
|
11
14
|
|
|
@@ -308,14 +311,80 @@ export function createHighSecurityPoolConfig(opts: KeystoneConfigFactoryOptions_
|
|
|
308
311
|
export function createManagePoolConfig(opts: KeystoneConfigFactoryOptions_Standard): KeystonePoolConfig {
|
|
309
312
|
return createHighSecurityPoolConfig({
|
|
310
313
|
...opts,
|
|
311
|
-
|
|
314
|
+
id: opts.id ?? POOL_ID_MANAGE,
|
|
315
|
+
verbs: opts.verbs ?? [KeystoneVerb.MANAGE],
|
|
312
316
|
});
|
|
313
317
|
}
|
|
314
318
|
|
|
315
319
|
export function createRevocationPoolConfig(opts: KeystoneConfigFactoryOptions_Standard): KeystonePoolConfig {
|
|
316
320
|
return createHighSecurityPoolConfig({
|
|
317
321
|
...opts,
|
|
318
|
-
|
|
319
|
-
|
|
322
|
+
id: opts.id ?? POOL_ID_REVOKE,
|
|
323
|
+
verbs: opts.verbs ?? [KeystoneVerb.REVOKE],
|
|
324
|
+
replenishStrategy: opts.replenishStrategy ?? KeystoneReplenishStrategy.deleteAll,
|
|
320
325
|
});
|
|
321
326
|
}
|
|
327
|
+
|
|
328
|
+
export function createSyncPoolConfig(opts: KeystoneConfigFactoryOptions_Standard): KeystonePoolConfig {
|
|
329
|
+
return createStandardPoolConfig({
|
|
330
|
+
...opts,
|
|
331
|
+
id: opts.id ?? POOL_ID_SYNC,
|
|
332
|
+
verbs: opts.verbs ?? [KeystoneVerb.SYNC],
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export function createConnectPoolConfig(opts: KeystoneConfigFactoryOptions_Standard): KeystonePoolConfig {
|
|
337
|
+
return createStandardPoolConfig({
|
|
338
|
+
...opts,
|
|
339
|
+
id: opts.id ?? POOL_ID_CONNECT,
|
|
340
|
+
verbs: opts.verbs ?? [KeystoneVerb.CONNECT],
|
|
341
|
+
replenishStrategy: opts.replenishStrategy ?? KeystoneReplenishStrategy.deleteAll,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Builds a KeystonePoolConfig from a JSON-sourced KeystonePoolTemplate.
|
|
347
|
+
*/
|
|
348
|
+
export function createPoolConfigFromJson({
|
|
349
|
+
template,
|
|
350
|
+
behaviorProfiles,
|
|
351
|
+
salt
|
|
352
|
+
}: {
|
|
353
|
+
template: KeystonePoolTemplate;
|
|
354
|
+
behaviorProfiles?: Record<string, KeystoneBehaviorProfileTemplate>;
|
|
355
|
+
salt: string;
|
|
356
|
+
}): KeystonePoolConfig {
|
|
357
|
+
let behavior: KeystoneBehaviorProfileTemplate | undefined;
|
|
358
|
+
if (template.behaviorProfile && behaviorProfiles) {
|
|
359
|
+
behavior = behaviorProfiles[template.behaviorProfile];
|
|
360
|
+
}
|
|
361
|
+
if (!behavior) {
|
|
362
|
+
behavior = template.behaviorInline;
|
|
363
|
+
}
|
|
364
|
+
if (!behavior) {
|
|
365
|
+
behavior = {
|
|
366
|
+
size: KEYSTONE_CONFIG_DEFAULT_SIZE,
|
|
367
|
+
replenish: KEYSTONE_CONFIG_DEFAULT_REPLENISH_STRATEGY,
|
|
368
|
+
selectSequentially: KEYSTONE_CONFIG_DEFAULT_SEQUENTIAL,
|
|
369
|
+
selectRandomly: KEYSTONE_CONFIG_DEFAULT_RANDOM,
|
|
370
|
+
targetBindingChars: KEYSTONE_CONFIG_DEFAULT_BINDING
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
return KeystoneConfig.hash()
|
|
375
|
+
.withId(template.id)
|
|
376
|
+
.withSalt(salt)
|
|
377
|
+
.withSize(behavior.size)
|
|
378
|
+
.withHybrid({
|
|
379
|
+
seqCount: behavior.selectSequentially,
|
|
380
|
+
randCount: behavior.selectRandomly,
|
|
381
|
+
})
|
|
382
|
+
.withTargetBinding(behavior.targetBindingChars)
|
|
383
|
+
.withReplenishStrategy(behavior.replenish)
|
|
384
|
+
.withHash({
|
|
385
|
+
algo: template.algo,
|
|
386
|
+
rounds: template.rounds
|
|
387
|
+
})
|
|
388
|
+
.forVerbs(template.allowedVerbs)
|
|
389
|
+
.build();
|
|
390
|
+
}
|
|
@@ -3,16 +3,12 @@ import { KeystoneReplenishStrategy } from "./keystone-types.mjs";
|
|
|
3
3
|
|
|
4
4
|
export const KEYSTONE_ATOM = "keystone";
|
|
5
5
|
export const KEYSTONE_POOL_ID_REGEXP = /^\w[\w\-.]*$/;
|
|
6
|
-
|
|
7
|
-
* arbitrary 64 limit? only letters characters good
|
|
8
|
-
*/
|
|
9
|
-
export const KEYSTONE_SALT_REGEXP = /^[a-zA-Z0-9]{1,64}$/;
|
|
6
|
+
export const KEYSTONE_SALT_REGEXP = /^[a-zA-Z0-9\-_]{1,64}$/;
|
|
10
7
|
/**
|
|
11
8
|
* arbitrary right now. don't want an easy DoS. this may still be too high.
|
|
12
9
|
*/
|
|
13
10
|
export const KEYSTONE_HASH_MAX_ROUNDS = 1_000;
|
|
14
11
|
|
|
15
|
-
// #region KeystoneVerb enum
|
|
16
12
|
/**
|
|
17
13
|
* @see {@link KeystoneVerb.REVOKE}
|
|
18
14
|
*/
|
|
@@ -25,10 +21,28 @@ export const KEYSTONE_VERB_MANAGE = "manage";
|
|
|
25
21
|
* @see {@link KeystoneVerb.SIGN}
|
|
26
22
|
*/
|
|
27
23
|
export const KEYSTONE_VERB_SIGN = "sign";
|
|
24
|
+
/**
|
|
25
|
+
* Used when a senderIdentity keystone authorizes a session keystone for a sync
|
|
26
|
+
* operation. The senderIdentity is evolved with a claim whose verb is `sync`,
|
|
27
|
+
* pointing to the session keystone genesis address.
|
|
28
|
+
*
|
|
29
|
+
* @see {@link KeystoneVerb.SYNC}
|
|
30
|
+
*/
|
|
31
|
+
export const KEYSTONE_VERB_SYNC = "sync";
|
|
32
|
+
/**
|
|
33
|
+
* Used by the session keystone's `connect` pool to authorize the transport
|
|
34
|
+
* connect (e.g. WebSocket challenge/response). Consumed exactly once per
|
|
35
|
+
* sync session during `peer.connect()`.
|
|
36
|
+
*
|
|
37
|
+
* @see {@link KeystoneVerb.CONNECT}
|
|
38
|
+
*/
|
|
39
|
+
export const KEYSTONE_VERB_CONNECT = "connect";
|
|
28
40
|
export type KeystoneVerb =
|
|
29
41
|
| typeof KEYSTONE_VERB_REVOKE
|
|
30
42
|
| typeof KEYSTONE_VERB_MANAGE
|
|
31
|
-
| typeof KEYSTONE_VERB_SIGN
|
|
43
|
+
| typeof KEYSTONE_VERB_SIGN
|
|
44
|
+
| typeof KEYSTONE_VERB_SYNC
|
|
45
|
+
| typeof KEYSTONE_VERB_CONNECT;
|
|
32
46
|
|
|
33
47
|
/**
|
|
34
48
|
* Verbs that describe actions that can be authorized by a Keystone.
|
|
@@ -55,6 +69,16 @@ export const KeystoneVerb = {
|
|
|
55
69
|
* This is the least of all privileges that can actually evolve a keystone.
|
|
56
70
|
*/
|
|
57
71
|
SIGN: KEYSTONE_VERB_SIGN,
|
|
72
|
+
/**
|
|
73
|
+
* Used when a senderIdentity keystone authorizes a session keystone.
|
|
74
|
+
* The senderIdentity is evolved with a `sync` claim targeting S^Stjp.
|
|
75
|
+
*/
|
|
76
|
+
SYNC: KEYSTONE_VERB_SYNC,
|
|
77
|
+
/**
|
|
78
|
+
* Used by the session keystone's `connect` pool for the transport
|
|
79
|
+
* connect (proof-of-possession). Consumed once per session.
|
|
80
|
+
*/
|
|
81
|
+
CONNECT: KEYSTONE_VERB_CONNECT,
|
|
58
82
|
} satisfies { [key: string]: KeystoneVerb };
|
|
59
83
|
export const KEYSTONE_VERB_VALID_VALUES = Object.values(KeystoneVerb);
|
|
60
84
|
export function isKeystoneVerb(value: string): value is KeystoneVerb {
|
|
@@ -70,6 +94,18 @@ export const POOL_ID_REVOKE = KEYSTONE_VERB_REVOKE;
|
|
|
70
94
|
export const POOL_ID_MANAGE = KEYSTONE_VERB_MANAGE;
|
|
71
95
|
export const POOL_ID_DEFAULT = "default";
|
|
72
96
|
export const POOL_ID_DELEGATE = "delegate";
|
|
97
|
+
/**
|
|
98
|
+
* Pool ID for the session keystone's transport connect pool.
|
|
99
|
+
* Paired with {@link KEYSTONE_VERB_CONNECT}. Consumed once per sync session
|
|
100
|
+
* during `peer.connect()`.
|
|
101
|
+
*/
|
|
102
|
+
export const POOL_ID_CONNECT = KEYSTONE_VERB_CONNECT;
|
|
103
|
+
/**
|
|
104
|
+
* Pool ID for the session keystone's per-turn signing pool.
|
|
105
|
+
* Paired with {@link KEYSTONE_VERB_SYNC}. Consumed once per outgoing sync
|
|
106
|
+
* context frame (Init, Delta, Commit, etc.).
|
|
107
|
+
*/
|
|
108
|
+
export const POOL_ID_SYNC = KEYSTONE_VERB_SYNC;
|
|
73
109
|
/**
|
|
74
110
|
* **THESE SHOULD ONLY BE USED IN TEMPORARY/SESSION KEYSTONES.**
|
|
75
111
|
* _this is because a receiver could intercept the stone, DoS participants and
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { extractErrorMsg, hash, HashAlgorithm, pretty } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
|
|
2
2
|
import { GIB } from "@ibgib/ts-gib/dist/V1/constants.mjs";
|
|
3
|
-
import { Ib, TransformResult } from "@ibgib/ts-gib/dist/types.mjs";
|
|
3
|
+
import { Ib, IbGibAddr, TransformResult } from "@ibgib/ts-gib/dist/types.mjs";
|
|
4
4
|
import { getIbAndGib, getIbGibAddr } from "@ibgib/ts-gib/dist/helper.mjs";
|
|
5
5
|
import { validateIbGibIntrinsically } from "@ibgib/ts-gib/dist/V1/validate-helper.mjs";
|
|
6
6
|
import { mut8 } from "@ibgib/ts-gib/dist/V1/transforms/mut8.mjs";
|
|
@@ -543,7 +543,7 @@ export async function validateChallengePool_typeHashRevealV1({ pool }: {
|
|
|
543
543
|
|
|
544
544
|
const { algo, rounds, salt, } = pool.config as KeystonePoolConfig_HashV1;
|
|
545
545
|
|
|
546
|
-
const validAlgos: HashAlgorithm[] = [HashAlgorithm.sha_256];
|
|
546
|
+
const validAlgos: HashAlgorithm[] = [HashAlgorithm.sha_256, HashAlgorithm.sha_512];
|
|
547
547
|
if (algo) {
|
|
548
548
|
if (!validAlgos.includes(algo)) {
|
|
549
549
|
errors.push(`${lc} invalid hash algorithm (${algo}). Must be one of ${validAlgos}. (E: a22399ca3a68e63ffcc7507699be5826)`);
|
|
@@ -1116,3 +1116,45 @@ export async function validateKeystoneGraph({
|
|
|
1116
1116
|
}
|
|
1117
1117
|
}
|
|
1118
1118
|
|
|
1119
|
+
export async function getIdentity({
|
|
1120
|
+
addr,
|
|
1121
|
+
metaspace,
|
|
1122
|
+
space,
|
|
1123
|
+
}: {
|
|
1124
|
+
addr: IbGibAddr,
|
|
1125
|
+
metaspace: MetaspaceService,
|
|
1126
|
+
space: IbGibSpaceAny,
|
|
1127
|
+
}): Promise<KeystoneIbGib_V1 | undefined> {
|
|
1128
|
+
const lc = `[${getIdentity.name}]`;
|
|
1129
|
+
try {
|
|
1130
|
+
if (logalot) { console.log(`${lc} starting... (I: 7f1dac53ff4691cb08cd267bf75f4326)`); }
|
|
1131
|
+
const resGet = await metaspace.get({ addr, space });
|
|
1132
|
+
const identityIbGib = resGet.ibGibs?.at(0) as KeystoneIbGib_V1;
|
|
1133
|
+
if (identityIbGib) {
|
|
1134
|
+
if (!identityIbGib.data) { throw new Error(`(UNEXPECTED) identityIbGib.data falsy? (E: d2f188232cd3bafb873b89e3a25a4826)`); }
|
|
1135
|
+
// should actually be a `isKeystone` guard, but hey...
|
|
1136
|
+
if (!identityIbGib.ib.startsWith(KEYSTONE_ATOM)) {
|
|
1137
|
+
throw new Error(`invalid. does not start with ${KEYSTONE_ATOM} (E: 4523f8647cc139f8c49597fb86329426)`);
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
return identityIbGib;
|
|
1141
|
+
} catch (error) {
|
|
1142
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
1143
|
+
throw error;
|
|
1144
|
+
} finally {
|
|
1145
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
export async function getIdentity_throwIfUndefined({
|
|
1149
|
+
addr,
|
|
1150
|
+
metaspace,
|
|
1151
|
+
space,
|
|
1152
|
+
}: {
|
|
1153
|
+
addr: IbGibAddr,
|
|
1154
|
+
metaspace: MetaspaceService,
|
|
1155
|
+
space: IbGibSpaceAny,
|
|
1156
|
+
}): Promise<KeystoneIbGib_V1> {
|
|
1157
|
+
const identityIbGib = await getIdentity({ metaspace, addr, space });
|
|
1158
|
+
if (!identityIbGib) { throw new Error(`addr (${addr}) not found in space: ${space.ib} (E: 7533682e805819cc78bdb0d8960be826)`); }
|
|
1159
|
+
return identityIbGib;
|
|
1160
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { HashAlgorithm } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
|
|
2
|
+
import { KeystoneReplenishStrategy, KeystoneChallengeType } from "./keystone-types.mjs";
|
|
3
|
+
|
|
4
|
+
export interface KeystoneBehaviorProfileTemplate {
|
|
5
|
+
size: number;
|
|
6
|
+
replenish: KeystoneReplenishStrategy;
|
|
7
|
+
selectSequentially: number;
|
|
8
|
+
selectRandomly: number;
|
|
9
|
+
targetBindingChars: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface KeystonePoolTemplate {
|
|
13
|
+
id: string;
|
|
14
|
+
allowedVerbs: string[];
|
|
15
|
+
behaviorProfile?: string; // Reference to a behavior profile key
|
|
16
|
+
behaviorInline?: KeystoneBehaviorProfileTemplate; // Or specify behavior inline
|
|
17
|
+
algo: HashAlgorithm;
|
|
18
|
+
rounds: number;
|
|
19
|
+
type?: KeystoneChallengeType;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface KeystonePolicyConfigTemplate {
|
|
23
|
+
behaviorProfiles?: Record<string, KeystoneBehaviorProfileTemplate>;
|
|
24
|
+
pools: Record<string, KeystonePoolTemplate>;
|
|
25
|
+
}
|