@ibgib/space-gib 0.0.9 → 0.0.13
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/CHANGELOG.md +8 -0
- package/README.md +1 -0
- package/dist/client/bootstrap.mjs +33 -33
- package/dist/client/bootstrap.mjs.map +3 -3
- package/dist/client/chunk-ROJZUPPE.mjs +19 -0
- package/dist/client/chunk-ROJZUPPE.mjs.map +7 -0
- package/dist/client/chunk-WJHRARK6.mjs +2329 -0
- package/dist/client/chunk-WJHRARK6.mjs.map +7 -0
- package/dist/client/index.mjs +22 -1
- package/dist/client/index.mjs.map +4 -4
- package/dist/client/script.mjs +1 -1
- package/dist/server/server.mjs +19147 -18210
- package/dist/server/server.mjs.map +4 -4
- package/package.json +4 -4
- package/space-gib.localhost-1785337158142.log +75 -0
- package/src/client/AUTO-GENERATED-version.mts +1 -1
- package/src/client/README.md +1 -1
- package/src/client/api/space-gib-api-bridge.mts +8 -224
- package/src/client/ui/shell/space-gib-shell-service.mts +68 -18
- package/src/common/keystone-policies.mts +1 -1
- package/src/server/README.md +3 -2
- package/src/server/server.mts +13 -32
- package/src/server/test.json +0 -0
- package/dist/client/chunk-ACIGPCQW.mjs +0 -2407
- package/dist/client/chunk-ACIGPCQW.mjs.map +0 -7
- package/dist/client/chunk-QRMTJE6M.mjs +0 -42
- package/dist/client/chunk-QRMTJE6M.mjs.map +0 -7
- package/space-gib.localhost-1783713259760.log +0 -45
- package/src/client/components/identity-header/IMPLEMENTATION.md +0 -45
- package/src/client/components/identity-header/identity-header.css +0 -112
- package/src/client/components/identity-header/identity-header.html +0 -11
- package/src/client/components/identity-header/identity-header.mts +0 -439
- package/src/client/components/identity-manager/IMPLEMENTATION.md +0 -100
- package/src/client/components/identity-manager/identity-manager.css +0 -171
- package/src/client/components/identity-manager/identity-manager.html +0 -19
- package/src/client/components/identity-manager/identity-manager.mts +0 -639
- package/src/client/components/keystone-creator/keystone-creator.css +0 -65
- package/src/client/components/keystone-creator/keystone-creator.html +0 -41
- package/src/client/components/keystone-creator/keystone-creator.mts +0 -443
- package/src/client/components/keystone-details/keystone-details.css +0 -611
- package/src/client/components/keystone-details/keystone-details.html +0 -151
- package/src/client/components/keystone-details/keystone-details.mts +0 -1213
- package/src/client/components/keystone-scrubber/SCRUBBER_IMPLEMENTATION.md +0 -33
- package/src/client/components/keystone-scrubber/keystone-scrubber.css +0 -46
- package/src/client/components/keystone-scrubber/keystone-scrubber.html +0 -15
- package/src/client/components/keystone-scrubber/keystone-scrubber.mts +0 -356
- package/src/server/bootstrap-helper.mts +0 -141
- package/src/server/bootstrap-helper.respec.mts +0 -100
- package/src/server/metaspace-nodeindexedspace/metaspace-nodeindexedspace.mts +0 -85
- package/src/server/path-constants.mts +0 -101
- package/src/server/path-helper.mts +0 -101
- package/src/server/path-helper.respec.mts +0 -99
- package/src/server/serve-gib/CHANGELOG.md +0 -29
- package/src/server/serve-gib/README.md +0 -43
- package/src/server/serve-gib/constants.mts +0 -1
- package/src/server/serve-gib/handlers/api/debug/ws-echo.handler.mts +0 -105
- package/src/server/serve-gib/handlers/api/health.handler.mts +0 -23
- package/src/server/serve-gib/handlers/api/health.respec.mts +0 -51
- package/src/server/serve-gib/handlers/api/ibgib/ibgib-handler-types.mts +0 -49
- package/src/server/serve-gib/handlers/api/ibgib/ibgib.handler.mts +0 -176
- package/src/server/serve-gib/handlers/api/keystone/keystone-evolve.handler.mts +0 -150
- package/src/server/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +0 -146
- package/src/server/serve-gib/handlers/api/keystone/keystone-get.handler.mts +0 -198
- package/src/server/serve-gib/handlers/api/keystone/keystone-get.respec.mts +0 -107
- package/src/server/serve-gib/handlers/api/keystone/keystone-handler-types.mts +0 -29
- package/src/server/serve-gib/handlers/api/keystone/keystone-post.handler.mts +0 -55
- package/src/server/serve-gib/handlers/api/keystone/keystone-post.respec.mts +0 -130
- package/src/server/serve-gib/handlers/api/keystone/sso-config.handler.mts +0 -66
- package/src/server/serve-gib/handlers/api/keystone/sso-link.handler.mts +0 -140
- package/src/server/serve-gib/handlers/api/keystone/sso-login.handler.mts +0 -190
- package/src/server/serve-gib/handlers/error-handler.mts +0 -36
- package/src/server/serve-gib/handlers/handler-base.mts +0 -383
- package/src/server/serve-gib/handlers/static-handler.mts +0 -82
- package/src/server/serve-gib/handlers/ws/sync-upgrade-handler-base.mts +0 -233
- package/src/server/serve-gib/handlers/ws/sync-upgrade.handler.mts +0 -24
- package/src/server/serve-gib/handlers/ws/ws-helper.mts +0 -216
- package/src/server/serve-gib/handlers/ws/ws-types.mts +0 -53
- package/src/server/serve-gib/serve-gib-helpers.mts +0 -32
- package/src/server/serve-gib/serve-gib-v1.mts +0 -172
- package/src/server/serve-gib/serve-gib.respec.mts +0 -90
- package/src/server/serve-gib/types.mts +0 -102
- package/src/server/server-constants.mts +0 -2
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
<div id="container" class="component-container">
|
|
2
|
-
<h2 id="title">Keystone Creator</h2>
|
|
3
|
-
<div class="content">
|
|
4
|
-
<p>This will generate a new root keystone (identity) for your space.</p>
|
|
5
|
-
|
|
6
|
-
<div class="input-group">
|
|
7
|
-
<label for="input-username">Username</label>
|
|
8
|
-
<input type="text" id="input-username" placeholder="Enter your username..." class="text-input">
|
|
9
|
-
</div>
|
|
10
|
-
|
|
11
|
-
<div class="input-group">
|
|
12
|
-
<label for="input-description">Description (Optional)</label>
|
|
13
|
-
<input type="text" id="input-description" placeholder="Enter an optional description..." class="text-input">
|
|
14
|
-
</div>
|
|
15
|
-
|
|
16
|
-
<div class="input-group">
|
|
17
|
-
<label for="input-secret">Master Secret (Keep this private!)</label>
|
|
18
|
-
<input type="password" id="input-secret" placeholder="Enter your master secret..." class="secret-input">
|
|
19
|
-
</div>
|
|
20
|
-
|
|
21
|
-
<div class="checkbox-group" style="margin-bottom: 1.5rem; display: flex; align-items: center; gap: 0.5rem;">
|
|
22
|
-
<input type="checkbox" id="checkbox-make-active" checked style="cursor: pointer; width: 1rem; height: 1rem;">
|
|
23
|
-
<label for="checkbox-make-active" style="cursor: pointer; font-size: 0.9rem; user-select: none;">Make this the active identity</label>
|
|
24
|
-
</div>
|
|
25
|
-
|
|
26
|
-
<div class="action-row">
|
|
27
|
-
<button id="btn-generate" class="action-btn">Generate Identity Keystone</button>
|
|
28
|
-
</div>
|
|
29
|
-
|
|
30
|
-
<div id="status-area" class="status-area hidden">
|
|
31
|
-
<p id="status-text" class="status-msg"></p>
|
|
32
|
-
</div>
|
|
33
|
-
|
|
34
|
-
<div id="result-area" class="result-area collapsed">
|
|
35
|
-
<h3>New Keystone Generated!</h3>
|
|
36
|
-
<p class="address-label">Address:</p>
|
|
37
|
-
<code id="keystone-addr" class="keystone-addr"></code>
|
|
38
|
-
<p class="warning">⚠️ Store this address safely. It is your root identity for this space.</p>
|
|
39
|
-
</div>
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
@@ -1,443 +0,0 @@
|
|
|
1
|
-
import thisCss from "./keystone-creator.css";
|
|
2
|
-
import thisHtml from "./keystone-creator.html";
|
|
3
|
-
import styleCss from "../../style.css";
|
|
4
|
-
|
|
5
|
-
import { delay, extractErrorMsg, hash } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
|
|
6
|
-
import { HashAlgorithm } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
|
|
7
|
-
import { IbGibAddr } from "@ibgib/ts-gib/dist/types.mjs";
|
|
8
|
-
import { IbGib_V1 } from "@ibgib/ts-gib/dist/V1/types.mjs";
|
|
9
|
-
import { getIbGibAddr } from "@ibgib/ts-gib/dist/helper.mjs";
|
|
10
|
-
import { KeystoneService_V1 } from "@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs";
|
|
11
|
-
import {
|
|
12
|
-
KeystonePoolConfig, KeystoneChallengeType, KeystoneReplenishStrategy
|
|
13
|
-
} from "@ibgib/core-gib/dist/keystone/keystone-types.mjs";
|
|
14
|
-
import { KeystoneProfileBuilder } from "@ibgib/core-gib/dist/keystone/policy/keystone-profile-builder.mjs";
|
|
15
|
-
import { getGlobalMetaspace_waitIfNeeded, getLocalCoupledIbGibForDomainIbGib } from "@ibgib/web-gib/dist/helpers.mjs";
|
|
16
|
-
import {
|
|
17
|
-
IbGibDynamicComponentMetaBase, IbGibFormInstanceBase,
|
|
18
|
-
} from "@ibgib/web-gib/dist/ui/component/ibgib-dynamic-component-bases.mjs";
|
|
19
|
-
import {
|
|
20
|
-
ElementsBase, IbGibDynamicComponentInstance,
|
|
21
|
-
IbGibDynamicComponentInstanceInitOpts,
|
|
22
|
-
} from "@ibgib/web-gib/dist/ui/component/component-types.mjs";
|
|
23
|
-
|
|
24
|
-
import { getComponentCtorArg } from "../../helpers.web.mjs";
|
|
25
|
-
import { spaceGibApiBridge } from "../../api/space-gib-api-bridge.mjs";
|
|
26
|
-
import { devLog } from "../../dev-tools.mjs";
|
|
27
|
-
|
|
28
|
-
import {
|
|
29
|
-
createSettings, getSectionName, getSettingsScope
|
|
30
|
-
} from "@ibgib/web-gib/dist/common/settings/settings-helpers.mjs";
|
|
31
|
-
import { SettingsType } from "@ibgib/web-gib/dist/common/settings/settings-constants.mjs";
|
|
32
|
-
import { SettingsIbGib_V1 } from "@ibgib/web-gib/dist/common/settings/settings-types.mjs";
|
|
33
|
-
import { updateSpecialIndex, mut8Timeline } from "@ibgib/core-gib/dist/timeline/timeline-api.mjs";
|
|
34
|
-
import { toDto } from "@ibgib/core-gib/dist/common/other/ibgib-helper.mjs";
|
|
35
|
-
import { KEYSTONE_USERNAME_REGEXP, KEYSTONE_DESCRIPTION_REGEXP, KEYSTONE_VERB_SYNC, KEYSTONE_VERB_CONNECT } from "@ibgib/core-gib/dist/keystone/keystone-constants.mjs";
|
|
36
|
-
import { deriveDelegateSecret } from "@ibgib/core-gib/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs";
|
|
37
|
-
import { EVENT_IBGIB_IDENTITY_REQUEST_CHANGE } from "@ibgib/web-gib/dist/ui/ui-constants.mjs";
|
|
38
|
-
|
|
39
|
-
export const KEYSTONE_CREATOR_COMPONENT_NAME = 'ibgib-keystone-creator';
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Metadata for the Keystone Creator component.
|
|
43
|
-
*/
|
|
44
|
-
export class KeystoneCreatorComponentMeta extends IbGibDynamicComponentMetaBase {
|
|
45
|
-
protected lc: string = `[KeystoneCreatorComponentMeta]`;
|
|
46
|
-
|
|
47
|
-
routeRegExp?: RegExp = new RegExp(`^${KEYSTONE_CREATOR_COMPONENT_NAME}$`);
|
|
48
|
-
componentName = KEYSTONE_CREATOR_COMPONENT_NAME;
|
|
49
|
-
|
|
50
|
-
constructor() {
|
|
51
|
-
super(getComponentCtorArg());
|
|
52
|
-
if (!customElements.get(this.componentName)) {
|
|
53
|
-
customElements.define(this.componentName, KeystoneCreatorComponentInstance);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
async createInstance({
|
|
58
|
-
path,
|
|
59
|
-
ibGibAddr
|
|
60
|
-
}: {
|
|
61
|
-
path: string;
|
|
62
|
-
ibGibAddr: IbGibAddr;
|
|
63
|
-
}): Promise<IbGibDynamicComponentInstance> {
|
|
64
|
-
const lc = `${this.lc}[${this.createInstance.name}]`;
|
|
65
|
-
const component = document.createElement(this.componentName) as KeystoneCreatorComponentInstance;
|
|
66
|
-
await component.initialize({
|
|
67
|
-
ibGibAddr,
|
|
68
|
-
meta: this,
|
|
69
|
-
html: thisHtml,
|
|
70
|
-
css: [styleCss, thisCss],
|
|
71
|
-
});
|
|
72
|
-
return component;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* References to DOM elements within the component's shadow root.
|
|
78
|
-
*/
|
|
79
|
-
interface KeystoneCreatorElements extends ElementsBase {
|
|
80
|
-
containerEl: HTMLDivElement;
|
|
81
|
-
titleEl: HTMLHeadingElement;
|
|
82
|
-
btnGenerateEl: HTMLButtonElement;
|
|
83
|
-
resultAreaEl: HTMLDivElement;
|
|
84
|
-
keystoneAddrEl: HTMLElement;
|
|
85
|
-
inputUsername: HTMLInputElement;
|
|
86
|
-
inputDescription: HTMLInputElement;
|
|
87
|
-
inputSecret: HTMLInputElement;
|
|
88
|
-
checkboxMakeActive: HTMLInputElement;
|
|
89
|
-
statusArea: HTMLDivElement;
|
|
90
|
-
statusText: HTMLParagraphElement;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Concrete implementation of the Keystone Creator component.
|
|
95
|
-
*/
|
|
96
|
-
export class KeystoneCreatorComponentInstance
|
|
97
|
-
extends IbGibFormInstanceBase<IbGib_V1, KeystoneCreatorElements>
|
|
98
|
-
implements IbGibDynamicComponentInstance<IbGib_V1, KeystoneCreatorElements> {
|
|
99
|
-
|
|
100
|
-
protected lc: string = `[KeystoneCreatorComponentInstance]`;
|
|
101
|
-
private hasExistingIdentities = false;
|
|
102
|
-
|
|
103
|
-
constructor() {
|
|
104
|
-
super();
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
override async initialize(opts: IbGibDynamicComponentInstanceInitOpts): Promise<void> {
|
|
108
|
-
await super.initialize(opts);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
override async created(): Promise<void> {
|
|
112
|
-
this.elements = {} as KeystoneCreatorElements;
|
|
113
|
-
|
|
114
|
-
this.elements.containerEl = this.shadowRoot!.getElementById('container') as HTMLDivElement;
|
|
115
|
-
this.elements.titleEl = this.shadowRoot!.getElementById('title') as HTMLHeadingElement;
|
|
116
|
-
this.elements.btnGenerateEl = this.shadowRoot!.getElementById('btn-generate') as HTMLButtonElement;
|
|
117
|
-
this.elements.resultAreaEl = this.shadowRoot!.getElementById('result-area') as HTMLDivElement;
|
|
118
|
-
this.elements.keystoneAddrEl = this.shadowRoot!.getElementById('keystone-addr') as HTMLElement;
|
|
119
|
-
this.elements.inputUsername = this.shadowRoot!.getElementById('input-username') as HTMLInputElement;
|
|
120
|
-
this.elements.inputDescription = this.shadowRoot!.getElementById('input-description') as HTMLInputElement;
|
|
121
|
-
this.elements.inputSecret = this.shadowRoot!.getElementById('input-secret') as HTMLInputElement;
|
|
122
|
-
this.elements.checkboxMakeActive = this.shadowRoot!.getElementById('checkbox-make-active') as HTMLInputElement;
|
|
123
|
-
this.elements.statusArea = this.shadowRoot!.getElementById('status-area') as HTMLDivElement;
|
|
124
|
-
this.elements.statusText = this.shadowRoot!.getElementById('status-text') as HTMLParagraphElement;
|
|
125
|
-
|
|
126
|
-
// ElementBase requires contentEl
|
|
127
|
-
this.elements.contentEl = this.elements.containerEl;
|
|
128
|
-
|
|
129
|
-
this.initHandlers();
|
|
130
|
-
|
|
131
|
-
if (this.ibGibAddr && !this.ibGib) {
|
|
132
|
-
await this.loadIbGib();
|
|
133
|
-
}
|
|
134
|
-
await this.checkExistingIdentities();
|
|
135
|
-
await this.renderUI();
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
private async checkExistingIdentities() {
|
|
139
|
-
const lc = `${this.lc}[checkExistingIdentities]`;
|
|
140
|
-
try {
|
|
141
|
-
const metaspace = await getGlobalMetaspace_waitIfNeeded();
|
|
142
|
-
const space = await metaspace.getLocalUserSpace({});
|
|
143
|
-
if (space) {
|
|
144
|
-
const keystonesIndex = await metaspace.getSpecialIbGib({
|
|
145
|
-
type: "keystones",
|
|
146
|
-
space,
|
|
147
|
-
initialize: true,
|
|
148
|
-
});
|
|
149
|
-
const registeredKeystones = keystonesIndex?.rel8ns?.keystone ?? [];
|
|
150
|
-
this.hasExistingIdentities = registeredKeystones.length > 0;
|
|
151
|
-
}
|
|
152
|
-
} catch (error) {
|
|
153
|
-
console.warn(`${lc} Error checking existing identities: ${extractErrorMsg(error)}`);
|
|
154
|
-
this.hasExistingIdentities = false;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const checkbox = this.elements!.checkboxMakeActive;
|
|
158
|
-
if (checkbox) {
|
|
159
|
-
if (!this.hasExistingIdentities) {
|
|
160
|
-
checkbox.checked = true;
|
|
161
|
-
checkbox.disabled = true;
|
|
162
|
-
checkbox.title = "At least one active identity is required.";
|
|
163
|
-
} else {
|
|
164
|
-
checkbox.disabled = false;
|
|
165
|
-
checkbox.title = "";
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
override async disconnected(): Promise<void> {
|
|
171
|
-
// cleanup if needed
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
private initHandlers() {
|
|
175
|
-
this.elements!.btnGenerateEl.addEventListener('click', () => this.handleGenerate());
|
|
176
|
-
|
|
177
|
-
// Clear invalid styling when user inputs text
|
|
178
|
-
this.elements!.inputUsername.addEventListener('input', () => {
|
|
179
|
-
this.elements!.inputUsername.classList.remove('invalid');
|
|
180
|
-
});
|
|
181
|
-
this.elements!.inputDescription.addEventListener('input', () => {
|
|
182
|
-
this.elements!.inputDescription.classList.remove('invalid');
|
|
183
|
-
});
|
|
184
|
-
this.elements!.inputSecret.addEventListener('input', () => {
|
|
185
|
-
this.elements!.inputSecret.classList.remove('invalid');
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Triggered by the "Generate" button.
|
|
191
|
-
* Orchestrates: Secret -> Local Genesis -> Graph Collection -> Server Sync.
|
|
192
|
-
*/
|
|
193
|
-
protected async handleGenerate() {
|
|
194
|
-
const lc = `${this.lc}[${this.handleGenerate.name}]`;
|
|
195
|
-
try {
|
|
196
|
-
console.log(`${lc} [NAG][ibgib-paradigm] starting genesis orchestration...`);
|
|
197
|
-
/**
|
|
198
|
-
* Delay update messages so the human eye has a chance to comprehend
|
|
199
|
-
* progress.
|
|
200
|
-
*/
|
|
201
|
-
const humanEyeDelay = 500;
|
|
202
|
-
this.setStatus("Initializing genesis...", "info");
|
|
203
|
-
|
|
204
|
-
devLog('Starting local genesis orchestration...');
|
|
205
|
-
|
|
206
|
-
// Validate Username using base class validation plumbing
|
|
207
|
-
if (!this.validateInputPattern({
|
|
208
|
-
input: this.elements!.inputUsername,
|
|
209
|
-
pattern: KEYSTONE_USERNAME_REGEXP,
|
|
210
|
-
errorMessage: "Username must be 1-63 characters (alphanumeric, underscores, hyphens, dots).",
|
|
211
|
-
required: true
|
|
212
|
-
})) {
|
|
213
|
-
this.setStatus("Invalid username. Must be 1-63 characters (alphanumeric, _, -, .).", "error");
|
|
214
|
-
devLog('✗ Invalid username.');
|
|
215
|
-
return; /* <<<< returns early */
|
|
216
|
-
}
|
|
217
|
-
const username = this.elements!.inputUsername.value.trim();
|
|
218
|
-
|
|
219
|
-
// Validate Description using base class validation plumbing
|
|
220
|
-
if (!this.validateInputPattern({
|
|
221
|
-
input: this.elements!.inputDescription,
|
|
222
|
-
pattern: KEYSTONE_DESCRIPTION_REGEXP,
|
|
223
|
-
errorMessage: "Description must be 0-128 characters and consist of English characters and common punctuation.",
|
|
224
|
-
required: false
|
|
225
|
-
})) {
|
|
226
|
-
this.setStatus("Invalid description. Alphanumeric + common punctuation, max 128 chars.", "error");
|
|
227
|
-
devLog('✗ Invalid description.');
|
|
228
|
-
return; /* <<<< returns early */
|
|
229
|
-
}
|
|
230
|
-
const description = this.elements!.inputDescription.value.trim();
|
|
231
|
-
|
|
232
|
-
const masterSecret = this.elements!.inputSecret.value;
|
|
233
|
-
if (!masterSecret) {
|
|
234
|
-
this.elements!.inputSecret.classList.add('invalid');
|
|
235
|
-
this.setStatus("Please enter a master secret.", "error");
|
|
236
|
-
devLog('✗ Please enter a master secret.');
|
|
237
|
-
return; /* <<<< returns early */
|
|
238
|
-
} else {
|
|
239
|
-
this.elements!.inputSecret.classList.remove('invalid');
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
this.showBusy({
|
|
243
|
-
isBusy: true,
|
|
244
|
-
title: 'Generating Identity...',
|
|
245
|
-
msg: 'Preparing configuration and policy options...',
|
|
246
|
-
animationEmoji: '⚙️',
|
|
247
|
-
submitBtnSelector: '#btn-generate',
|
|
248
|
-
loadingText: 'Generating...'
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
// 1. Prepare Primary/Domain Keystone Configs
|
|
252
|
-
const builder = KeystoneProfileBuilder.buildKeystone('domain')
|
|
253
|
-
.withUsername(username)
|
|
254
|
-
.withDescription(description)
|
|
255
|
-
.withDetails({
|
|
256
|
-
client: 'space-gib-web',
|
|
257
|
-
role: 'domain-identity'
|
|
258
|
-
});
|
|
259
|
-
const configs = await builder.compileConfigs();
|
|
260
|
-
|
|
261
|
-
// 2. Get local services
|
|
262
|
-
const metaspace = await getGlobalMetaspace_waitIfNeeded();
|
|
263
|
-
const space = await metaspace.getLocalUserSpace({});
|
|
264
|
-
if (!space) { throw new Error("No default space found in metaspace."); }
|
|
265
|
-
|
|
266
|
-
// 3. Perform Genesis (Local)
|
|
267
|
-
this.showBusy({
|
|
268
|
-
isBusy: true,
|
|
269
|
-
title: 'Generating Identity...',
|
|
270
|
-
msg: 'Performing cryptographic local genesis...\n(This runs compute-heavy Key Derivation Functions)',
|
|
271
|
-
animationEmoji: '🗝️'
|
|
272
|
-
});
|
|
273
|
-
const keystoneService = new KeystoneService_V1();
|
|
274
|
-
const keystoneIbGib = await keystoneService.genesis({
|
|
275
|
-
masterSecret,
|
|
276
|
-
configs,
|
|
277
|
-
metaspace,
|
|
278
|
-
space,
|
|
279
|
-
frameDetails: builder.getFrameDetails(),
|
|
280
|
-
isPrimary: true
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
const addr = getIbGibAddr({ ibGib: keystoneIbGib });
|
|
284
|
-
console.log(`${lc} [NAG][ibgib-paradigm] local genesis complete: ${addr}`);
|
|
285
|
-
await delay(humanEyeDelay); // for human eyes, not needed for functionality
|
|
286
|
-
this.setStatus("Local genesis complete. Creating sync delegate...", "info");
|
|
287
|
-
devLog(`✓ Local genesis complete: ${addr}`);
|
|
288
|
-
|
|
289
|
-
// Automatically generate Sync Delegate Keystone
|
|
290
|
-
this.showBusy({
|
|
291
|
-
isBusy: true,
|
|
292
|
-
title: 'Creating Sync Delegate...',
|
|
293
|
-
msg: 'Generating cryptographic sync delegate keys...',
|
|
294
|
-
animationEmoji: '🔑'
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
const delegateSecret = await deriveDelegateSecret({ masterSecret });
|
|
298
|
-
const delegateBuilder = KeystoneProfileBuilder.buildKeystone('sync')
|
|
299
|
-
.withUsername(`${username}-sync`)
|
|
300
|
-
.withDescription(`Sync Delegate for ${username}`)
|
|
301
|
-
.withDetails({
|
|
302
|
-
client: 'space-gib-web',
|
|
303
|
-
role: 'sync-delegate'
|
|
304
|
-
});
|
|
305
|
-
const delegateConfigs = await delegateBuilder.compileConfigs();
|
|
306
|
-
|
|
307
|
-
const delegateKeystoneIbGib = await keystoneService.genesis({
|
|
308
|
-
masterSecret: delegateSecret,
|
|
309
|
-
configs: delegateConfigs,
|
|
310
|
-
metaspace,
|
|
311
|
-
space,
|
|
312
|
-
frameDetails: delegateBuilder.getFrameDetails()
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
const delegateAddr = getIbGibAddr({ ibGib: delegateKeystoneIbGib });
|
|
316
|
-
console.log(`${lc} sync delegate genesis complete: ${delegateAddr}`);
|
|
317
|
-
await delay(humanEyeDelay);
|
|
318
|
-
|
|
319
|
-
// Register delegate on parent
|
|
320
|
-
this.setStatus("Registering delegate on parent...", "info");
|
|
321
|
-
this.showBusy({
|
|
322
|
-
isBusy: true,
|
|
323
|
-
title: 'Registering Delegate...',
|
|
324
|
-
msg: 'Evolving domain identity to register delegate...',
|
|
325
|
-
animationEmoji: '📝'
|
|
326
|
-
});
|
|
327
|
-
const evolvedParentKeystoneIbGib = await keystoneService.registerDelegate({
|
|
328
|
-
parentKeystone: keystoneIbGib,
|
|
329
|
-
delegateKeystone: delegateKeystoneIbGib,
|
|
330
|
-
masterSecret,
|
|
331
|
-
metaspace,
|
|
332
|
-
space,
|
|
333
|
-
allowedVerbs: [KEYSTONE_VERB_SYNC, KEYSTONE_VERB_CONNECT]
|
|
334
|
-
});
|
|
335
|
-
const evolvedParentAddr = getIbGibAddr({ ibGib: evolvedParentKeystoneIbGib });
|
|
336
|
-
console.log(`${lc} delegate registered. evolved parent address: ${evolvedParentAddr}`);
|
|
337
|
-
await delay(humanEyeDelay);
|
|
338
|
-
|
|
339
|
-
// 4. Post to Server
|
|
340
|
-
devLog(`Posting genesis keystone to server...`);
|
|
341
|
-
this.setStatus("Syncing genesis to server...", "info");
|
|
342
|
-
this.showBusy({
|
|
343
|
-
isBusy: true,
|
|
344
|
-
title: 'Syncing to Server...',
|
|
345
|
-
msg: [
|
|
346
|
-
'Posting genesis keystone to server sync node...',
|
|
347
|
-
'(may take awhile, depending on strength of keystone...)',
|
|
348
|
-
].join('\n'),
|
|
349
|
-
animationEmoji: '🔄'
|
|
350
|
-
});
|
|
351
|
-
const resSync = await spaceGibApiBridge.postGenesisKeystone(keystoneIbGib);
|
|
352
|
-
if (!resSync.success) {
|
|
353
|
-
this.setStatus(`Sync failed: ${resSync.message}`, "error");
|
|
354
|
-
devLog(`✗ Server rejected genesis keystone: ${resSync.message}`);
|
|
355
|
-
return; /* <<<< returns early */
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Post evolved keystone + delegate keystone
|
|
359
|
-
this.setStatus("Syncing delegate registration to server...", "info");
|
|
360
|
-
this.showBusy({
|
|
361
|
-
isBusy: true,
|
|
362
|
-
title: 'Syncing Delegate...',
|
|
363
|
-
msg: 'Posting evolved domain identity and sync delegate to server...',
|
|
364
|
-
animationEmoji: '🔄'
|
|
365
|
-
});
|
|
366
|
-
const resEvolve = await spaceGibApiBridge.putEvolveKeystone({
|
|
367
|
-
domainAddr: addr,
|
|
368
|
-
keystoneIbGib: evolvedParentKeystoneIbGib,
|
|
369
|
-
relatedKeystoneIbGibs: [delegateKeystoneIbGib]
|
|
370
|
-
});
|
|
371
|
-
if (!resEvolve.success) {
|
|
372
|
-
this.setStatus(`Delegate registration sync failed: ${resEvolve.message}`, "error");
|
|
373
|
-
devLog(`✗ Server rejected delegate registration: ${resEvolve.message}`);
|
|
374
|
-
return; /* <<<< returns early */
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
// 5. Register with the keystones special index
|
|
378
|
-
this.showBusy({
|
|
379
|
-
isBusy: true,
|
|
380
|
-
title: 'Registering Identity...',
|
|
381
|
-
msg: 'Server sync succeeded!\nUpdating local identity indexes and scope settings...',
|
|
382
|
-
animationEmoji: '💾'
|
|
383
|
-
});
|
|
384
|
-
await delay(humanEyeDelay); // for human eyes, not needed for functionality
|
|
385
|
-
await updateSpecialIndex({
|
|
386
|
-
type: "keystones",
|
|
387
|
-
rel8nInfos: [
|
|
388
|
-
{
|
|
389
|
-
rel8nName: "keystone",
|
|
390
|
-
ibGibs: [
|
|
391
|
-
toDto({ ibGib: evolvedParentKeystoneIbGib }),
|
|
392
|
-
toDto({ ibGib: delegateKeystoneIbGib })
|
|
393
|
-
],
|
|
394
|
-
},
|
|
395
|
-
],
|
|
396
|
-
metaspace,
|
|
397
|
-
space,
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
// Expose for dev tools
|
|
401
|
-
(window as any).dev_domainI = evolvedParentKeystoneIbGib;
|
|
402
|
-
(window as any).dev_domainIMasterSecret = masterSecret;
|
|
403
|
-
(window as any).dev_syncDelegate = delegateKeystoneIbGib;
|
|
404
|
-
(window as any).dev_syncDelegateSecret = delegateSecret;
|
|
405
|
-
|
|
406
|
-
// 6. Request to make the new identity active if the checkbox is checked
|
|
407
|
-
const makeActive = this.elements!.checkboxMakeActive?.checked;
|
|
408
|
-
if (makeActive) {
|
|
409
|
-
window.dispatchEvent(new CustomEvent(EVENT_IBGIB_IDENTITY_REQUEST_CHANGE, {
|
|
410
|
-
detail: { activeIdentityAddr: evolvedParentAddr },
|
|
411
|
-
bubbles: true,
|
|
412
|
-
composed: true
|
|
413
|
-
}));
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
// 7. Success
|
|
417
|
-
this.elements!.keystoneAddrEl.textContent = evolvedParentAddr;
|
|
418
|
-
this.elements!.statusArea.classList.remove('hidden');
|
|
419
|
-
this.setStatus("Keystone successfully created and synced!", "success");
|
|
420
|
-
await delay(humanEyeDelay); // for human eyes, not needed for functionality
|
|
421
|
-
devLog(`✓ Keystone successfully created and synced!`);
|
|
422
|
-
|
|
423
|
-
} catch (error) {
|
|
424
|
-
const emsg = extractErrorMsg(error);
|
|
425
|
-
console.error(`${lc} ${emsg}`);
|
|
426
|
-
this.setStatus(`Error: ${emsg}`, "error");
|
|
427
|
-
devLog(`✗ Error: ${emsg}`);
|
|
428
|
-
} finally {
|
|
429
|
-
this.showBusy({
|
|
430
|
-
isBusy: false,
|
|
431
|
-
submitBtnSelector: '#btn-generate'
|
|
432
|
-
});
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
protected override async renderUI(): Promise<void> {
|
|
437
|
-
// No complex rendering needed for this simple creator component yet
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
override async handleContextUpdated(): Promise<void> {
|
|
441
|
-
await this.renderUI();
|
|
442
|
-
}
|
|
443
|
-
}
|