@gtkx/runtime 1.0.0-rc.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -9
- package/dist/application-class.d.ts +32 -0
- package/dist/application-class.d.ts.map +1 -0
- package/dist/application-class.js +68 -0
- package/dist/application-class.js.map +1 -0
- package/dist/arg.d.ts +9 -3
- package/dist/arg.d.ts.map +1 -1
- package/dist/arg.js +4 -3
- package/dist/arg.js.map +1 -1
- package/dist/bind.d.ts +11 -0
- package/dist/bind.d.ts.map +1 -1
- package/dist/bind.js +11 -0
- package/dist/bind.js.map +1 -1
- package/dist/callback.d.ts +2 -1
- package/dist/callback.d.ts.map +1 -1
- package/dist/callback.js +119 -21
- package/dist/callback.js.map +1 -1
- package/dist/closure.d.ts +26 -0
- package/dist/closure.d.ts.map +1 -0
- package/dist/closure.js +99 -0
- package/dist/closure.js.map +1 -0
- package/dist/descriptors.d.ts +105 -6
- package/dist/descriptors.d.ts.map +1 -1
- package/dist/descriptors.js +56 -12
- package/dist/descriptors.js.map +1 -1
- package/dist/error.d.ts +7 -0
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +1 -1
- package/dist/error.js.map +1 -1
- package/dist/fn.d.ts +24 -3
- package/dist/fn.d.ts.map +1 -1
- package/dist/fn.js +70 -33
- package/dist/fn.js.map +1 -1
- package/dist/index.d.ts +29 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -4
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +1 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -0
- package/dist/internal.js.map +1 -1
- package/dist/library.d.ts +2 -1
- package/dist/library.d.ts.map +1 -1
- package/dist/library.js +2 -1
- package/dist/library.js.map +1 -1
- package/dist/lifecycle.d.ts +52 -10
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +62 -18
- package/dist/lifecycle.js.map +1 -1
- package/dist/listeners.d.ts +6 -0
- package/dist/listeners.d.ts.map +1 -1
- package/dist/listeners.js +3 -1
- package/dist/listeners.js.map +1 -1
- package/dist/mixin.d.ts +16 -2
- package/dist/mixin.d.ts.map +1 -1
- package/dist/mixin.js +18 -6
- package/dist/mixin.js.map +1 -1
- package/dist/native-value.d.ts +8 -0
- package/dist/native-value.d.ts.map +1 -1
- package/dist/native-value.js +12 -3
- package/dist/native-value.js.map +1 -1
- package/dist/object.d.ts +34 -6
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +89 -25
- package/dist/object.js.map +1 -1
- package/dist/param-spec.d.ts +11 -0
- package/dist/param-spec.d.ts.map +1 -0
- package/dist/param-spec.js +149 -0
- package/dist/param-spec.js.map +1 -0
- package/dist/promisify.d.ts +3 -5
- package/dist/promisify.d.ts.map +1 -1
- package/dist/promisify.js +4 -3
- package/dist/promisify.js.map +1 -1
- package/dist/properties.d.ts +39 -7
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +305 -42
- package/dist/properties.js.map +1 -1
- package/dist/register-class.d.ts +119 -14
- package/dist/register-class.d.ts.map +1 -1
- package/dist/register-class.js +109 -80
- package/dist/register-class.js.map +1 -1
- package/dist/registry.d.ts +81 -17
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +72 -26
- package/dist/registry.js.map +1 -1
- package/dist/signal.d.ts +22 -3
- package/dist/signal.d.ts.map +1 -1
- package/dist/signal.js +64 -8
- package/dist/signal.js.map +1 -1
- package/dist/t.d.ts +44 -0
- package/dist/t.d.ts.map +1 -1
- package/dist/t.js.map +1 -1
- package/dist/type.d.ts +2 -2
- package/dist/type.d.ts.map +1 -1
- package/dist/type.js +2 -0
- package/dist/type.js.map +1 -1
- package/dist/value.d.ts +10 -10
- package/dist/value.d.ts.map +1 -1
- package/dist/value.js +44 -22
- package/dist/value.js.map +1 -1
- package/dist/vfunc-call.d.ts +37 -0
- package/dist/vfunc-call.d.ts.map +1 -0
- package/dist/vfunc-call.js +168 -0
- package/dist/vfunc-call.js.map +1 -0
- package/dist/vfunc-seeds.d.ts +12 -0
- package/dist/vfunc-seeds.d.ts.map +1 -0
- package/dist/vfunc-seeds.js +19 -0
- package/dist/vfunc-seeds.js.map +1 -0
- package/dist/vfunc.d.ts +8 -0
- package/dist/vfunc.d.ts.map +1 -0
- package/dist/vfunc.js +23 -0
- package/dist/vfunc.js.map +1 -0
- package/package.json +4 -4
- package/src/application-class.ts +116 -0
- package/src/arg.ts +11 -5
- package/src/bind.ts +11 -0
- package/src/callback.ts +163 -23
- package/src/closure.ts +136 -0
- package/src/descriptors.ts +137 -41
- package/src/error.ts +8 -1
- package/src/fn.ts +104 -39
- package/src/index.ts +36 -7
- package/src/internal.ts +1 -0
- package/src/library.ts +2 -1
- package/src/lifecycle.ts +99 -22
- package/src/listeners.ts +9 -1
- package/src/mixin.ts +27 -8
- package/src/native-value.ts +13 -3
- package/src/object.ts +128 -34
- package/src/param-spec.ts +235 -0
- package/src/promisify.ts +8 -8
- package/src/properties.ts +459 -45
- package/src/register-class.ts +329 -114
- package/src/registry.ts +150 -38
- package/src/signal.ts +101 -17
- package/src/t.ts +44 -0
- package/src/type.ts +3 -2
- package/src/value.ts +57 -19
- package/src/vfunc-call.ts +243 -0
- package/src/vfunc-seeds.ts +36 -0
- package/src/vfunc.ts +31 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { type ExternalObject, type Handle, read } from "@gtkx/native";
|
|
2
|
+
import { bind } from "./bind.js";
|
|
3
|
+
import { biguint64T, booleanT, stringT, uint32T, voidT } from "./descriptors.js";
|
|
4
|
+
import { LIB, PARAM_T, VALUE_T } from "./library.js";
|
|
5
|
+
import { getInstanceType } from "./registry.js";
|
|
6
|
+
import {
|
|
7
|
+
getStrvType,
|
|
8
|
+
isTypedClass,
|
|
9
|
+
TYPE_BOOLEAN,
|
|
10
|
+
TYPE_BOXED,
|
|
11
|
+
TYPE_CHAR,
|
|
12
|
+
TYPE_DOUBLE,
|
|
13
|
+
TYPE_ENUM,
|
|
14
|
+
TYPE_FLAGS,
|
|
15
|
+
TYPE_FLOAT,
|
|
16
|
+
TYPE_INT,
|
|
17
|
+
TYPE_INT64,
|
|
18
|
+
TYPE_INTERFACE,
|
|
19
|
+
TYPE_INVALID,
|
|
20
|
+
TYPE_LONG,
|
|
21
|
+
TYPE_OBJECT,
|
|
22
|
+
TYPE_PARAM,
|
|
23
|
+
TYPE_POINTER,
|
|
24
|
+
TYPE_STRING,
|
|
25
|
+
TYPE_UCHAR,
|
|
26
|
+
TYPE_UINT,
|
|
27
|
+
TYPE_UINT64,
|
|
28
|
+
TYPE_ULONG,
|
|
29
|
+
TYPE_VARIANT,
|
|
30
|
+
typeFundamental,
|
|
31
|
+
typeIsA,
|
|
32
|
+
} from "./type.js";
|
|
33
|
+
|
|
34
|
+
type ValueGuard = (value: unknown) => boolean;
|
|
35
|
+
type ParamLayout = { flags: number; valueType: bigint };
|
|
36
|
+
|
|
37
|
+
const PARAM_READABLE = 1;
|
|
38
|
+
const PARAM_WRITABLE = 2;
|
|
39
|
+
const PARAM_CONSTRUCT_ONLY = 8;
|
|
40
|
+
const PARAM_LAX_VALIDATION = 16;
|
|
41
|
+
const READ_FLAGS = PARAM_READABLE | PARAM_WRITABLE | PARAM_CONSTRUCT_ONLY | PARAM_LAX_VALIDATION;
|
|
42
|
+
const FLAGS_BYTE_OFFSET = 16;
|
|
43
|
+
const VALUE_TYPE_BYTE_OFFSET = 24;
|
|
44
|
+
const LAYOUT_PROBE_NAME = "gtkx-param-layout";
|
|
45
|
+
const INT8_MINIMUM = -128;
|
|
46
|
+
const INT8_MAXIMUM = 127;
|
|
47
|
+
const UINT8_MAXIMUM = 255;
|
|
48
|
+
const INT32_MINIMUM = -2_147_483_648;
|
|
49
|
+
const INT32_MAXIMUM = 2_147_483_647;
|
|
50
|
+
const UINT32_MAXIMUM = 4_294_967_295;
|
|
51
|
+
const INT64_MINIMUM = -(2n ** 63n);
|
|
52
|
+
const INT64_MAXIMUM = 2n ** 63n - 1n;
|
|
53
|
+
const UINT64_MAXIMUM = 2n ** 64n - 1n;
|
|
54
|
+
const FLOAT_MAXIMUM = 3.4028234663852886e38;
|
|
55
|
+
|
|
56
|
+
const WRAPPED_FUNDAMENTALS: Set<bigint> = new Set([
|
|
57
|
+
TYPE_BOXED,
|
|
58
|
+
TYPE_INTERFACE,
|
|
59
|
+
TYPE_OBJECT,
|
|
60
|
+
TYPE_PARAM,
|
|
61
|
+
TYPE_VARIANT,
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
const SCALAR_GUARDS: Map<bigint, ValueGuard> = new Map([
|
|
65
|
+
[TYPE_BOOLEAN, isBooleanValue],
|
|
66
|
+
[TYPE_STRING, isStringValue],
|
|
67
|
+
[TYPE_CHAR, integerGuardFor(INT8_MINIMUM, INT8_MAXIMUM)],
|
|
68
|
+
[TYPE_UCHAR, integerGuardFor(0, UINT8_MAXIMUM)],
|
|
69
|
+
[TYPE_INT, integerGuardFor(INT32_MINIMUM, INT32_MAXIMUM)],
|
|
70
|
+
[TYPE_UINT, integerGuardFor(0, UINT32_MAXIMUM)],
|
|
71
|
+
[TYPE_ENUM, integerGuardFor(INT32_MINIMUM, INT32_MAXIMUM)],
|
|
72
|
+
[TYPE_FLAGS, integerGuardFor(0, UINT32_MAXIMUM)],
|
|
73
|
+
[TYPE_LONG, wideIntegerGuardFor(INT64_MINIMUM, INT64_MAXIMUM)],
|
|
74
|
+
[TYPE_ULONG, wideIntegerGuardFor(0n, UINT64_MAXIMUM)],
|
|
75
|
+
[TYPE_INT64, wideIntegerGuardFor(INT64_MINIMUM, INT64_MAXIMUM)],
|
|
76
|
+
[TYPE_UINT64, wideIntegerGuardFor(0n, UINT64_MAXIMUM)],
|
|
77
|
+
[TYPE_FLOAT, isFloatValue],
|
|
78
|
+
[TYPE_DOUBLE, isDoubleValue],
|
|
79
|
+
[TYPE_POINTER, isNullValue],
|
|
80
|
+
]);
|
|
81
|
+
|
|
82
|
+
const layout = { wasChecked: false };
|
|
83
|
+
const paramValueValidate = bind(LIB, "g_param_value_validate", [PARAM_T, VALUE_T], booleanT);
|
|
84
|
+
const paramSpecUnref = bind(LIB, "g_param_spec_unref", [PARAM_T], voidT);
|
|
85
|
+
const paramSpecRefSink = bind(LIB, "g_param_spec_ref_sink", [PARAM_T], PARAM_T);
|
|
86
|
+
|
|
87
|
+
const newParamSpecBoolean = bind(
|
|
88
|
+
LIB,
|
|
89
|
+
"g_param_spec_boolean",
|
|
90
|
+
[stringT("borrowed"), stringT("borrowed"), stringT("borrowed"), booleanT, uint32T],
|
|
91
|
+
PARAM_T,
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const getParamFlags = (pspec: ExternalObject<Handle>): number => read(pspec, uint32T, FLAGS_BYTE_OFFSET) as number;
|
|
95
|
+
|
|
96
|
+
const getParamValueType = (pspec: ExternalObject<Handle>): bigint =>
|
|
97
|
+
read(pspec, biguint64T, VALUE_TYPE_BYTE_OFFSET) as bigint;
|
|
98
|
+
|
|
99
|
+
const isParamWritable = (flags: number): boolean => (flags & PARAM_WRITABLE) !== 0;
|
|
100
|
+
const isParamConstructOnly = (flags: number): boolean => (flags & PARAM_CONSTRUCT_ONLY) !== 0;
|
|
101
|
+
const isParamLaxlyValidated = (flags: number): boolean => (flags & PARAM_LAX_VALIDATION) !== 0;
|
|
102
|
+
|
|
103
|
+
const wasParamValueModified = (pspec: ExternalObject<Handle>, value: ExternalObject<Handle>): boolean =>
|
|
104
|
+
paramValueValidate(pspec, value) as boolean;
|
|
105
|
+
|
|
106
|
+
function isBooleanValue(value: unknown): boolean {
|
|
107
|
+
return typeof value === "boolean";
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function isStringValue(value: unknown): boolean {
|
|
111
|
+
return value == null || typeof value === "string";
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function isStrvValue(value: unknown): boolean {
|
|
115
|
+
return value == null || (Array.isArray(value) && value.every((item) => typeof item === "string"));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function isDoubleValue(value: unknown): boolean {
|
|
119
|
+
return value == null || (typeof value === "number" && Number.isFinite(value));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function isFloatValue(value: unknown): boolean {
|
|
123
|
+
return isDoubleValue(value) && (value == null || Math.abs(value as number) <= FLOAT_MAXIMUM);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function isAnyValue(): boolean {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function isNullValue(value: unknown): boolean {
|
|
131
|
+
return value == null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function isIntegerWithin(value: unknown, minimum: number, maximum: number): boolean {
|
|
135
|
+
return Number.isSafeInteger(value) && (value as number) >= minimum && (value as number) <= maximum;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function integerGuardFor(minimum: number, maximum: number): ValueGuard {
|
|
139
|
+
return (value) => value == null || isIntegerWithin(value, minimum, maximum);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function toWideInteger(value: unknown): bigint | undefined {
|
|
143
|
+
if (typeof value === "bigint") {
|
|
144
|
+
return value;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return Number.isSafeInteger(value) ? BigInt(value as number) : undefined;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function wideIntegerGuardFor(minimum: bigint, maximum: bigint): ValueGuard {
|
|
151
|
+
return (value) => {
|
|
152
|
+
if (value == null) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const wide = toWideInteger(value);
|
|
157
|
+
|
|
158
|
+
return wide !== undefined && wide >= minimum && wide <= maximum;
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function resolveGtype(value: unknown): bigint {
|
|
163
|
+
const instanceType = getInstanceType(value as object);
|
|
164
|
+
|
|
165
|
+
if (instanceType !== TYPE_INVALID) {
|
|
166
|
+
return instanceType;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return isTypedClass(value) ? value.__type__ : TYPE_INVALID;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function wrappedGuardFor(valueType: bigint): ValueGuard {
|
|
173
|
+
return (value) => value == null || typeIsA(resolveGtype(value), valueType);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function valueGuardFor(valueType: bigint): ValueGuard {
|
|
177
|
+
assertParamLayout();
|
|
178
|
+
|
|
179
|
+
if (valueType === getStrvType()) {
|
|
180
|
+
return isStrvValue;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const fundamental = typeFundamental(valueType);
|
|
184
|
+
|
|
185
|
+
if (WRAPPED_FUNDAMENTALS.has(fundamental)) {
|
|
186
|
+
return wrappedGuardFor(valueType);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return SCALAR_GUARDS.get(fundamental) ?? isAnyValue;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function readProbeLayout(flags: number): ParamLayout {
|
|
193
|
+
const probe = newParamSpecBoolean(LAYOUT_PROBE_NAME, null, null, false, flags) as ExternalObject<Handle>;
|
|
194
|
+
paramSpecRefSink(probe);
|
|
195
|
+
|
|
196
|
+
try {
|
|
197
|
+
return { flags: getParamFlags(probe), valueType: getParamValueType(probe) };
|
|
198
|
+
} finally {
|
|
199
|
+
paramSpecUnref(probe);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function isLayoutIntact(flags: number): boolean {
|
|
204
|
+
const layout = readProbeLayout(flags);
|
|
205
|
+
|
|
206
|
+
return (layout.flags & READ_FLAGS) === flags && layout.valueType === TYPE_BOOLEAN;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function assertParamLayout(): void {
|
|
210
|
+
if (layout.wasChecked) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
layout.wasChecked = true;
|
|
215
|
+
const readWrite = PARAM_READABLE | PARAM_WRITABLE;
|
|
216
|
+
|
|
217
|
+
if (isLayoutIntact(readWrite) && isLayoutIntact(readWrite | PARAM_CONSTRUCT_ONLY | PARAM_LAX_VALIDATION)) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
throw new Error(
|
|
222
|
+
"GParamSpec does not match the memory layout this build reads a property's flags and value type at",
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export {
|
|
227
|
+
getParamFlags,
|
|
228
|
+
getParamValueType,
|
|
229
|
+
isParamConstructOnly,
|
|
230
|
+
isParamLaxlyValidated,
|
|
231
|
+
isParamWritable,
|
|
232
|
+
type ValueGuard,
|
|
233
|
+
valueGuardFor,
|
|
234
|
+
wasParamValueModified,
|
|
235
|
+
};
|
package/src/promisify.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getHandle } from "./registry.js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Extracts the
|
|
5
|
-
*
|
|
6
|
-
* @template R - The async result type passed to the completion callback.
|
|
7
|
-
* @template T - The finished value type.
|
|
4
|
+
* Extracts the value of a completed asynchronous operation from its `GAsyncResult`, throwing when
|
|
5
|
+
* the operation failed.
|
|
8
6
|
*/
|
|
9
7
|
type FinishResult<R extends object, T> = (result: R) => T;
|
|
10
8
|
|
|
@@ -57,11 +55,13 @@ const promisify = <R extends object, T>(
|
|
|
57
55
|
): Promise<T> =>
|
|
58
56
|
new Promise<T>((resolve, reject) => {
|
|
59
57
|
const creationStack =
|
|
60
|
-
process.env.NODE_ENV === "production" ? undefined : new Error("
|
|
58
|
+
process.env.NODE_ENV === "production" ? undefined : new Error("GTKX async operation started here");
|
|
59
|
+
|
|
60
|
+
const cancellableHandle = cancellable == null ? null : getHandle(cancellable);
|
|
61
61
|
|
|
62
|
-
asyncFn(...leading,
|
|
62
|
+
asyncFn(...leading, cancellableHandle, (_source: object | null, asyncResult: object) => {
|
|
63
63
|
settle({ finish, creationStack, resolve, reject }, asyncResult);
|
|
64
64
|
});
|
|
65
65
|
});
|
|
66
66
|
|
|
67
|
-
export { promisify
|
|
67
|
+
export { promisify };
|